From 60be0193b07d11348f01d45eb23aa0ab64494c44 Mon Sep 17 00:00:00 2001 From: phf Date: Mon, 26 Jan 2015 17:21:35 +0100 Subject: [PATCH 001/287] [CORE] Initialisation global du module askpricesupplier (#new_ask_price). --- htdocs/comm/askpricesupplier/apercu.php | 221 ++ .../class/askpricesupplier.class.php | 3211 +++++++++++++++++ htdocs/comm/askpricesupplier/class/index.html | 0 htdocs/comm/askpricesupplier/contact.php | 223 ++ htdocs/comm/askpricesupplier/document.php | 144 + htdocs/comm/askpricesupplier/index.php | 528 +++ htdocs/comm/askpricesupplier/info.php | 65 + htdocs/comm/askpricesupplier/list.php | 464 +++ htdocs/comm/askpricesupplier/note.php | 151 + htdocs/comm/askpricesupplier/tpl/index.html | 0 .../tpl/linkedobjectblock.tpl.php | 79 + .../modules/modAskPriceSupplier.class.php | 226 ++ htdocs/langs/fr_FR/askpricesupplier.lang | 6 + .../eldy/img/object_askpricesupplier.png | Bin 0 -> 1038 bytes 14 files changed, 5318 insertions(+) create mode 100644 htdocs/comm/askpricesupplier/apercu.php create mode 100644 htdocs/comm/askpricesupplier/class/askpricesupplier.class.php create mode 100644 htdocs/comm/askpricesupplier/class/index.html create mode 100644 htdocs/comm/askpricesupplier/contact.php create mode 100644 htdocs/comm/askpricesupplier/document.php create mode 100644 htdocs/comm/askpricesupplier/index.php create mode 100644 htdocs/comm/askpricesupplier/info.php create mode 100644 htdocs/comm/askpricesupplier/list.php create mode 100644 htdocs/comm/askpricesupplier/note.php create mode 100644 htdocs/comm/askpricesupplier/tpl/index.html create mode 100644 htdocs/comm/askpricesupplier/tpl/linkedobjectblock.tpl.php create mode 100644 htdocs/core/modules/modAskPriceSupplier.class.php create mode 100644 htdocs/langs/fr_FR/askpricesupplier.lang create mode 100644 htdocs/theme/eldy/img/object_askpricesupplier.png diff --git a/htdocs/comm/askpricesupplier/apercu.php b/htdocs/comm/askpricesupplier/apercu.php new file mode 100644 index 00000000000..87281e7ea63 --- /dev/null +++ b/htdocs/comm/askpricesupplier/apercu.php @@ -0,0 +1,221 @@ + + * Copyright (C) 2004 Eric Seigne + * Copyright (C) 2004-2007 Laurent Destailleur + * Copyright (C) 2005-2012 Regis Houssin + * Copyright (C) 2011 Juanjo Menent + * Copyright (C) 2014 Frederic France + * + * 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 3 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, see . + */ + +/** + * \file htdocs/comm/propal/apercu.php + * \ingroup propal + * \brief Preview tab of propal + */ + +require '../../main.inc.php'; +require_once DOL_DOCUMENT_ROOT.'/comm/propal/class/propal.class.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/propal.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php'; + +$langs->load('propal'); +$langs->load("bills"); +$langs->load('compta'); + +// Security check +$socid=0; +$id = GETPOST('id','int'); +$ref = GETPOST("ref"); +if ($user->societe_id) $socid=$user->societe_id; +$result = restrictedArea($user, 'propal', $id); + + +/* + * View Mode + */ + +llxHeader(); + + +if ($id > 0 || ! empty($ref)) +{ + $object = new Propal($db); + + if ($object->fetch($id,$ref) > 0) + { + $soc = new Societe($db); + $soc->fetch($object->socid); + + $head = propal_prepare_head($object); + dol_fiche_head($head, 'preview', $langs->trans('Proposal'), 0, 'propal'); + + + /* + * Propal + */ + print ''; + + // Ref + print ''; + print ''; + print ''; + + // Ref client + print ''; + print ''; + print ''; + + + // Thirdparty + print ''; + print ''; + print ''; + + // Status + print ''; + print ''; + print ''; + + // Discount + print ''; + print ''; + + // Date + print ''; + print ''; + + // Right part with $rowspan lines + $rowspan=4; + print ''; + print ''; + + // Total HT - left part + print ''; + print ''; + print ''; + + // Total VAT - left part + print ''; + print ''; + print ''; + + // Total TTC - left part + print ''; + print ''; + print ''; + + print '
'.$langs->trans('Ref').''.$object->ref.'
'.$langs->trans('RefCustomer').''.$object->ref_client.'
'.$langs->trans('Company').''.$soc->getNomUrl(1).'
'.$langs->trans("Status").''.$object->getLibStatut(4).'
'.$langs->trans('Discounts').''; + if ($soc->remise_percent) print $langs->trans("CompanyHasRelativeDiscount",$soc->remise_percent); + else print $langs->trans("CompanyHasNoRelativeDiscount"); + $absolute_discount=$soc->getAvailableDiscounts(); + print '. '; + if ($absolute_discount) print $langs->trans("CompanyHasAbsoluteDiscount",$absolute_discount,$langs->trans("Currency".$conf->currency)); + else print $langs->trans("CompanyHasNoAbsoluteDiscount"); + print '.
'.$langs->trans('Date').''.dol_print_date($object->date,'daytext').''; + + /* + * Documents + */ + $objectref = dol_sanitizeFileName($object->ref); + $dir_output = $conf->propal->dir_output . "/"; + $filepath = $dir_output . $objectref . "/"; + $file = $filepath . $objectref . ".pdf"; + $filedetail = $filepath . $objectref . "-detail.pdf"; + $relativepath = $objectref.'/'.$objectref.'.pdf'; + $relativepathdetail = $objectref.'/'.$objectref.'-detail.pdf'; + + // Define path to preview pdf file (preview precompiled "file.ext" are "file.ext_preview.png") + $fileimage = $file.'_preview.png'; // If PDF has 1 page + $fileimagebis = $file.'_preview-0.pdf.png'; // If PDF has more than one page + $relativepathimage = $relativepath.'_preview.png'; + + $var=true; + + // Si fichier PDF existe + if (file_exists($file)) + { + $encfile = urlencode($file); + print ''; + print ''; + + print ''; + + print ''; + + print ''; + print ''; + print ''; + + print "
'.$langs->trans("Documents").'
'.$langs->trans("Proposal").' PDF'.$object->ref.'.pdf'.dol_print_size(dol_filesize($file)).''.dol_print_date(dol_filemtime($file),'dayhour').'
\n"; + + // Conversion du PDF en image png si fichier png non existant + if (! file_exists($fileimage) && ! file_exists($fileimagebis)) + { + if (class_exists("Imagick")) + { + $ret = dol_convert_file($file,'png',$fileimage); + if ($ret < 0) $error++; + } + else + { + $langs->load("errors"); + print ''.$langs->trans("ErrorNoImagickReadimage").''; + } + } + } + + print '
'.$langs->trans('AmountHT').'' . price($object->total_ht, '', $langs, 0, - 1, - 1, $conf->currency) . '
'.$langs->trans('AmountVAT').'' . price($object->total_tva, '', $langs, 0, - 1, - 1, $conf->currency) . '
'.$langs->trans('AmountTTC').'' . price($object->total_ttc, '', $langs, 0, - 1, - 1, $conf->currency) . '
'; + + dol_fiche_end(); + } + else + { + // Propal non trouvee + print $langs->trans("ErrorPropalNotFound",$_GET["id"]); + } +} + +print ''; +print ''; +print '
'; +print '
'; +// Si fichier png PDF d'1 page trouve +if (file_exists($fileimage)) +{ + print ''; +} +// Si fichier png PDF de plus d'1 page trouve +elseif (file_exists($fileimagebis)) +{ + $multiple = preg_replace('/\.png/','',$relativepath) . "-"; + + for ($i = 0; $i < 20; $i++) + { + $preview = $multiple.$i.'.png'; + + if (file_exists($dir_output.$preview)) + { + print '

'; + } + } +} +print '

'; +print '
'; + + +llxFooter(); + +$db->close(); diff --git a/htdocs/comm/askpricesupplier/class/askpricesupplier.class.php b/htdocs/comm/askpricesupplier/class/askpricesupplier.class.php new file mode 100644 index 00000000000..f68a1f4f708 --- /dev/null +++ b/htdocs/comm/askpricesupplier/class/askpricesupplier.class.php @@ -0,0 +1,3211 @@ + + * Copyright (C) 2004 Eric Seigne + * Copyright (C) 2004-2011 Laurent Destailleur + * Copyright (C) 2005 Marc Barilley + * Copyright (C) 2005-2013 Regis Houssin + * Copyright (C) 2006 Andre Cianfarani + * Copyright (C) 2008 Raphael Bertrand + * Copyright (C) 2010-2014 Juanjo Menent + * Copyright (C) 2010-2011 Philippe Grand + * Copyright (C) 2012-2014 Christophe Battarel + * Copyright (C) 2013 Florian Henry + * Copyright (C) 2014 Marcos García + * + * 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 3 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, see . + */ + +/** + * \file htdocs/comm/propal/class/propal.class.php + * \brief File of class to manage proposals + */ + +require_once DOL_DOCUMENT_ROOT .'/core/class/commonobject.class.php'; +require_once DOL_DOCUMENT_ROOT .'/product/class/product.class.php'; +require_once DOL_DOCUMENT_ROOT .'/contact/class/contact.class.php'; +require_once DOL_DOCUMENT_ROOT .'/margin/lib/margins.lib.php'; + +/** + * Class to manage proposals + */ +class Propal extends CommonObject +{ + public $element='propal'; + public $table_element='propal'; + public $table_element_line='propaldet'; + public $fk_element='fk_propal'; + protected $ismultientitymanaged = 1; // 0=No test on entity, 1=Test with field entity, 2=Test with link by societe + + /** + * {@inheritdoc} + */ + protected $table_ref_field = 'ref'; + + var $id; + + var $socid; // Id client + var $client; // Objet societe client (a charger par fetch_client) + + var $contactid; + var $fk_project; + var $author; + var $ref; + var $ref_client; + var $statut; // 0 (draft), 1 (validated), 2 (signed), 3 (not signed), 4 (billed) + var $datec; // Date of creation + var $datev; // Date of validation + var $date; // Date of proposal + var $datep; // Same than date + var $date_livraison; + var $fin_validite; + + var $user_author_id; + var $user_valid_id; + var $user_close_id; + + var $total_ht; // Total net of tax + var $total_tva; // Total VAT + var $total_localtax1; // Total Local Taxes 1 + var $total_localtax2; // Total Local Taxes 2 + var $total_ttc; // Total with tax + var $price; // deprecated (for compatibility) + var $tva; // deprecated (for compatibility) + var $total; // deprecated (for compatibility) + + var $cond_reglement_id; + var $cond_reglement_code; + var $fk_account; // Id of bank account + var $mode_reglement_id; + var $mode_reglement_code; + var $remise; + var $remise_percent; + var $remise_absolue; + var $note; // deprecated (for compatibility) + var $note_private; + var $note_public; + var $fk_delivery_address; // deprecated (for compatibility) + var $fk_address; + var $address_type; + var $address; + var $shipping_method_id; + var $availability_id; + var $availability_code; + var $demand_reason_id; + var $demand_reason_code; + + var $products=array(); + var $extraparams=array(); + + var $lines = array(); + var $line; + + var $origin; + var $origin_id; + + var $labelstatut=array(); + var $labelstatut_short=array(); + + // Pour board + var $nbtodo; + var $nbtodolate; + + var $specimen; + + + /** + * Constructor + * + * @param DoliDB $db Database handler + * @param int $socid Id third party + * @param int $propalid Id proposal + */ + function __construct($db, $socid="", $propalid=0) + { + global $conf,$langs; + + $this->db = $db; + $this->socid = $socid; + $this->id = $propalid; + $this->products = array(); + $this->remise = 0; + $this->remise_percent = 0; + $this->remise_absolue = 0; + + $this->duree_validite=$conf->global->PROPALE_VALIDITY_DURATION; + + $langs->load("propal"); + $this->labelstatut[0]=(! empty($conf->global->PROPAL_STATUS_DRAFT_LABEL) ? $conf->global->PROPAL_STATUS_DRAFT_LABEL : $langs->trans("PropalStatusDraft")); + $this->labelstatut[1]=(! empty($conf->global->PROPAL_STATUS_VALIDATED_LABEL) ? $conf->global->PROPAL_STATUS_VALIDATED_LABEL : $langs->trans("PropalStatusValidated")); + $this->labelstatut[2]=(! empty($conf->global->PROPAL_STATUS_SIGNED_LABEL) ? $conf->global->PROPAL_STATUS_SIGNED_LABEL : $langs->trans("PropalStatusSigned")); + $this->labelstatut[3]=(! empty($conf->global->PROPAL_STATUS_NOTSIGNED_LABEL) ? $conf->global->PROPAL_STATUS_NOTSIGNED_LABEL : $langs->trans("PropalStatusNotSigned")); + $this->labelstatut[4]=(! empty($conf->global->PROPAL_STATUS_BILLED_LABEL) ? $conf->global->PROPAL_STATUS_BILLED_LABEL : $langs->trans("PropalStatusBilled")); + $this->labelstatut_short[0]=(! empty($conf->global->PROPAL_STATUS_DRAFTSHORT_LABEL) ? $conf->global->PROPAL_STATUS_DRAFTSHORT_LABEL : $langs->trans("PropalStatusDraftShort")); + $this->labelstatut_short[1]=(! empty($conf->global->PROPAL_STATUS_VALIDATEDSHORT_LABEL) ? $conf->global->PROPAL_STATUS_VALIDATEDSHORT_LABEL : $langs->trans("Opened")); + $this->labelstatut_short[2]=(! empty($conf->global->PROPAL_STATUS_SIGNEDSHORT_LABEL) ? $conf->global->PROPAL_STATUS_SIGNEDSHORT_LABEL : $langs->trans("PropalStatusSignedShort")); + $this->labelstatut_short[3]=(! empty($conf->global->PROPAL_STATUS_NOTSIGNEDSHORT_LABEL) ? $conf->global->PROPAL_STATUS_NOTSIGNEDSHORT_LABEL : $langs->trans("PropalStatusNotSignedShort")); + $this->labelstatut_short[4]=(! empty($conf->global->PROPAL_STATUS_BILLEDSHORT_LABEL) ? $conf->global->PROPAL_STATUS_BILLEDSHORT_LABEL : $langs->trans("PropalStatusBilledShort")); + } + + + /** + * Add line into array products + * $this->client doit etre charge + * + * @param int $idproduct Product Id to add + * @param int $qty Quantity + * @param int $remise_percent Discount effected on Product + * @return int <0 if KO, >0 if OK + * + * TODO Remplacer les appels a cette fonction par generation objet Ligne + * insere dans tableau $this->products + */ + function add_product($idproduct, $qty, $remise_percent=0) + { + global $conf, $mysoc; + + if (! $qty) $qty = 1; + + dol_syslog(get_class($this)."::add_product $idproduct, $qty, $remise_percent"); + if ($idproduct > 0) + { + $prod=new Product($this->db); + $prod->fetch($idproduct); + + $productdesc = $prod->description; + + $tva_tx = get_default_tva($mysoc,$this->client,$prod->id); + // local taxes + $localtax1_tx = get_default_localtax($mysoc,$this->client,1,$prod->tva_tx); + $localtax2_tx = get_default_localtax($mysoc,$this->client,2,$prod->tva_tx); + + // multiprix + if($conf->global->PRODUIT_MULTIPRICES && $this->client->price_level) + { + $price = $prod->multiprices[$this->client->price_level]; + } + else + { + $price = $prod->price; + } + + $line = new PropaleLigne($this->db); + + $line->fk_product=$idproduct; + $line->desc=$productdesc; + $line->qty=$qty; + $line->subprice=$price; + $line->remise_percent=$remise_percent; + $line->tva_tx=$tva_tx; + + $this->lines[]=$line; + } + } + + /** + * Adding line of fixed discount in the proposal in DB + * + * @param int $idremise Id of fixed discount + * @return int >0 if OK, <0 if KO + */ + function insert_discount($idremise) + { + global $langs; + + include_once DOL_DOCUMENT_ROOT.'/core/lib/price.lib.php'; + include_once DOL_DOCUMENT_ROOT.'/core/class/discount.class.php'; + + $this->db->begin(); + + $remise=new DiscountAbsolute($this->db); + $result=$remise->fetch($idremise); + + if ($result > 0) + { + if ($remise->fk_facture) // Protection against multiple submission + { + $this->error=$langs->trans("ErrorDiscountAlreadyUsed"); + $this->db->rollback(); + return -5; + } + + $propalligne=new PropaleLigne($this->db); + $propalligne->fk_propal=$this->id; + $propalligne->fk_remise_except=$remise->id; + $propalligne->desc=$remise->description; // Description ligne + $propalligne->tva_tx=$remise->tva_tx; + $propalligne->subprice=-$remise->amount_ht; + $propalligne->fk_product=0; // Id produit predefini + $propalligne->qty=1; + $propalligne->remise=0; + $propalligne->remise_percent=0; + $propalligne->rang=-1; + $propalligne->info_bits=2; + + // TODO deprecated + $propalligne->price=-$remise->amount_ht; + + $propalligne->total_ht = -$remise->amount_ht; + $propalligne->total_tva = -$remise->amount_tva; + $propalligne->total_ttc = -$remise->amount_ttc; + + $result=$propalligne->insert(); + if ($result > 0) + { + $result=$this->update_price(1); + if ($result > 0) + { + $this->db->commit(); + return 1; + } + else + { + $this->db->rollback(); + return -1; + } + } + else + { + $this->error=$propalligne->error; + $this->db->rollback(); + return -2; + } + } + else + { + $this->db->rollback(); + return -2; + } + } + + /** + * Add a proposal line into database (linked to product/service or not) + * Les parametres sont deja cense etre juste et avec valeurs finales a l'appel + * de cette methode. Aussi, pour le taux tva, il doit deja avoir ete defini + * par l'appelant par la methode get_default_tva(societe_vendeuse,societe_acheteuse,'',produit) + * et le desc doit deja avoir la bonne valeur (a l'appelant de gerer le multilangue) + * + * @param string $desc Description de la ligne + * @param double $pu_ht Prix unitaire + * @param double $qty Quantite + * @param double $txtva Taux de tva + * @param double $txlocaltax1 Local tax 1 rate + * @param double $txlocaltax2 Local tax 2 rate + * @param int $fk_product Id du produit/service predefini + * @param double $remise_percent Pourcentage de remise de la ligne + * @param string $price_base_type HT or TTC + * @param double $pu_ttc Prix unitaire TTC + * @param int $info_bits Bits de type de lignes + * @param int $type Type of line (product, service) + * @param int $rang Position of line + * @param int $special_code Special code (also used by externals modules!) + * @param int $fk_parent_line Id of parent line + * @param int $fk_fournprice Id supplier price + * @param int $pa_ht Buying price without tax + * @param string $label ??? + * @param int $date_start Start date of the line + * @param int $date_end End date of the line + * @param array $array_option extrafields array + * @return int >0 if OK, <0 if KO + * + * @see add_product + */ + function addline($desc, $pu_ht, $qty, $txtva, $txlocaltax1=0, $txlocaltax2=0, $fk_product=0, $remise_percent=0, $price_base_type='HT', $pu_ttc=0, $info_bits=0, $type=0, $rang=-1, $special_code=0, $fk_parent_line=0, $fk_fournprice=0, $pa_ht=0, $label='',$date_start='', $date_end='',$array_option=0) + { + global $mysoc; + + dol_syslog(get_class($this)."::addline propalid=$this->id, desc=$desc, pu_ht=$pu_ht, qty=$qty, txtva=$txtva, fk_product=$fk_product, remise_except=$remise_percent, price_base_type=$price_base_type, pu_ttc=$pu_ttc, info_bits=$info_bits, type=$type"); + include_once DOL_DOCUMENT_ROOT.'/core/lib/price.lib.php'; + + // Clean parameters + if (empty($remise_percent)) $remise_percent=0; + if (empty($qty)) $qty=0; + if (empty($info_bits)) $info_bits=0; + if (empty($rang)) $rang=0; + if (empty($fk_parent_line) || $fk_parent_line < 0) $fk_parent_line=0; + + $remise_percent=price2num($remise_percent); + $qty=price2num($qty); + $pu_ht=price2num($pu_ht); + $pu_ttc=price2num($pu_ttc); + $txtva=price2num($txtva); + $txlocaltax1=price2num($txlocaltax1); + $txlocaltax2=price2num($txlocaltax2); + $pa_ht=price2num($pa_ht); + if ($price_base_type=='HT') + { + $pu=$pu_ht; + } + else + { + $pu=$pu_ttc; + } + + // Check parameters + if ($type < 0) return -1; + + if ($this->statut == 0) + { + $this->db->begin(); + + // Calcul du total TTC et de la TVA pour la ligne a partir de + // qty, pu, remise_percent et txtva + // TRES IMPORTANT: C'est au moment de l'insertion ligne qu'on doit stocker + // la part ht, tva et ttc, et ce au niveau de la ligne qui a son propre taux tva. + + $localtaxes_type=getLocalTaxesFromRate($txtva,0,$this->thirdparty,$mysoc); + + $tabprice=calcul_price_total($qty, $pu, $remise_percent, $txtva, $txlocaltax1, $txlocaltax2, 0, $price_base_type, $info_bits, $type, '', $localtaxes_type); + $total_ht = $tabprice[0]; + $total_tva = $tabprice[1]; + $total_ttc = $tabprice[2]; + $total_localtax1 = $tabprice[9]; + $total_localtax2 = $tabprice[10]; + + // Rang to use + $rangtouse = $rang; + if ($rangtouse == -1) + { + $rangmax = $this->line_max($fk_parent_line); + $rangtouse = $rangmax + 1; + } + + // TODO A virer + // Anciens indicateurs: $price, $remise (a ne plus utiliser) + $price = $pu; + $remise = 0; + if ($remise_percent > 0) + { + $remise = round(($pu * $remise_percent / 100), 2); + $price = $pu - $remise; + } + + // Insert line + $this->line=new PropaleLigne($this->db); + + $this->line->fk_propal=$this->id; + $this->line->label=$label; + $this->line->desc=$desc; + $this->line->qty=$qty; + $this->line->tva_tx=$txtva; + $this->line->localtax1_tx=$txlocaltax1; + $this->line->localtax2_tx=$txlocaltax2; + $this->line->localtax1_type = $localtaxes_type[0]; + $this->line->localtax2_type = $localtaxes_type[2]; + $this->line->fk_product=$fk_product; + $this->line->remise_percent=$remise_percent; + $this->line->subprice=$pu_ht; + $this->line->rang=$rangtouse; + $this->line->info_bits=$info_bits; + $this->line->total_ht=$total_ht; + $this->line->total_tva=$total_tva; + $this->line->total_localtax1=$total_localtax1; + $this->line->total_localtax2=$total_localtax2; + $this->line->total_ttc=$total_ttc; + $this->line->product_type=$type; + $this->line->special_code=$special_code; + $this->line->fk_parent_line=$fk_parent_line; + + $this->line->date_start=$date_start; + $this->line->date_end=$date_end; + + + // infos marge + if (!empty($fk_product) && empty($fk_fournprice) && empty($pa_ht)) { + // by external module, take lowest buying price + include_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.product.class.php'; + $productFournisseur = new ProductFournisseur($this->db); + $productFournisseur->find_min_price_product_fournisseur($fk_product); + $this->line->fk_fournprice = $productFournisseur->product_fourn_price_id; + } else { + $this->line->fk_fournprice = $fk_fournprice; + } + $this->line->pa_ht = $pa_ht; + + // Mise en option de la ligne + if (empty($qty) && empty($special_code)) $this->line->special_code=3; + + // TODO deprecated + $this->line->price=$price; + $this->line->remise=$remise; + + if (is_array($array_option) && count($array_option)>0) { + $this->line->array_options=$array_option; + } + + $result=$this->line->insert(); + if ($result > 0) + { + // Reorder if child line + if (! empty($fk_parent_line)) $this->line_order(true,'DESC'); + + // Mise a jour informations denormalisees au niveau de la propale meme + $result=$this->update_price(1,'auto'); // This method is designed to add line from user input so total calculation must be done using 'auto' mode. + if ($result > 0) + { + $this->db->commit(); + return $this->line->rowid; + } + else + { + $this->error=$this->db->error(); + $this->db->rollback(); + return -1; + } + } + else + { + $this->error=$this->line->error; + $this->db->rollback(); + return -2; + } + } + } + + + /** + * Update a proposal line + * + * @param int $rowid Id de la ligne + * @param double $pu Prix unitaire (HT ou TTC selon price_base_type) + * @param double $qty Quantity + * @param double $remise_percent Remise effectuee sur le produit + * @param double $txtva Taux de TVA + * @param double $txlocaltax1 Local tax 1 rate + * @param double $txlocaltax2 Local tax 2 rate + * @param string $desc Description + * @param double $price_base_type HT ou TTC + * @param int $info_bits Miscellaneous informations + * @param int $special_code Special code (also used by externals modules!) + * @param int $fk_parent_line Id of parent line (0 in most cases, used by modules adding sublevels into lines). + * @param int $skip_update_total Keep fields total_xxx to 0 (used for special lines by some modules) + * @param int $fk_fournprice Id of origin supplier price + * @param int $pa_ht Price (without tax) of product when it was bought + * @param string $label ??? + * @param int $type 0/1=Product/service + * @param int $date_start Start date of the line + * @param int $date_end End date of the line + * @param array $array_option extrafields array + * @return int 0 if OK, <0 if KO + */ + function updateline($rowid, $pu, $qty, $remise_percent, $txtva, $txlocaltax1=0, $txlocaltax2=0, $desc='', $price_base_type='HT', $info_bits=0, $special_code=0, $fk_parent_line=0, $skip_update_total=0, $fk_fournprice=0, $pa_ht=0, $label='', $type=0, $date_start='', $date_end='', $array_option=0) + { + global $conf,$user,$langs, $mysoc; + + dol_syslog(get_class($this)."::updateLine $rowid, $pu, $qty, $remise_percent, $txtva, $desc, $price_base_type, $info_bits"); + include_once DOL_DOCUMENT_ROOT.'/core/lib/price.lib.php'; + + // Clean parameters + $remise_percent=price2num($remise_percent); + $qty=price2num($qty); + $pu = price2num($pu); + $txtva = price2num($txtva); + $txlocaltax1=price2num($txlocaltax1); + $txlocaltax2=price2num($txlocaltax2); + $pa_ht=price2num($pa_ht); + if (empty($qty) && empty($special_code)) $special_code=3; // Set option tag + if (! empty($qty) && $special_code == 3) $special_code=0; // Remove option tag + + if ($this->statut == 0) + { + $this->db->begin(); + + // Calcul du total TTC et de la TVA pour la ligne a partir de + // qty, pu, remise_percent et txtva + // TRES IMPORTANT: C'est au moment de l'insertion ligne qu'on doit stocker + // la part ht, tva et ttc, et ce au niveau de la ligne qui a son propre taux tva. + + $localtaxes_type=getLocalTaxesFromRate($txtva,0,$this->thirdparty,$mysoc); + + $tabprice=calcul_price_total($qty, $pu, $remise_percent, $txtva, $txlocaltax1, $txlocaltax2, 0, $price_base_type, $info_bits, $type,'', $localtaxes_type); + $total_ht = $tabprice[0]; + $total_tva = $tabprice[1]; + $total_ttc = $tabprice[2]; + $total_localtax1 = $tabprice[9]; + $total_localtax2 = $tabprice[10]; + + // Anciens indicateurs: $price, $remise (a ne plus utiliser) + $price = $pu; + if ($remise_percent > 0) + { + $remise = round(($pu * $remise_percent / 100), 2); + $price = $pu - $remise; + } + + // Update line + $this->line=new PropaleLigne($this->db); + + // Stock previous line records + $staticline=new PropaleLigne($this->db); + $staticline->fetch($rowid); + $this->line->oldline = $staticline; + + // Reorder if fk_parent_line change + if (! empty($fk_parent_line) && ! empty($staticline->fk_parent_line) && $fk_parent_line != $staticline->fk_parent_line) + { + $rangmax = $this->line_max($fk_parent_line); + $this->line->rang = $rangmax + 1; + } + + $this->line->rowid = $rowid; + $this->line->label = $label; + $this->line->desc = $desc; + $this->line->qty = $qty; + $this->line->product_type = $type; + $this->line->tva_tx = $txtva; + $this->line->localtax1_tx = $txlocaltax1; + $this->line->localtax2_tx = $txlocaltax2; + $this->line->localtax1_type = $localtaxes_type[0]; + $this->line->localtax2_type = $localtaxes_type[2]; + $this->line->remise_percent = $remise_percent; + $this->line->subprice = $pu; + $this->line->info_bits = $info_bits; + $this->line->total_ht = $total_ht; + $this->line->total_tva = $total_tva; + $this->line->total_localtax1 = $total_localtax1; + $this->line->total_localtax2 = $total_localtax2; + $this->line->total_ttc = $total_ttc; + $this->line->special_code = $special_code; + $this->line->fk_parent_line = $fk_parent_line; + $this->line->skip_update_total = $skip_update_total; + + // infos marge + if (!empty($fk_product) && empty($fk_fournprice) && empty($pa_ht)) { + // by external module, take lowest buying price + include_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.product.class.php'; + $productFournisseur = new ProductFournisseur($this->db); + $productFournisseur->find_min_price_product_fournisseur($fk_product); + $this->line->fk_fournprice = $productFournisseur->product_fourn_price_id; + } else { + $this->line->fk_fournprice = $fk_fournprice; + } + $this->line->pa_ht = $pa_ht; + + $this->line->date_start=$date_start; + $this->line->date_end=$date_end; + + // TODO deprecated + $this->line->price=$price; + $this->line->remise=$remise; + + if (is_array($array_option) && count($array_option)>0) { + $this->line->array_options=$array_option; + } + + $result=$this->line->update(); + if ($result > 0) + { + // Reorder if child line + if (! empty($fk_parent_line)) $this->line_order(true,'DESC'); + + $this->update_price(1); + + $this->fk_propal = $this->id; + $this->rowid = $rowid; + + $this->db->commit(); + return $result; + } + else + { + $this->error=$this->db->error(); + $this->db->rollback(); + return -1; + } + } + else + { + dol_syslog(get_class($this)."::updateline Erreur -2 Propal en mode incompatible pour cette action"); + return -2; + } + } + + + /** + * Delete detail line + * + * @param int $lineid Id of line to delete + * @return int >0 if OK, <0 if KO + */ + function deleteline($lineid) + { + if ($this->statut == 0) + { + $line=new PropaleLigne($this->db); + + // For triggers + $line->fetch($lineid); + + if ($line->delete() > 0) + { + $this->update_price(1); + + return 1; + } + else + { + return -1; + } + } + else + { + return -2; + } + } + + + /** + * Create commercial proposal into database + * this->ref can be set or empty. If empty, we will use "(PROVid)" + * + * @param User $user User that create + * @param int $notrigger 1=Does not execute triggers, 0= execuete triggers + * @return int <0 if KO, >=0 if OK + */ + function create($user, $notrigger=0) + { + global $langs,$conf,$mysoc,$hookmanager; + $error=0; + + $now=dol_now(); + + // Clean parameters + if (empty($this->date)) $this->date=$this->datep; + $this->fin_validite = $this->date + ($this->duree_validite * 24 * 3600); + if (empty($this->availability_id)) $this->availability_id=0; + if (empty($this->demand_reason_id)) $this->demand_reason_id=0; + + dol_syslog(get_class($this)."::create"); + + // Check parameters + $result=$this->fetch_thirdparty(); + if ($result < 0) + { + $this->error="Failed to fetch company"; + dol_syslog(get_class($this)."::create ".$this->error, LOG_ERR); + return -3; + } + + // Check parameters + if (! empty($this->ref)) // We check that ref is not already used + { + $result=self::isExistingObject($this->element, 0, $this->ref); // Check ref is not yet used + if ($result > 0) + { + $this->error='ErrorRefAlreadyExists'; + dol_syslog(get_class($this)."::create ".$this->error,LOG_WARNING); + $this->db->rollback(); + return -1; + } + } + + if (empty($this->date)) + { + $this->error="Date of proposal is required"; + dol_syslog(get_class($this)."::create ".$this->error, LOG_ERR); + return -4; + } + + + $this->db->begin(); + + // Insert into database + $sql = "INSERT INTO ".MAIN_DB_PREFIX."propal ("; + $sql.= "fk_soc"; + $sql.= ", price"; + $sql.= ", remise"; + $sql.= ", remise_percent"; + $sql.= ", remise_absolue"; + $sql.= ", tva"; + $sql.= ", total"; + $sql.= ", datep"; + $sql.= ", datec"; + $sql.= ", ref"; + $sql.= ", fk_user_author"; + $sql.= ", note_private"; + $sql.= ", note_public"; + $sql.= ", model_pdf"; + $sql.= ", fin_validite"; + $sql.= ", fk_cond_reglement"; + $sql.= ", fk_mode_reglement"; + $sql.= ", fk_account"; + $sql.= ", ref_client"; + $sql.= ", date_livraison"; + $sql.= ", fk_shipping_method"; + $sql.= ", fk_availability"; + $sql.= ", fk_input_reason"; + $sql.= ", fk_projet"; + $sql.= ", entity"; + $sql.= ") "; + $sql.= " VALUES ("; + $sql.= $this->socid; + $sql.= ", 0"; + $sql.= ", ".$this->remise; + $sql.= ", ".($this->remise_percent?$this->remise_percent:'null'); + $sql.= ", ".($this->remise_absolue?$this->remise_absolue:'null'); + $sql.= ", 0"; + $sql.= ", 0"; + $sql.= ", '".$this->db->idate($this->date)."'"; + $sql.= ", '".$this->db->idate($now)."'"; + $sql.= ", '(PROV)'"; + $sql.= ", ".($user->id > 0 ? "'".$user->id."'":"null"); + $sql.= ", '".$this->db->escape($this->note_private)."'"; + $sql.= ", '".$this->db->escape($this->note_public)."'"; + $sql.= ", '".$this->modelpdf."'"; + $sql.= ", ".($this->fin_validite!=''?"'".$this->db->idate($this->fin_validite)."'":"null"); + $sql.= ", ".$this->cond_reglement_id; + $sql.= ", ".$this->mode_reglement_id; + $sql.= ", ".($this->fk_account>0?$this->fk_account:'NULL'); + $sql.= ", '".$this->db->escape($this->ref_client)."'"; + $sql.= ", ".($this->date_livraison!=''?"'".$this->db->idate($this->date_livraison)."'":"null"); + $sql.= ", ".($this->shipping_method_id>0?$this->shipping_method_id:'NULL'); + $sql.= ", ".$this->availability_id; + $sql.= ", ".$this->demand_reason_id; + $sql.= ", ".($this->fk_project?$this->fk_project:"null"); + $sql.= ", ".$conf->entity; + $sql.= ")"; + + dol_syslog(get_class($this)."::create", LOG_DEBUG); + $resql=$this->db->query($sql); + if ($resql) + { + $this->id = $this->db->last_insert_id(MAIN_DB_PREFIX."propal"); + + if ($this->id) + { + $this->ref='(PROV'.$this->id.')'; + $sql = 'UPDATE '.MAIN_DB_PREFIX."propal SET ref='".$this->ref."' WHERE rowid=".$this->id; + + dol_syslog(get_class($this)."::create", LOG_DEBUG); + $resql=$this->db->query($sql); + if (! $resql) $error++; + + /* + * Insertion du detail des produits dans la base + */ + if (! $error) + { + $fk_parent_line=0; + $num=count($this->lines); + + for ($i=0;$i<$num;$i++) + { + // Reset fk_parent_line for no child products and special product + if (($this->lines[$i]->product_type != 9 && empty($this->lines[$i]->fk_parent_line)) || $this->lines[$i]->product_type == 9) { + $fk_parent_line = 0; + } + + $result = $this->addline( + $this->lines[$i]->desc, + $this->lines[$i]->subprice, + $this->lines[$i]->qty, + $this->lines[$i]->tva_tx, + $this->lines[$i]->localtax1_tx, + $this->lines[$i]->localtax2_tx, + $this->lines[$i]->fk_product, + $this->lines[$i]->remise_percent, + 'HT', + 0, + 0, + $this->lines[$i]->product_type, + $this->lines[$i]->rang, + $this->lines[$i]->special_code, + $fk_parent_line, + $this->lines[$i]->fk_fournprice, + $this->lines[$i]->pa_ht, + $this->lines[$i]->label, + $this->lines[$i]->date_start, + $this->lines[$i]->date_end, + $this->lines[$i]->array_options + ); + + if ($result < 0) + { + $error++; + $this->error=$this->db->error; + dol_print_error($this->db); + break; + } + // Defined the new fk_parent_line + if ($result > 0 && $this->lines[$i]->product_type == 9) { + $fk_parent_line = $result; + } + } + } + + // Add linked object + if (! $error && $this->origin && $this->origin_id) + { + $ret = $this->add_object_linked(); + if (! $ret) dol_print_error($this->db); + } + + // Set delivery address + if (! $error && $this->fk_delivery_address) + { + $sql = "UPDATE ".MAIN_DB_PREFIX."propal"; + $sql.= " SET fk_delivery_address = ".$this->fk_delivery_address; + $sql.= " WHERE ref = '".$this->ref."'"; + $sql.= " AND entity = ".$conf->entity; + + $result=$this->db->query($sql); + } + + if (! $error) + { + // Mise a jour infos denormalisees + $resql=$this->update_price(1); + if ($resql) + { + $action='update'; + + // Actions on extra fields (by external module or standard code) + // FIXME le hook fait double emploi avec le trigger !! + $hookmanager->initHooks(array('propaldao')); + $parameters=array('socid'=>$this->id); + $reshook=$hookmanager->executeHooks('insertExtraFields',$parameters,$this,$action); // Note that $action and $object may have been modified by some hooks + if (empty($reshook)) + { + if (empty($conf->global->MAIN_EXTRAFIELDS_DISABLED)) // For avoid conflicts if trigger used + { + $result=$this->insertExtraFields(); + if ($result < 0) + { + $error++; + } + } + } + else if ($reshook < 0) $error++; + + if (! $notrigger) + { + // Call trigger + $result=$this->call_trigger('PROPAL_CREATE',$user); + if ($result < 0) { $error++; } + // End call triggers + } + } + else + { + $this->error=$this->db->lasterror(); + $error++; + } + } + } + else + { + $this->error=$this->db->lasterror(); + $error++; + } + + if (! $error) + { + $this->db->commit(); + dol_syslog(get_class($this)."::create done id=".$this->id); + return $this->id; + } + else + { + $this->db->rollback(); + return -2; + } + } + else + { + $this->error=$this->db->lasterror(); + $this->db->rollback(); + return -1; + } + } + + + /** + * Insert into DB a proposal object completely defined by its data members (ex, results from copy). + * + * @param User $user User that create + * @return int Id of the new object if ok, <0 if ko + * @see create + */ + function create_from($user) + { + $this->products=$this->lines; + + return $this->create($user); + } + + /** + * Load an object from its id and create a new one in database + * + * @param int $socid Id of thirdparty + * @return int New id of clone + */ + function createFromClone($socid=0) + { + global $user,$langs,$conf,$hookmanager; + + $error=0; + $now=dol_now(); + + $this->db->begin(); + + // get extrafields so they will be clone + foreach($this->lines as $line) + $line->fetch_optionals($line->rowid); + + // Load source object + $objFrom = dol_clone($this); + + $objsoc=new Societe($this->db); + + // Change socid if needed + if (! empty($socid) && $socid != $this->socid) + { + if ($objsoc->fetch($socid) > 0) + { + $this->socid = $objsoc->id; + $this->cond_reglement_id = (! empty($objsoc->cond_reglement_id) ? $objsoc->cond_reglement_id : 0); + $this->mode_reglement_id = (! empty($objsoc->mode_reglement_id) ? $objsoc->mode_reglement_id : 0); + $this->fk_project = ''; + $this->fk_delivery_address = ''; + } + + // reset ref_client + $this->ref_client = ''; + + // TODO Change product price if multi-prices + } + else + { + $objsoc->fetch($this->socid); + } + + $this->id=0; + $this->statut=0; + + if (empty($conf->global->PROPALE_ADDON) || ! is_readable(DOL_DOCUMENT_ROOT ."/core/modules/propale/".$conf->global->PROPALE_ADDON.".php")) + { + $this->error='ErrorSetupNotComplete'; + return -1; + } + + // Clear fields + $this->user_author = $user->id; + $this->user_valid = ''; + $this->date = $now; + $this->datep = $now; // deprecated + $this->fin_validite = $this->date + ($this->duree_validite * 24 * 3600); + if (empty($conf->global->MAIN_KEEP_REF_CUSTOMER_ON_CLONING)) $this->ref_client = ''; + + // Set ref + require_once DOL_DOCUMENT_ROOT ."/core/modules/propale/".$conf->global->PROPALE_ADDON.'.php'; + $obj = $conf->global->PROPALE_ADDON; + $modPropale = new $obj; + $this->ref = $modPropale->getNextValue($objsoc,$this); + + // Create clone + $result=$this->create($user); + if ($result < 0) $error++; + else + { + // copy internal contacts + if ($this->copy_linked_contact($objFrom, 'internal') < 0) + $error++; + + // copy external contacts if same company + elseif ($objFrom->socid == $this->socid) + { + if ($this->copy_linked_contact($objFrom, 'external') < 0) + $error++; + } + } + + if (! $error) + { + // Hook of thirdparty module + if (is_object($hookmanager)) + { + $parameters=array('objFrom'=>$objFrom); + $action=''; + $reshook=$hookmanager->executeHooks('createFrom',$parameters,$this,$action); // Note that $action and $object may have been modified by some hooks + if ($reshook < 0) $error++; + } + + // Call trigger + $result=$this->call_trigger('PROPAL_CLONE',$user); + if ($result < 0) { $error++; } + // End call triggers + } + + // End + if (! $error) + { + $this->db->commit(); + return $this->id; + } + else + { + $this->db->rollback(); + return -1; + } + } + + /** + * Load a proposal from database and its ligne array + * + * @param int $rowid id of object to load + * @param string $ref Ref of proposal + * @return int >0 if OK, <0 if KO + */ + function fetch($rowid,$ref='') + { + global $conf; + + $sql = "SELECT p.rowid, p.ref, p.remise, p.remise_percent, p.remise_absolue, p.fk_soc"; + $sql.= ", p.total, p.tva, p.localtax1, p.localtax2, p.total_ht"; + $sql.= ", p.datec"; + $sql.= ", p.date_valid as datev"; + $sql.= ", p.datep as dp"; + $sql.= ", p.fin_validite as dfv"; + $sql.= ", p.date_livraison as date_livraison"; + $sql.= ", p.model_pdf, p.ref_client, p.extraparams"; + $sql.= ", p.note_private, p.note_public"; + $sql.= ", p.fk_projet, p.fk_statut"; + $sql.= ", p.fk_user_author, p.fk_user_valid, p.fk_user_cloture"; + $sql.= ", p.fk_delivery_address"; + $sql.= ", p.fk_availability"; + $sql.= ", p.fk_input_reason"; + $sql.= ", p.fk_cond_reglement"; + $sql.= ", p.fk_mode_reglement"; + $sql.= ', p.fk_account'; + $sql.= ", p.fk_shipping_method"; + $sql.= ", c.label as statut_label"; + $sql.= ", ca.code as availability_code, ca.label as availability"; + $sql.= ", dr.code as demand_reason_code, dr.label as demand_reason"; + $sql.= ", cr.code as cond_reglement_code, cr.libelle as cond_reglement, cr.libelle_facture as cond_reglement_libelle_doc"; + $sql.= ", cp.code as mode_reglement_code, cp.libelle as mode_reglement"; + $sql.= " FROM ".MAIN_DB_PREFIX."c_propalst as c, ".MAIN_DB_PREFIX."propal as p"; + $sql.= ' LEFT JOIN '.MAIN_DB_PREFIX.'c_paiement as cp ON p.fk_mode_reglement = cp.id'; + $sql.= ' LEFT JOIN '.MAIN_DB_PREFIX.'c_payment_term as cr ON p.fk_cond_reglement = cr.rowid'; + $sql.= ' LEFT JOIN '.MAIN_DB_PREFIX.'c_availability as ca ON p.fk_availability = ca.rowid'; + $sql.= ' LEFT JOIN '.MAIN_DB_PREFIX.'c_input_reason as dr ON p.fk_input_reason = dr.rowid'; + $sql.= " WHERE p.fk_statut = c.id"; + $sql.= " AND p.entity = ".$conf->entity; + if ($ref) $sql.= " AND p.ref='".$ref."'"; + else $sql.= " AND p.rowid=".$rowid; + + dol_syslog(get_class($this)."::fetch", LOG_DEBUG); + $resql=$this->db->query($sql); + if ($resql) + { + if ($this->db->num_rows($resql)) + { + $obj = $this->db->fetch_object($resql); + + $this->id = $obj->rowid; + + $this->ref = $obj->ref; + $this->ref_client = $obj->ref_client; + $this->remise = $obj->remise; + $this->remise_percent = $obj->remise_percent; + $this->remise_absolue = $obj->remise_absolue; + $this->total = $obj->total; // TODO obsolete + $this->total_ht = $obj->total_ht; + $this->total_tva = $obj->tva; + $this->total_localtax1 = $obj->localtax1; + $this->total_localtax2 = $obj->localtax2; + $this->total_ttc = $obj->total; + $this->socid = $obj->fk_soc; + $this->fk_project = $obj->fk_projet; + $this->modelpdf = $obj->model_pdf; + $this->note = $obj->note_private; // TODO obsolete + $this->note_private = $obj->note_private; + $this->note_public = $obj->note_public; + $this->statut = $obj->fk_statut; + $this->statut_libelle = $obj->statut_label; + + $this->datec = $this->db->jdate($obj->datec); // TODO obsolete + $this->datev = $this->db->jdate($obj->datev); // TODO obsolete + $this->date_creation = $this->db->jdate($obj->datec); //Creation date + $this->date_validation = $this->db->jdate($obj->datev); //Validation date + $this->date = $this->db->jdate($obj->dp); // Proposal date + $this->datep = $this->db->jdate($obj->dp); // deprecated + $this->fin_validite = $this->db->jdate($obj->dfv); + $this->date_livraison = $this->db->jdate($obj->date_livraison); + $this->shipping_method_id = ($obj->fk_shipping_method>0)?$obj->fk_shipping_method:null; + $this->availability_id = $obj->fk_availability; + $this->availability_code = $obj->availability_code; + $this->availability = $obj->availability; + $this->demand_reason_id = $obj->fk_input_reason; + $this->demand_reason_code = $obj->demand_reason_code; + $this->demand_reason = $obj->demand_reason; + $this->fk_address = $obj->fk_delivery_address; + + $this->mode_reglement_id = $obj->fk_mode_reglement; + $this->mode_reglement_code = $obj->mode_reglement_code; + $this->mode_reglement = $obj->mode_reglement; + $this->fk_account = ($obj->fk_account>0)?$obj->fk_account:null; + $this->cond_reglement_id = $obj->fk_cond_reglement; + $this->cond_reglement_code = $obj->cond_reglement_code; + $this->cond_reglement = $obj->cond_reglement; + $this->cond_reglement_doc = $obj->cond_reglement_libelle_doc; + + $this->extraparams = (array) json_decode($obj->extraparams, true); + + $this->user_author_id = $obj->fk_user_author; + $this->user_valid_id = $obj->fk_user_valid; + $this->user_close_id = $obj->fk_user_cloture; + + if ($obj->fk_statut == 0) + { + $this->brouillon = 1; + } + + // Retreive all extrafield for invoice + // fetch optionals attributes and labels + require_once DOL_DOCUMENT_ROOT.'/core/class/extrafields.class.php'; + $extrafields=new ExtraFields($this->db); + $extralabels=$extrafields->fetch_name_optionals_label($this->table_element,true); + $this->fetch_optionals($this->id,$extralabels); + + $this->db->free($resql); + + $this->lines = array(); + + /* + * Lignes propales liees a un produit ou non + */ + $sql = "SELECT d.rowid, d.fk_propal, d.fk_parent_line, d.label as custom_label, d.description, d.price, d.tva_tx, d.localtax1_tx, d.localtax2_tx, d.qty, d.fk_remise_except, d.remise_percent, d.subprice, d.fk_product,"; + $sql.= " d.info_bits, d.total_ht, d.total_tva, d.total_localtax1, d.total_localtax2, d.total_ttc, d.fk_product_fournisseur_price as fk_fournprice, d.buy_price_ht as pa_ht, d.special_code, d.rang, d.product_type,"; + $sql.= ' p.ref as product_ref, p.description as product_desc, p.fk_product_type, p.label as product_label,'; + $sql.= ' d.date_start, d.date_end'; + $sql.= " FROM ".MAIN_DB_PREFIX."propaldet as d"; + $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."product as p ON d.fk_product = p.rowid"; + $sql.= " WHERE d.fk_propal = ".$this->id; + $sql.= " ORDER by d.rang"; + + $result = $this->db->query($sql); + if ($result) + { + $num = $this->db->num_rows($result); + $i = 0; + + while ($i < $num) + { + $objp = $this->db->fetch_object($result); + + $line = new PropaleLigne($this->db); + + $line->rowid = $objp->rowid; + $line->fk_propal = $objp->fk_propal; + $line->fk_parent_line = $objp->fk_parent_line; + $line->product_type = $objp->product_type; + $line->label = $objp->custom_label; + $line->desc = $objp->description; // Description ligne + $line->qty = $objp->qty; + $line->tva_tx = $objp->tva_tx; + $line->localtax1_tx = $objp->localtax1_tx; + $line->localtax2_tx = $objp->localtax2_tx; + $line->subprice = $objp->subprice; + $line->fk_remise_except = $objp->fk_remise_except; + $line->remise_percent = $objp->remise_percent; + $line->price = $objp->price; // TODO deprecated + + $line->info_bits = $objp->info_bits; + $line->total_ht = $objp->total_ht; + $line->total_tva = $objp->total_tva; + $line->total_localtax1 = $objp->total_localtax1; + $line->total_localtax2 = $objp->total_localtax2; + $line->total_ttc = $objp->total_ttc; + $line->fk_fournprice = $objp->fk_fournprice; + $marginInfos = getMarginInfos($objp->subprice, $objp->remise_percent, $objp->tva_tx, $objp->localtax1_tx, $objp->localtax2_tx, $line->fk_fournprice, $objp->pa_ht); + $line->pa_ht = $marginInfos[0]; + $line->marge_tx = $marginInfos[1]; + $line->marque_tx = $marginInfos[2]; + $line->special_code = $objp->special_code; + $line->rang = $objp->rang; + + $line->fk_product = $objp->fk_product; + + $line->ref = $objp->product_ref; // TODO deprecated + $line->product_ref = $objp->product_ref; + $line->libelle = $objp->product_label; // TODO deprecated + $line->product_label = $objp->product_label; + $line->product_desc = $objp->product_desc; // Description produit + $line->fk_product_type = $objp->fk_product_type; + + $line->date_start = $objp->date_start; + $line->date_end = $objp->date_end; + + $this->lines[$i] = $line; + //dol_syslog("1 ".$line->fk_product); + //print "xx $i ".$this->lines[$i]->fk_product; + $i++; + } + $this->db->free($result); + } + else + { + $this->error=$this->db->error(); + return -1; + } + + // Retreive all extrafield for propal + // fetch optionals attributes and labels + require_once DOL_DOCUMENT_ROOT.'/core/class/extrafields.class.php'; + $extrafields=new ExtraFields($this->db); + $extralabels=$extrafields->fetch_name_optionals_label($this->table_element,true); + $this->fetch_optionals($this->id,$extralabels); + + return 1; + } + + $this->error="Record Not Found"; + return 0; + } + else + { + $this->error=$this->db->error(); + return -1; + } + } + + /** + * Update value of extrafields on the proposal + * + * @param User $user Object user that modify + * @return int <0 if ko, >0 if ok + */ + function update_extrafields($user) + { + $action='update'; + + // Actions on extra fields (by external module or standard code) + // FIXME le hook fait double emploi avec le trigger !! + $hookmanager->initHooks(array('propaldao')); + $parameters=array('id'=>$this->id); + $reshook=$hookmanager->executeHooks('insertExtraFields',$parameters,$this,$action); // Note that $action and $object may have been modified by some hooks + if (empty($reshook)) + { + if (empty($conf->global->MAIN_EXTRAFIELDS_DISABLED)) // For avoid conflicts if trigger used + { + $result=$this->insertExtraFields(); + if ($result < 0) + { + $error++; + } + } + } + else if ($reshook < 0) $error++; + + if (!$error) + { + return 1; + } + else + { + return -1; + } + + } + + /** + * Set status to validated + * + * @param User $user Object user that validate + * @param int $notrigger 1=Does not execute triggers, 0= execuete triggers + * @return int <0 if KO, >=0 if OK + */ + function valid($user, $notrigger=0) + { + require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php'; + + global $conf,$langs; + + $error=0; + $now=dol_now(); + + if ((empty($conf->global->MAIN_USE_ADVANCED_PERMS) && ! empty($user->rights->propal->creer)) + || (! empty($conf->global->MAIN_USE_ADVANCED_PERMS) && ! empty($user->rights->propal->propal_advance->validate))) + { + $this->db->begin(); + + // Numbering module definition + $soc = new Societe($this->db); + $soc->fetch($this->socid); + + // Define new ref + if (! $error && (preg_match('/^[\(]?PROV/i', $this->ref))) + { + $num = $this->getNextNumRef($soc); + } + else + { + $num = $this->ref; + } + $this->newref = $num; + + $sql = "UPDATE ".MAIN_DB_PREFIX."propal"; + $sql.= " SET ref = '".$num."',"; + $sql.= " fk_statut = 1, date_valid='".$this->db->idate($now)."', fk_user_valid=".$user->id; + $sql.= " WHERE rowid = ".$this->id." AND fk_statut = 0"; + + dol_syslog(get_class($this)."::valid", LOG_DEBUG); + $resql=$this->db->query($sql); + if (! $resql) + { + dol_print_error($this->db); + $error++; + } + + // Trigger calls + if (! $error && ! $notrigger) + { + // Call trigger + $result=$this->call_trigger('PROPAL_VALIDATE',$user); + if ($result < 0) { $error++; } + // End call triggers + } + + if (! $error) + { + $this->oldref = $this->ref; + + // Rename directory if dir was a temporary ref + if (preg_match('/^[\(]?PROV/i', $this->ref)) + { + // Rename of propal directory ($this->ref = old ref, $num = new ref) + // to not lose the linked files + $oldref = dol_sanitizeFileName($this->ref); + $newref = dol_sanitizeFileName($num); + $dirsource = $conf->propal->dir_output.'/'.$oldref; + $dirdest = $conf->propal->dir_output.'/'.$newref; + + if (file_exists($dirsource)) + { + dol_syslog(get_class($this)."::validate rename dir ".$dirsource." into ".$dirdest); + if (@rename($dirsource, $dirdest)) + { + dol_syslog("Rename ok"); + // Rename docs starting with $oldref with $newref + $listoffiles=dol_dir_list($conf->propal->dir_output.'/'.$newref, 'files', 1, '^'.preg_quote($oldref,'/')); + foreach($listoffiles as $fileentry) + { + $dirsource=$fileentry['name']; + $dirdest=preg_replace('/^'.preg_quote($oldref,'/').'/',$newref, $dirsource); + $dirsource=$fileentry['path'].'/'.$dirsource; + $dirdest=$fileentry['path'].'/'.$dirdest; + @rename($dirsource, $dirdest); + } + } + } + } + + $this->ref=$num; + $this->brouillon=0; + $this->statut = 1; + $this->user_valid_id=$user->id; + $this->datev=$now; + + $this->db->commit(); + return 1; + } + else + { + $this->db->rollback(); + return -1; + } + } + } + + + /** + * Define proposal date + * + * @param User $user Object user that modify + * @param int $date Date + * @return int <0 if KO, >0 if OK + */ + function set_date($user, $date) + { + if (empty($date)) + { + $this->error='ErrorBadParameter'; + dol_syslog(get_class($this)."::set_date ".$this->error, LOG_ERR); + return -1; + } + + if (! empty($user->rights->propal->creer)) + { + $sql = "UPDATE ".MAIN_DB_PREFIX."propal SET datep = '".$this->db->idate($date)."'"; + $sql.= " WHERE rowid = ".$this->id." AND fk_statut = 0"; + + dol_syslog(get_class($this)."::set_date", LOG_DEBUG); + if ($this->db->query($sql) ) + { + $this->date = $date; + $this->datep = $date; // deprecated + return 1; + } + else + { + $this->error=$this->db->lasterror(); + return -1; + } + } + } + + /** + * Define end validity date + * + * @param User $user Object user that modify + * @param int $date_fin_validite End of validity date + * @return int <0 if KO, >0 if OK + */ + function set_echeance($user, $date_fin_validite) + { + if (! empty($user->rights->propal->creer)) + { + $sql = "UPDATE ".MAIN_DB_PREFIX."propal SET fin_validite = ".($date_fin_validite!=''?"'".$this->db->idate($date_fin_validite)."'":'null'); + $sql.= " WHERE rowid = ".$this->id." AND fk_statut = 0"; + if ($this->db->query($sql) ) + { + $this->fin_validite = $date_fin_validite; + return 1; + } + else + { + $this->error=$this->db->error(); + return -1; + } + } + } + + /** + * Set delivery date + * + * @param User $user Object user that modify + * @param int $date_livraison Delivery date + * @return int <0 if ko, >0 if ok + */ + function set_date_livraison($user, $date_livraison) + { + if (! empty($user->rights->propal->creer)) + { + $sql = "UPDATE ".MAIN_DB_PREFIX."propal "; + $sql.= " SET date_livraison = ".($date_livraison!=''?"'".$this->db->idate($date_livraison)."'":'null'); + $sql.= " WHERE rowid = ".$this->id; + + if ($this->db->query($sql)) + { + $this->date_livraison = $date_livraison; + return 1; + } + else + { + $this->error=$this->db->error(); + dol_syslog(get_class($this)."::set_date_livraison Erreur SQL"); + return -1; + } + } + } + + /** + * Set delivery + * + * @param User $user Object user that modify + * @param int $id Availability id + * @return int <0 if KO, >0 if OK + */ + function set_availability($user, $id) + { + if (! empty($user->rights->propal->creer)) + { + $sql = "UPDATE ".MAIN_DB_PREFIX."propal "; + $sql.= " SET fk_availability = '".$id."'"; + $sql.= " WHERE rowid = ".$this->id; + + if ($this->db->query($sql)) + { + $this->fk_availability = $id; + return 1; + } + else + { + $this->error=$this->db->error(); + dol_syslog(get_class($this)."::set_availability Erreur SQL"); + return -1; + } + } + } + + /** + * Set source of demand + * + * @param User $user Object user that modify + * @param int $id Input reason id + * @return int <0 if KO, >0 if OK + */ + function set_demand_reason($user, $id) + { + if (! empty($user->rights->propal->creer)) + { + $sql = "UPDATE ".MAIN_DB_PREFIX."propal "; + $sql.= " SET fk_input_reason = '".$id."'"; + $sql.= " WHERE rowid = ".$this->id; + + if ($this->db->query($sql)) + { + $this->fk_input_reason = $id; + return 1; + } + else + { + $this->error=$this->db->error(); + dol_syslog(get_class($this)."::set_demand_reason Erreur SQL"); + return -1; + } + } + } + + /** + * Set customer reference number + * + * @param User $user Object user that modify + * @param string $ref_client Customer reference + * @return int <0 if ko, >0 if ok + */ + function set_ref_client($user, $ref_client) + { + if (! empty($user->rights->propal->creer)) + { + dol_syslog('Propale::set_ref_client this->id='.$this->id.', ref_client='.$ref_client); + + $sql = 'UPDATE '.MAIN_DB_PREFIX.'propal SET ref_client = '.(empty($ref_client) ? 'NULL' : '\''.$this->db->escape($ref_client).'\''); + $sql.= ' WHERE rowid = '.$this->id; + if ($this->db->query($sql) ) + { + $this->ref_client = $ref_client; + return 1; + } + else + { + $this->error=$this->db->error(); + dol_syslog('Propale::set_ref_client Erreur '.$this->error.' - '.$sql); + return -2; + } + } + else + { + return -1; + } + } + + /** + * Set an overall discount on the proposal + * + * @param User $user Object user that modify + * @param double $remise Amount discount + * @return int <0 if ko, >0 if ok + */ + function set_remise_percent($user, $remise) + { + $remise=trim($remise)?trim($remise):0; + + if (! empty($user->rights->propal->creer)) + { + $remise = price2num($remise); + + $sql = "UPDATE ".MAIN_DB_PREFIX."propal SET remise_percent = ".$remise; + $sql.= " WHERE rowid = ".$this->id." AND fk_statut = 0"; + + if ($this->db->query($sql) ) + { + $this->remise_percent = $remise; + $this->update_price(1); + return 1; + } + else + { + $this->error=$this->db->error(); + return -1; + } + } + } + + + /** + * Set an absolute overall discount on the proposal + * + * @param User $user Object user that modify + * @param double $remise Amount discount + * @return int <0 if ko, >0 if ok + */ + function set_remise_absolue($user, $remise) + { + $remise=trim($remise)?trim($remise):0; + + if (! empty($user->rights->propal->creer)) + { + $remise = price2num($remise); + + $sql = "UPDATE ".MAIN_DB_PREFIX."propal "; + $sql.= " SET remise_absolue = ".$remise; + $sql.= " WHERE rowid = ".$this->id." AND fk_statut = 0"; + + if ($this->db->query($sql) ) + { + $this->remise_absolue = $remise; + $this->update_price(1); + return 1; + } + else + { + $this->error=$this->db->error(); + return -1; + } + } + } + + + + /** + * Reopen the commercial proposal + * + * @param User $user Object user that close + * @param int $statut Statut + * @param string $note Comment + * @param int $notrigger 1=Does not execute triggers, 0= execuete triggers + * @return int <0 if KO, >0 if OK + */ + function reopen($user, $statut, $note='', $notrigger=0) + { + global $langs,$conf; + + $this->statut = $statut; + $error=0; + + $sql = "UPDATE ".MAIN_DB_PREFIX."propal"; + $sql.= " SET fk_statut = ".$this->statut.","; + if (! empty($note)) $sql.= " note_private = '".$this->db->escape($note)."',"; + $sql.= " date_cloture=NULL, fk_user_cloture=NULL"; + $sql.= " WHERE rowid = ".$this->id; + + $this->db->begin(); + + dol_syslog(get_class($this)."::reopen", LOG_DEBUG); + $resql = $this->db->query($sql); + if (! $resql) { + $error++; $this->errors[]="Error ".$this->db->lasterror(); + } + if (! $error) + { + if (! $notrigger) + { + // Call trigger + $result=$this->call_trigger('PROPAL_REOPEN',$user); + if ($result < 0) { $error++; } + // End call triggers + } + } + + // Commit or rollback + if ($error) + { + if (!empty($this->errors)) + { + foreach($this->errors as $errmsg) + { + dol_syslog(get_class($this)."::update ".$errmsg, LOG_ERR); + $this->error.=($this->error?', '.$errmsg:$errmsg); + } + } + $this->db->rollback(); + return -1*$error; + } + else + { + $this->db->commit(); + return 1; + } + } + + + /** + * Close the commercial proposal + * + * @param User $user Object user that close + * @param int $statut Statut + * @param string $note Comment + * @return int <0 if KO, >0 if OK + */ + function cloture($user, $statut, $note) + { + global $langs,$conf; + + $this->statut = $statut; + $error=0; + $now=dol_now(); + + $this->db->begin(); + + $sql = "UPDATE ".MAIN_DB_PREFIX."propal"; + $sql.= " SET fk_statut = ".$statut.", note_private = '".$this->db->escape($note)."', date_cloture='".$this->db->idate($now)."', fk_user_cloture=".$user->id; + $sql.= " WHERE rowid = ".$this->id; + + $resql=$this->db->query($sql); + if ($resql) + { + $modelpdf=$conf->global->PROPALE_ADDON_PDF_ODT_CLOSED?$conf->global->PROPALE_ADDON_PDF_ODT_CLOSED:$this->modelpdf; + $trigger_name='PROPAL_CLOSE_REFUSED'; + + if ($statut == 2) + { + $trigger_name='PROPAL_CLOSE_SIGNED'; + $modelpdf=$conf->global->PROPALE_ADDON_PDF_ODT_TOBILL?$conf->global->PROPALE_ADDON_PDF_ODT_TOBILL:$this->modelpdf; + + // The connected company is classified as a client + $soc=new Societe($this->db); + $soc->id = $this->socid; + $result=$soc->set_as_client(); + + if ($result < 0) + { + $this->error=$this->db->error(); + $this->db->rollback(); + return -2; + } + } + if ($statut == 4) + { + $trigger_name='PROPAL_CLASSIFY_BILLED'; + } + + if (empty($conf->global->MAIN_DISABLE_PDF_AUTOUPDATE)) + { + // Define output language + $outputlangs = $langs; + if (! empty($conf->global->MAIN_MULTILANGS)) + { + $outputlangs = new Translate("",$conf); + $newlang=(GETPOST('lang_id') ? GETPOST('lang_id') : $this->client->default_lang); + $outputlangs->setDefaultLang($newlang); + } + //$ret=$object->fetch($id); // Reload to get new records + $this->generateDocument($modelpdf, $outputlangs, $hidedetails, $hidedesc, $hideref); + } + + // Call trigger + $result=$this->call_trigger($trigger_name,$user); + if ($result < 0) { $error++; } + // End call triggers + + if ( ! $error ) + { + $this->db->commit(); + return 1; + } + else + { + $this->db->rollback(); + return -1; + } + } + else + { + $this->error=$this->db->error(); + $this->db->rollback(); + return -1; + } + } + + /** + * Class invoiced the Propal + * + * @return int <0 si ko, >0 si ok + */ + function classifyBilled() + { + $sql = 'UPDATE '.MAIN_DB_PREFIX.'propal SET fk_statut = 4'; + $sql .= ' WHERE rowid = '.$this->id.' AND fk_statut > 0 ;'; + if ($this->db->query($sql) ) + { + $this->statut=4; + return 1; + } + else + { + dol_print_error($this->db); + } + } + + /** + * Class invoiced the Propal + * + * @return int <0 si ko, >0 si ok + * @deprecated + */ + function classer_facturee() + { + return $this->classifyBilled(); + } + + /** + * Set draft status + * + * @param User $user Object user that modify + * @return int <0 if KO, >0 if OK + */ + function set_draft($user) + { + global $conf,$langs; + + $sql = "UPDATE ".MAIN_DB_PREFIX."propal SET fk_statut = 0"; + $sql.= " WHERE rowid = ".$this->id; + + if ($this->db->query($sql)) + { + $this->statut = 0; + $this->brouillon = 1; + return 1; + } + else + { + return -1; + } + } + + + /** + * Return list of proposal (eventually filtered on user) into an array + * + * @param int $shortlist 0=Return array[id]=ref, 1=Return array[](id=>id,ref=>ref,name=>name) + * @param int $draft 0=not draft, 1=draft + * @param int $notcurrentuser 0=all user, 1=not current user + * @param int $socid Id third pary + * @param int $limit For pagination + * @param int $offset For pagination + * @param string $sortfield Sort criteria + * @param string $sortorder Sort order + * @return int -1 if KO, array with result if OK + */ + function liste_array($shortlist=0, $draft=0, $notcurrentuser=0, $socid=0, $limit=0, $offset=0, $sortfield='p.datep', $sortorder='DESC') + { + global $conf,$user; + + $ga = array(); + + $sql = "SELECT s.rowid, s.nom as name, s.client,"; + $sql.= " p.rowid as propalid, p.fk_statut, p.total_ht, p.ref, p.remise, "; + $sql.= " p.datep as dp, p.fin_validite as datelimite"; + 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, ".MAIN_DB_PREFIX."c_propalst as c"; + if (! $user->rights->societe->client->voir && ! $socid) $sql .= ", ".MAIN_DB_PREFIX."societe_commerciaux as sc"; + $sql.= " WHERE p.entity = ".$conf->entity; + $sql.= " AND p.fk_soc = s.rowid"; + $sql.= " AND p.fk_statut = c.id"; + if (! $user->rights->societe->client->voir && ! $socid) //restriction + { + $sql.= " AND s.rowid = sc.fk_soc AND sc.fk_user = " .$user->id; + } + if ($socid) $sql.= " AND s.rowid = ".$socid; + if ($draft) $sql.= " AND p.fk_statut = 0"; + if ($notcurrentuser > 0) $sql.= " AND p.fk_user_author <> ".$user->id; + $sql.= $this->db->order($sortfield,$sortorder); + $sql.= $this->db->plimit($limit,$offset); + + $result=$this->db->query($sql); + if ($result) + { + $num = $this->db->num_rows($result); + if ($num) + { + $i = 0; + while ($i < $num) + { + $obj = $this->db->fetch_object($result); + + if ($shortlist == 1) + { + $ga[$obj->propalid] = $obj->ref; + } + else if ($shortlist == 2) + { + $ga[$obj->propalid] = $obj->ref.' ('.$obj->name.')'; + } + else + { + $ga[$i]['id'] = $obj->propalid; + $ga[$i]['ref'] = $obj->ref; + $ga[$i]['name'] = $obj->name; + } + + $i++; + } + } + return $ga; + } + else + { + dol_print_error($this->db); + return -1; + } + } + + /** + * Returns an array with the numbers of related invoices + * + * @return array Array of invoices + */ + function getInvoiceArrayList() + { + return $this->InvoiceArrayList($this->id); + } + + /** + * Returns an array with id and ref of related invoices + * + * @param int $id Id propal + * @return array Array of invoices id + */ + function InvoiceArrayList($id) + { + $ga = array(); + $linkedInvoices = array(); + + $this->fetchObjectLinked($id,$this->element); + foreach($this->linkedObjectsIds as $objecttype => $objectid) + { + $numi=count($objectid); + for ($i=0;$i<$numi;$i++) + { + // Cas des factures liees directement + if ($objecttype == 'facture') + { + $linkedInvoices[] = $objectid[$i]; + } + // Cas des factures liees par un autre objet (ex: commande) + else + { + $this->fetchObjectLinked($objectid[$i],$objecttype); + foreach($this->linkedObjectsIds as $subobjecttype => $subobjectid) + { + $numj=count($subobjectid); + for ($j=0;$j<$numj;$j++) + { + if ($subobjecttype == 'facture') + { + $linkedInvoices[] = $subobjectid[$j]; + } + } + } + } + } + } + + if (count($linkedInvoices) > 0) + { + $sql= "SELECT rowid as facid, facnumber, total, datef as df, fk_user_author, fk_statut, paye"; + $sql.= " FROM ".MAIN_DB_PREFIX."facture"; + $sql.= " WHERE rowid IN (".implode(',',$linkedInvoices).")"; + + dol_syslog(get_class($this)."::InvoiceArrayList", LOG_DEBUG); + $resql=$this->db->query($sql); + + if ($resql) + { + $tab_sqlobj=array(); + $nump = $this->db->num_rows($resql); + for ($i = 0;$i < $nump;$i++) + { + $sqlobj = $this->db->fetch_object($resql); + $tab_sqlobj[] = $sqlobj; + } + $this->db->free($resql); + + $nump = count($tab_sqlobj); + + if ($nump) + { + $i = 0; + while ($i < $nump) + { + $obj = array_shift($tab_sqlobj); + + $ga[$i] = $obj; + + $i++; + } + } + return $ga; + } + else + { + return -1; + } + } + else return $ga; + } + + /** + * Delete proposal + * + * @param User $user Object user that delete + * @param int $notrigger 1=Does not execute triggers, 0= execuete triggers + * @return int 1 if ok, otherwise if error + */ + function delete($user, $notrigger=0) + { + global $conf,$langs; + require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php'; + + $error=0; + + $this->db->begin(); + + if (! $notrigger) + { + // Call trigger + $result=$this->call_trigger('PROPAL_DELETE',$user); + if ($result < 0) { $error++; } + // End call triggers + } + + if (! $error) + { + $sql = "DELETE FROM ".MAIN_DB_PREFIX."propaldet WHERE fk_propal = ".$this->id; + if ($this->db->query($sql)) + { + $sql = "DELETE FROM ".MAIN_DB_PREFIX."propal WHERE rowid = ".$this->id; + if ($this->db->query($sql)) + { + // Delete linked object + $res = $this->deleteObjectLinked(); + if ($res < 0) $error++; + + // Delete linked contacts + $res = $this->delete_linked_contact(); + if ($res < 0) $error++; + + if (! $error) + { + // We remove directory + $ref = dol_sanitizeFileName($this->ref); + if ($conf->propal->dir_output && !empty($this->ref)) + { + $dir = $conf->propal->dir_output . "/" . $ref ; + $file = $dir . "/" . $ref . ".pdf"; + if (file_exists($file)) + { + dol_delete_preview($this); + + if (! dol_delete_file($file,0,0,0,$this)) // For triggers + { + $this->error='ErrorFailToDeleteFile'; + $this->errors=array('ErrorFailToDeleteFile'); + $this->db->rollback(); + return 0; + } + } + if (file_exists($dir)) + { + $res=@dol_delete_dir_recursive($dir); + if (! $res) + { + $this->error='ErrorFailToDeleteDir'; + $this->errors=array('ErrorFailToDeleteDir'); + $this->db->rollback(); + return 0; + } + } + } + } + + // Removed extrafields + if (! $error) + { + if (empty($conf->global->MAIN_EXTRAFIELDS_DISABLED)) // For avoid conflicts if trigger used + { + $result=$this->deleteExtraFields(); + if ($result < 0) + { + $error++; + $errorflag=-4; + dol_syslog(get_class($this)."::delete erreur ".$errorflag." ".$this->error, LOG_ERR); + } + } + } + + if (! $error) + { + dol_syslog(get_class($this)."::delete ".$this->id." by ".$user->id, LOG_DEBUG); + $this->db->commit(); + return 1; + } + else + { + $this->error=$this->db->lasterror(); + $this->db->rollback(); + return 0; + } + } + else + { + $this->error=$this->db->lasterror(); + $this->db->rollback(); + return -3; + } + } + else + { + $this->error=$this->db->lasterror(); + $this->db->rollback(); + return -2; + } + } + else + { + $this->db->rollback(); + return -1; + } + } + + /** + * Change the delivery time + * + * @param int $availability_id Id of new delivery time + * @return int >0 if OK, <0 if KO + */ + function availability($availability_id) + { + dol_syslog('Propale::availability('.$availability_id.')'); + if ($this->statut >= 0) + { + $sql = 'UPDATE '.MAIN_DB_PREFIX.'propal'; + $sql .= ' SET fk_availability = '.$availability_id; + $sql .= ' WHERE rowid='.$this->id; + if ( $this->db->query($sql) ) + { + $this->availability_id = $availability_id; + return 1; + } + else + { + dol_syslog('Propale::availability Erreur '.$sql.' - '.$this->db->error()); + $this->error=$this->db->error(); + return -1; + } + } + else + { + dol_syslog('Propale::availability, etat propale incompatible'); + $this->error='Etat propale incompatible '.$this->statut; + return -2; + } + } + + /** + * Change source demand + * + * @param int $demand_reason_id Id of new source demand + * @return int >0 si ok, <0 si ko + */ + function demand_reason($demand_reason_id) + { + dol_syslog('Propale::demand_reason('.$demand_reason_id.')'); + if ($this->statut >= 0) + { + $sql = 'UPDATE '.MAIN_DB_PREFIX.'propal'; + $sql .= ' SET fk_input_reason = '.$demand_reason_id; + $sql .= ' WHERE rowid='.$this->id; + if ( $this->db->query($sql) ) + { + $this->demand_reason_id = $demand_reason_id; + return 1; + } + else + { + dol_syslog('Propale::demand_reason Erreur '.$sql.' - '.$this->db->error()); + $this->error=$this->db->error(); + return -1; + } + } + else + { + dol_syslog('Propale::demand_reason, etat propale incompatible'); + $this->error='Etat propale incompatible '.$this->statut; + return -2; + } + } + + + /** + * Object Proposal Information + * + * @param int $id Proposal id + * @return void + */ + function info($id) + { + $sql = "SELECT c.rowid, "; + $sql.= " c.datec, c.date_valid as datev, c.date_cloture as dateo,"; + $sql.= " c.fk_user_author, c.fk_user_valid, c.fk_user_cloture"; + $sql.= " FROM ".MAIN_DB_PREFIX."propal as c"; + $sql.= " WHERE c.rowid = ".$id; + + $result = $this->db->query($sql); + + if ($result) + { + if ($this->db->num_rows($result)) + { + $obj = $this->db->fetch_object($result); + + $this->id = $obj->rowid; + + $this->date_creation = $this->db->jdate($obj->datec); + $this->date_validation = $this->db->jdate($obj->datev); + $this->date_cloture = $this->db->jdate($obj->dateo); + + $cuser = new User($this->db); + $cuser->fetch($obj->fk_user_author); + $this->user_creation = $cuser; + + if ($obj->fk_user_valid) + { + $vuser = new User($this->db); + $vuser->fetch($obj->fk_user_valid); + $this->user_validation = $vuser; + } + + if ($obj->fk_user_cloture) + { + $cluser = new User($this->db); + $cluser->fetch($obj->fk_user_cloture); + $this->user_cloture = $cluser; + } + + + } + $this->db->free($result); + + } + else + { + dol_print_error($this->db); + } + } + + + /** + * Return label of status of proposal (draft, validated, ...) + * + * @param int $mode 0=long label, 1=short label, 2=Picto + short label, 3=Picto, 4=Picto + long label, 5=Short label + Picto + * @return string Label + */ + function getLibStatut($mode=0) + { + return $this->LibStatut($this->statut,$mode); + } + + /** + * Return label of a status (draft, validated, ...) + * + * @param int $statut id statut + * @param int $mode 0=long label, 1=short label, 2=Picto + short label, 3=Picto, 4=Picto + long label, 5=Short label + Picto + * @return string Label + */ + function LibStatut($statut,$mode=1) + { + global $langs; + $langs->load("propal"); + + if ($statut==0) $statuttrans='statut0'; + if ($statut==1) $statuttrans='statut1'; + if ($statut==2) $statuttrans='statut3'; + if ($statut==3) $statuttrans='statut5'; + if ($statut==4) $statuttrans='statut6'; + + if ($mode == 0) return $this->labelstatut[$statut]; + if ($mode == 1) return $this->labelstatut_short[$statut]; + if ($mode == 2) return img_picto($this->labelstatut_short[$statut], $statuttrans).' '.$this->labelstatut_short[$statut]; + if ($mode == 3) return img_picto($this->labelstatut[$statut], $statuttrans); + if ($mode == 4) return img_picto($this->labelstatut[$statut],$statuttrans).' '.$this->labelstatut[$statut]; + if ($mode == 5) return ''.$this->labelstatut_short[$statut].' '.img_picto($this->labelstatut_short[$statut],$statuttrans); + } + + + /** + * Load indicators for dashboard (this->nbtodo and this->nbtodolate) + * + * @param User $user Object user + * @param int $mode "opened" for proposal to close, "signed" for proposal to invoice + * @return int <0 if KO, >0 if OK + */ + function load_board($user,$mode) + { + global $conf, $user; + + $now=dol_now(); + + $this->nbtodo=$this->nbtodolate=0; + $clause = " WHERE"; + + $sql = "SELECT p.rowid, p.ref, p.datec as datec, p.fin_validite as datefin"; + $sql.= " FROM ".MAIN_DB_PREFIX."propal as p"; + if (!$user->rights->societe->client->voir && !$user->societe_id) + { + $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."societe_commerciaux as sc ON p.fk_soc = sc.fk_soc"; + $sql.= " WHERE sc.fk_user = " .$user->id; + $clause = " AND"; + } + $sql.= $clause." p.entity = ".$conf->entity; + if ($mode == 'opened') $sql.= " AND p.fk_statut = 1"; + if ($mode == 'signed') $sql.= " AND p.fk_statut = 2"; + if ($user->societe_id) $sql.= " AND p.fk_soc = ".$user->societe_id; + + $resql=$this->db->query($sql); + if ($resql) + { + if ($mode == 'opened') $delay_warning=$conf->propal->cloture->warning_delay; + if ($mode == 'signed') $delay_warning=$conf->propal->facturation->warning_delay; + + // This assignment in condition is not a bug. It allows walking the results. + while ($obj=$this->db->fetch_object($resql)) + { + $this->nbtodo++; + if ($mode == 'opened') + { + $datelimit = $this->db->jdate($obj->datefin); + if ($datelimit < ($now - $delay_warning)) + { + $this->nbtodolate++; + } + } + // TODO Definir regle des propales a facturer en retard + // if ($mode == 'signed' && ! count($this->FactureListeArray($obj->rowid))) $this->nbtodolate++; + } + return 1; + } + else + { + $this->error=$this->db->error(); + return -1; + } + } + + + /** + * Initialise an instance with random values. + * Used to build previews or test instances. + * id must be 0 if object instance is a specimen. + * + * @return void + */ + function initAsSpecimen() + { + global $user,$langs,$conf; + + // Charge tableau des produits prodids + $prodids = array(); + $sql = "SELECT rowid"; + $sql.= " FROM ".MAIN_DB_PREFIX."product"; + $sql.= " WHERE entity IN (".getEntity('product', 1).")"; + $resql = $this->db->query($sql); + if ($resql) + { + $num_prods = $this->db->num_rows($resql); + $i = 0; + while ($i < $num_prods) + { + $i++; + $row = $this->db->fetch_row($resql); + $prodids[$i] = $row[0]; + } + } + + // Initialise parametres + $this->id=0; + $this->ref = 'SPECIMEN'; + $this->ref_client='NEMICEPS'; + $this->specimen=1; + $this->socid = 1; + $this->date = time(); + $this->fin_validite = $this->date+3600*24*30; + $this->cond_reglement_id = 1; + $this->cond_reglement_code = 'RECEP'; + $this->mode_reglement_id = 7; + $this->mode_reglement_code = 'CHQ'; + $this->availability_id = 1; + $this->availability_code = 'AV_NOW'; + $this->demand_reason_id = 1; + $this->demand_reason_code = 'SRC_00'; + $this->note_public='This is a comment (public)'; + $this->note_private='This is a comment (private)'; + // Lines + $nbp = 5; + $xnbp = 0; + while ($xnbp < $nbp) + { + $line=new PropaleLigne($this->db); + $line->desc=$langs->trans("Description")." ".$xnbp; + $line->qty=1; + $line->subprice=100; + $line->price=100; + $line->tva_tx=19.6; + $line->localtax1_tx=0; + $line->localtax2_tx=0; + if ($xnbp == 2) + { + $line->total_ht=50; + $line->total_ttc=59.8; + $line->total_tva=9.8; + $line->remise_percent=50; + } + else + { + $line->total_ht=100; + $line->total_ttc=119.6; + $line->total_tva=19.6; + $line->remise_percent=00; + } + + $prodid = rand(1, $num_prods); + $line->fk_product=$prodids[$prodid]; + + $this->lines[$xnbp]=$line; + + $this->total_ht += $line->total_ht; + $this->total_tva += $line->total_tva; + $this->total_ttc += $line->total_ttc; + + $xnbp++; + } + } + + /** + * Charge indicateurs this->nb de tableau de bord + * + * @return int <0 if ko, >0 if ok + */ + function load_state_board() + { + global $conf, $user; + + $this->nb=array(); + $clause = "WHERE"; + + $sql = "SELECT count(p.rowid) as nb"; + $sql.= " FROM ".MAIN_DB_PREFIX."propal as p"; + $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."societe as s ON p.fk_soc = s.rowid"; + if (!$user->rights->societe->client->voir && !$user->societe_id) + { + $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."societe_commerciaux as sc ON s.rowid = sc.fk_soc"; + $sql.= " WHERE sc.fk_user = " .$user->id; + $clause = "AND"; + } + $sql.= " ".$clause." p.entity = ".$conf->entity; + + $resql=$this->db->query($sql); + if ($resql) + { + // This assignment in condition is not a bug. It allows walking the results. + while ($obj=$this->db->fetch_object($resql)) + { + $this->nb["proposals"]=$obj->nb; + } + $this->db->free($resql); + return 1; + } + else + { + dol_print_error($this->db); + $this->error=$this->db->error(); + return -1; + } + } + + + /** + * Returns the reference to the following non used Proposal used depending on the active numbering module + * defined into PROPALE_ADDON + * + * @param Societe $soc Object thirdparty + * @return string Reference libre pour la propale + */ + function getNextNumRef($soc) + { + global $conf, $db, $langs; + $langs->load("propal"); + + if (! empty($conf->global->PROPALE_ADDON)) + { + $mybool=false; + + $file = $conf->global->PROPALE_ADDON.".php"; + $classname = $conf->global->PROPALE_ADDON; + + // Include file with class + $dirmodels = array_merge(array('/'), (array) $conf->modules_parts['models']); + foreach ($dirmodels as $reldir) { + + $dir = dol_buildpath($reldir."core/modules/propale/"); + + // Load file with numbering class (if found) + $mybool|=@include_once $dir.$file; + } + + if (! $mybool) + { + dol_print_error('',"Failed to include file ".$file); + return ''; + } + + $obj = new $classname(); + $numref = ""; + $numref = $obj->getNextValue($soc,$this); + + if ($numref != "") + { + return $numref; + } + else + { + $this->error=$obj->error; + //dol_print_error($db,"Propale::getNextNumRef ".$obj->error); + return ""; + } + } + else + { + $langs->load("errors"); + print $langs->trans("Error")." ".$langs->trans("ErrorModuleSetupNotComplete"); + return ""; + } + } + + /** + * Return clicable link of object (with eventually picto) + * + * @param int $withpicto Add picto into link + * @param string $option Where point the link ('compta', 'expedition', 'document', ...) + * @param string $get_params Parametres added to url + * @return string String with URL + */ + function getNomUrl($withpicto=0,$option='', $get_params='') + { + global $langs; + + $result=''; + $label=$langs->trans("ShowPropal").': '.$this->ref; + if (! empty($this->ref_client)) + $label.= '
'.$langs->trans('RefCustomer').': '.$this->ref_client; + $linkclose = '" title="'.dol_escape_htmltag($label, 1).'" class="classfortooltip">'; + if ($option == '') { + $lien = ''; + + $picto='propal'; + + + if ($withpicto) + $result.=($lien.img_object($label, $picto, 'class="classfortooltip"').$lienfin); + if ($withpicto && $withpicto != 2) + $result.=' '; + $result.=$lien.$this->ref.$lienfin; + return $result; + } + + /** + * Retrieve an array of propal lines + * + * @return int <0 if ko, >0 if ok + */ + function getLinesArray() + { + $sql = 'SELECT pt.rowid, pt.label as custom_label, pt.description, 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, pt.fk_product_fournisseur_price as fk_fournprice, pt.buy_price_ht as pa_ht, pt.special_code, pt.localtax1_tx, pt.localtax2_tx,'; + $sql.= ' pt.date_start, pt.date_end, pt.product_type, pt.rang, pt.fk_parent_line,'; + $sql.= ' p.label as product_label, p.ref, p.fk_product_type, p.rowid as prodid,'; + $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 = '.$this->id; + $sql.= ' ORDER BY pt.rang ASC, pt.rowid'; + + dol_syslog(get_class($this).'::getLinesArray', LOG_DEBUG); + $resql = $this->db->query($sql); + if ($resql) + { + $num = $this->db->num_rows($resql); + $i = 0; + + while ($i < $num) + { + $obj = $this->db->fetch_object($resql); + + $this->lines[$i] = new PropaleLigne($this->db); + $this->lines[$i]->id = $obj->rowid; // for backward compatibility + $this->lines[$i]->rowid = $obj->rowid; + $this->lines[$i]->label = $obj->custom_label; + $this->lines[$i]->description = $obj->description; + $this->lines[$i]->fk_product = $obj->fk_product; + $this->lines[$i]->ref = $obj->ref; + $this->lines[$i]->product_label = $obj->product_label; + $this->lines[$i]->product_desc = $obj->product_desc; + $this->lines[$i]->fk_product_type = $obj->fk_product_type; // deprecated + $this->lines[$i]->product_type = $obj->product_type; + $this->lines[$i]->qty = $obj->qty; + $this->lines[$i]->subprice = $obj->subprice; + $this->lines[$i]->fk_remise_except = $obj->fk_remise_except; + $this->lines[$i]->remise_percent = $obj->remise_percent; + $this->lines[$i]->tva_tx = $obj->tva_tx; + $this->lines[$i]->info_bits = $obj->info_bits; + $this->lines[$i]->total_ht = $obj->total_ht; + $this->lines[$i]->total_tva = $obj->total_tva; + $this->lines[$i]->total_ttc = $obj->total_ttc; + $this->lines[$i]->fk_fournprice = $obj->fk_fournprice; + $marginInfos = getMarginInfos($obj->subprice, $obj->remise_percent, $obj->tva_tx, $obj->localtax1_tx, $obj->localtax2_tx, $this->lines[$i]->fk_fournprice, $obj->pa_ht); + $this->lines[$i]->pa_ht = $marginInfos[0]; + $this->lines[$i]->marge_tx = $marginInfos[1]; + $this->lines[$i]->marque_tx = $marginInfos[2]; + $this->lines[$i]->fk_parent_line = $obj->fk_parent_line; + $this->lines[$i]->special_code = $obj->special_code; + $this->lines[$i]->rang = $obj->rang; + $this->lines[$i]->date_start = $this->db->jdate($obj->date_start); + $this->lines[$i]->date_end = $this->db->jdate($obj->date_end); + + $i++; + } + $this->db->free($resql); + + return 1; + } + else + { + $this->error=$this->db->error(); + return -1; + } + } + + /** + * Create a document onto disk according to template module. + * + * @param string $modele Force model to use ('' to not force) + * @param Translate $outputlangs Object langs to use for output + * @param int $hidedetails Hide details of lines + * @param int $hidedesc Hide description + * @param int $hideref Hide ref + * @return int 0 if KO, 1 if OK + */ + public function generateDocument($modele, $outputlangs, $hidedetails=0, $hidedesc=0, $hideref=0) + { + global $conf,$user,$langs; + + $langs->load("propale"); + + // Positionne le modele sur le nom du modele a utiliser + if (! dol_strlen($modele)) + { + if (! empty($conf->global->PROPALE_ADDON_PDF)) + { + $modele = $conf->global->PROPALE_ADDON_PDF; + } + else + { + $modele = 'azur'; + } + } + + $modelpath = "core/modules/propale/doc/"; + + return $this->commonGenerateDocument($modelpath, $modele, $outputlangs, $hidedetails, $hidedesc, $hideref); + } + + +} + + +/** + * \class PropaleLigne + * \brief Class to manage commercial proposal lines + */ +class PropaleLigne extends CommonObject +{ + var $db; + var $error; + + public $element='propaldet'; + public $table_element='propaldet'; + + var $oldline; + + // From llx_propaldet + var $rowid; + var $fk_propal; + var $fk_parent_line; + var $desc; // Description ligne + var $fk_product; // Id produit predefini + var $product_type = 0; // Type 0 = product, 1 = Service + + var $qty; + var $tva_tx; + var $subprice; + var $remise_percent; + var $fk_remise_except; + + var $rang = 0; + + var $fk_fournprice; + var $pa_ht; + var $marge_tx; + var $marque_tx; + + var $special_code; // Tag for special lines (exlusive tags) + // 1: frais de port + // 2: ecotaxe + // 3: option line (when qty = 0) + + var $info_bits = 0; // Liste d'options cumulables: + // Bit 0: 0 si TVA normal - 1 si TVA NPR + // Bit 1: 0 ligne normale - 1 si ligne de remise fixe + + var $total_ht; // Total HT de la ligne toute quantite et incluant la remise ligne + var $total_tva; // Total TVA de la ligne toute quantite et incluant la remise ligne + var $total_ttc; // Total TTC de la ligne toute quantite et incluant la remise ligne + + // Ne plus utiliser + var $remise; + var $price; + + // From llx_product + var $ref; // Reference produit + var $libelle; // Label produit + var $product_desc; // Description produit + + var $localtax1_tx; // Local tax 1 + var $localtax2_tx; // Local tax 2 + var $localtax1_type; // Local tax 1 type + var $localtax2_type; // Local tax 2 type + var $total_localtax1; // Line total local tax 1 + var $total_localtax2; // Line total local tax 2 + + var $date_start; + var $date_end; + + var $skip_update_total; // Skip update price total for special lines + + /** + * Class line Contructor + * + * @param DoliDB $db Database handler + */ + function __construct($db) + { + $this->db= $db; + } + + /** + * Retrieve the propal line object + * + * @param int $rowid Propal line id + * @return int <0 if KO, >0 if OK + */ + function fetch($rowid) + { + $sql = 'SELECT pd.rowid, pd.fk_propal, pd.fk_parent_line, pd.fk_product, pd.label as custom_label, pd.description, pd.price, pd.qty, pd.tva_tx,'; + $sql.= ' pd.remise, pd.remise_percent, pd.fk_remise_except, pd.subprice,'; + $sql.= ' pd.info_bits, pd.total_ht, pd.total_tva, pd.total_ttc, pd.fk_product_fournisseur_price as fk_fournprice, pd.buy_price_ht as pa_ht, pd.special_code, pd.rang,'; + $sql.= ' pd.localtax1_tx, pd.localtax2_tx, pd.total_localtax1, pd.total_localtax2,'; + $sql.= ' p.ref as product_ref, p.label as product_label, p.description as product_desc,'; + $sql.= ' pd.date_start, pd.date_end, pd.product_type'; + $sql.= ' FROM '.MAIN_DB_PREFIX.'propaldet as pd'; + $sql.= ' LEFT JOIN '.MAIN_DB_PREFIX.'product as p ON pd.fk_product = p.rowid'; + $sql.= ' WHERE pd.rowid = '.$rowid; + + $result = $this->db->query($sql); + if ($result) + { + $objp = $this->db->fetch_object($result); + + $this->rowid = $objp->rowid; + $this->fk_propal = $objp->fk_propal; + $this->fk_parent_line = $objp->fk_parent_line; + $this->label = $objp->custom_label; + $this->desc = $objp->description; + $this->qty = $objp->qty; + $this->price = $objp->price; // deprecated + $this->subprice = $objp->subprice; + $this->tva_tx = $objp->tva_tx; + $this->remise = $objp->remise; + $this->remise_percent = $objp->remise_percent; + $this->fk_remise_except = $objp->fk_remise_except; + $this->fk_product = $objp->fk_product; + $this->info_bits = $objp->info_bits; + + $this->total_ht = $objp->total_ht; + $this->total_tva = $objp->total_tva; + $this->total_ttc = $objp->total_ttc; + + $this->fk_fournprice = $objp->fk_fournprice; + + $marginInfos = getMarginInfos($objp->subprice, $objp->remise_percent, $objp->tva_tx, $objp->localtax1_tx, $objp->localtax2_tx, $this->fk_fournprice, $objp->pa_ht); + $this->pa_ht = $marginInfos[0]; + $this->marge_tx = $marginInfos[1]; + $this->marque_tx = $marginInfos[2]; + + $this->special_code = $objp->special_code; + $this->product_type = $objp->product_type; + $this->rang = $objp->rang; + + $this->ref = $objp->product_ref; // deprecated + $this->product_ref = $objp->product_ref; + $this->libelle = $objp->product_label; // deprecated + $this->product_label = $objp->product_label; + $this->product_desc = $objp->product_desc; + + $this->date_start = $this->db->jdate($objp->date_start); + $this->date_end = $this->db->jdate($objp->date_end); + + $this->db->free($result); + } + else + { + dol_print_error($this->db); + } + } + + /** + * Insert object line propal in database + * + * @param int $notrigger 1=Does not execute triggers, 0= execuete triggers + * @return int <0 if KO, >0 if OK + */ + function insert($notrigger=0) + { + global $conf,$langs,$user; + + $error=0; + + dol_syslog(get_class($this)."::insert rang=".$this->rang); + + // Clean parameters + if (empty($this->tva_tx)) $this->tva_tx=0; + if (empty($this->localtax1_tx)) $this->localtax1_tx=0; + if (empty($this->localtax2_tx)) $this->localtax2_tx=0; + if (empty($this->localtax1_type)) $this->localtax1_type=0; + if (empty($this->localtax2_type)) $this->localtax2_type=0; + if (empty($this->total_localtax1)) $this->total_localtax1=0; + if (empty($this->total_localtax2)) $this->total_localtax2=0; + if (empty($this->rang)) $this->rang=0; + if (empty($this->remise)) $this->remise=0; + if (empty($this->remise_percent)) $this->remise_percent=0; + if (empty($this->info_bits)) $this->info_bits=0; + if (empty($this->special_code)) $this->special_code=0; + if (empty($this->fk_parent_line)) $this->fk_parent_line=0; + if (empty($this->fk_fournprice)) $this->fk_fournprice=0; + + if (empty($this->pa_ht)) $this->pa_ht=0; + + // si prix d'achat non renseigne et utilise pour calcul des marges alors prix achat = prix vente + if ($this->pa_ht == 0) { + if ($this->subprice > 0 && (isset($conf->global->ForceBuyingPriceIfNull) && $conf->global->ForceBuyingPriceIfNull == 1)) + $this->pa_ht = $this->subprice * (1 - $this->remise_percent / 100); + } + + // Check parameters + if ($this->product_type < 0) return -1; + + $this->db->begin(); + + // Insert line into database + $sql = 'INSERT INTO '.MAIN_DB_PREFIX.'propaldet'; + $sql.= ' (fk_propal, fk_parent_line, label, description, fk_product, product_type,'; + $sql.= ' fk_remise_except, qty, tva_tx, localtax1_tx, localtax2_tx, localtax1_type, localtax2_type,'; + $sql.= ' subprice, remise_percent, '; + $sql.= ' info_bits, '; + $sql.= ' total_ht, total_tva, total_localtax1, total_localtax2, total_ttc, fk_product_fournisseur_price, buy_price_ht, special_code, rang,'; + $sql.= ' date_start, date_end)'; + $sql.= " VALUES (".$this->fk_propal.","; + $sql.= " ".($this->fk_parent_line>0?"'".$this->fk_parent_line."'":"null").","; + $sql.= " ".(! empty($this->label)?"'".$this->db->escape($this->label)."'":"null").","; + $sql.= " '".$this->db->escape($this->desc)."',"; + $sql.= " ".($this->fk_product?"'".$this->fk_product."'":"null").","; + $sql.= " '".$this->product_type."',"; + $sql.= " ".($this->fk_remise_except?"'".$this->fk_remise_except."'":"null").","; + $sql.= " ".price2num($this->qty).","; + $sql.= " ".price2num($this->tva_tx).","; + $sql.= " ".price2num($this->localtax1_tx).","; + $sql.= " ".price2num($this->localtax2_tx).","; + $sql.= " '".$this->localtax1_type."',"; + $sql.= " '".$this->localtax2_type."',"; + $sql.= " ".($this->subprice?price2num($this->subprice):"null").","; + $sql.= " ".price2num($this->remise_percent).","; + $sql.= " ".(isset($this->info_bits)?"'".$this->info_bits."'":"null").","; + $sql.= " ".price2num($this->total_ht).","; + $sql.= " ".price2num($this->total_tva).","; + $sql.= " ".price2num($this->total_localtax1).","; + $sql.= " ".price2num($this->total_localtax2).","; + $sql.= " ".price2num($this->total_ttc).","; + $sql.= " ".(!empty($this->fk_fournprice)?"'".$this->fk_fournprice."'":"null").","; + $sql.= " ".(isset($this->pa_ht)?"'".price2num($this->pa_ht)."'":"null").","; + $sql.= ' '.$this->special_code.','; + $sql.= ' '.$this->rang.','; + $sql.= " ".(! empty($this->date_start)?"'".$this->db->idate($this->date_start)."'":"null").','; + $sql.= " ".(! empty($this->date_end)?"'".$this->db->idate($this->date_end)."'":"null"); + $sql.= ')'; + + dol_syslog(get_class($this).'::insert', LOG_DEBUG); + $resql=$this->db->query($sql); + if ($resql) + { + $this->rowid=$this->db->last_insert_id(MAIN_DB_PREFIX.'propaldet'); + + if (empty($conf->global->MAIN_EXTRAFIELDS_DISABLED)) // For avoid conflicts if trigger used + { + $this->id=$this->rowid; + $result=$this->insertExtraFields(); + if ($result < 0) + { + $error++; + } + } + + if (! $notrigger) + { + // Call trigger + $result=$this->call_trigger('LINEPROPAL_INSERT',$user); + if ($result < 0) + { + $this->db->rollback(); + return -1; + } + // End call triggers + } + + $this->db->commit(); + return 1; + } + else + { + $this->error=$this->db->error()." sql=".$sql; + $this->db->rollback(); + return -1; + } + } + + /** + * Delete line in database + * + * @return int <0 if ko, >0 if ok + */ + function delete() + { + global $conf,$langs,$user; + + $error=0; + $this->db->begin(); + + $sql = "DELETE FROM ".MAIN_DB_PREFIX."propaldet WHERE rowid = ".$this->rowid; + dol_syslog("PropaleLigne::delete", LOG_DEBUG); + if ($this->db->query($sql) ) + { + + // Remove extrafields + if ((! $error) && (empty($conf->global->MAIN_EXTRAFIELDS_DISABLED))) // For avoid conflicts if trigger used + { + $this->id=$this->rowid; + $result=$this->deleteExtraFields(); + if ($result < 0) + { + $error++; + dol_syslog(get_class($this)."::delete error -4 ".$this->error, LOG_ERR); + } + } + + // Call trigger + $result=$this->call_trigger('LINEPROPAL_DELETE',$user); + if ($result < 0) + { + $this->db->rollback(); + return -1; + } + // End call triggers + + $this->db->commit(); + + return 1; + } + else + { + $this->error=$this->db->error()." sql=".$sql; + $this->db->rollback(); + return -1; + } + } + + /** + * Update propal line object into DB + * + * @param int $notrigger 1=Does not execute triggers, 0= execuete triggers + * @return int <0 if ko, >0 if ok + */ + function update($notrigger=0) + { + global $conf,$langs,$user; + + $error=0; + + // Clean parameters + if (empty($this->tva_tx)) $this->tva_tx=0; + if (empty($this->localtax1_tx)) $this->localtax1_tx=0; + if (empty($this->localtax2_tx)) $this->localtax2_tx=0; + if (empty($this->total_localtax1)) $this->total_localtax1=0; + if (empty($this->total_localtax2)) $this->total_localtax2=0; + if (empty($this->localtax1_type)) $this->localtax1_type=0; + if (empty($this->localtax2_type)) $this->localtax2_type=0; + if (empty($this->marque_tx)) $this->marque_tx=0; + if (empty($this->marge_tx)) $this->marge_tx=0; + if (empty($this->price)) $this->price=0; // TODO A virer + if (empty($this->remise)) $this->remise=0; // TODO A virer + if (empty($this->remise_percent)) $this->remise_percent=0; + if (empty($this->info_bits)) $this->info_bits=0; + if (empty($this->special_code)) $this->special_code=0; + if (empty($this->fk_parent_line)) $this->fk_parent_line=0; + if (empty($this->fk_fournprice)) $this->fk_fournprice=0; + + if (empty($this->pa_ht)) $this->pa_ht=0; + + // si prix d'achat non renseigne et utilise pour calcul des marges alors prix achat = prix vente + if ($this->pa_ht == 0) { + if ($this->subprice > 0 && (isset($conf->global->ForceBuyingPriceIfNull) && $conf->global->ForceBuyingPriceIfNull == 1)) + $this->pa_ht = $this->subprice * (1 - $this->remise_percent / 100); + } + + $this->db->begin(); + + // Mise a jour ligne en base + $sql = "UPDATE ".MAIN_DB_PREFIX."propaldet SET"; + $sql.= " description='".$this->db->escape($this->desc)."'"; + $sql.= " , label=".(! empty($this->label)?"'".$this->db->escape($this->label)."'":"null"); + $sql.= " , product_type=".$this->product_type; + $sql.= " , tva_tx='".price2num($this->tva_tx)."'"; + $sql.= " , localtax1_tx=".price2num($this->localtax1_tx); + $sql.= " , localtax2_tx=".price2num($this->localtax2_tx); + $sql.= " , localtax1_type='".$this->localtax1_type."'"; + $sql.= " , localtax2_type='".$this->localtax2_type."'"; + $sql.= " , qty='".price2num($this->qty)."'"; + $sql.= " , subprice=".price2num($this->subprice).""; + $sql.= " , remise_percent=".price2num($this->remise_percent).""; + $sql.= " , price=".price2num($this->price).""; // TODO A virer + $sql.= " , remise=".price2num($this->remise).""; // TODO A virer + $sql.= " , info_bits='".$this->info_bits."'"; + if (empty($this->skip_update_total)) + { + $sql.= " , total_ht=".price2num($this->total_ht).""; + $sql.= " , total_tva=".price2num($this->total_tva).""; + $sql.= " , total_ttc=".price2num($this->total_ttc).""; + $sql.= " , total_localtax1=".price2num($this->total_localtax1).""; + $sql.= " , total_localtax2=".price2num($this->total_localtax2).""; + } + $sql.= " , fk_product_fournisseur_price=".(! empty($this->fk_fournprice)?"'".$this->fk_fournprice."'":"null"); + $sql.= " , buy_price_ht=".price2num($this->pa_ht); + if (strlen($this->special_code)) $sql.= " , special_code=".$this->special_code; + $sql.= " , fk_parent_line=".($this->fk_parent_line>0?$this->fk_parent_line:"null"); + if (! empty($this->rang)) $sql.= ", rang=".$this->rang; + $sql.= " , date_start=".(! empty($this->date_start)?"'".$this->db->idate($this->date_start)."'":"null"); + $sql.= " , date_end=".(! empty($this->date_end)?"'".$this->db->idate($this->date_end)."'":"null"); + $sql.= " WHERE rowid = ".$this->rowid; + + dol_syslog(get_class($this)."::update", LOG_DEBUG); + $resql=$this->db->query($sql); + if ($resql) + { + if (empty($conf->global->MAIN_EXTRAFIELDS_DISABLED)) // For avoid conflicts if trigger used + { + $this->id=$this->rowid; + $result=$this->insertExtraFields(); + if ($result < 0) + { + $error++; + } + } + + if (! $notrigger) + { + // Call trigger + $result=$this->call_trigger('LINEPROPAL_UPDATE',$user); + if ($result < 0) + { + $this->db->rollback(); + return -1; + } + // End call triggers + } + + $this->db->commit(); + return 1; + } + else + { + $this->error=$this->db->error(); + $this->db->rollback(); + return -2; + } + } + + /** + * Update DB line fields total_xxx + * Used by migration + * + * @return int <0 if ko, >0 if ok + */ + function update_total() + { + $this->db->begin(); + + // Mise a jour ligne en base + $sql = "UPDATE ".MAIN_DB_PREFIX."propaldet SET"; + $sql.= " total_ht=".price2num($this->total_ht,'MT').""; + $sql.= ",total_tva=".price2num($this->total_tva,'MT').""; + $sql.= ",total_ttc=".price2num($this->total_ttc,'MT').""; + $sql.= " WHERE rowid = ".$this->rowid; + + dol_syslog("PropaleLigne::update_total", LOG_DEBUG); + + $resql=$this->db->query($sql); + if ($resql) + { + $this->db->commit(); + return 1; + } + else + { + $this->error=$this->db->error(); + $this->db->rollback(); + return -2; + } + } + +} + diff --git a/htdocs/comm/askpricesupplier/class/index.html b/htdocs/comm/askpricesupplier/class/index.html new file mode 100644 index 00000000000..e69de29bb2d diff --git a/htdocs/comm/askpricesupplier/contact.php b/htdocs/comm/askpricesupplier/contact.php new file mode 100644 index 00000000000..6a0a1076e62 --- /dev/null +++ b/htdocs/comm/askpricesupplier/contact.php @@ -0,0 +1,223 @@ + + * Copyright (C) 2005-2009 Destailleur Laurent + * Copyright (C) 2005-2012 Regis Houssin + * Copyright (C) 2011-2012 Philippe Grand + * + * 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 3 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, see . + */ + +/** + * \file htdocs/comm/propal/contact.php + * \ingroup propal + * \brief Onglet de gestion des contacts de propal + */ + +require '../../main.inc.php'; +require_once DOL_DOCUMENT_ROOT.'/comm/propal/class/propal.class.php'; +require_once DOL_DOCUMENT_ROOT.'/contact/class/contact.class.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/propal.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/core/class/html.formother.class.php'; +require_once DOL_DOCUMENT_ROOT.'/core/class/html.formcompany.class.php'; + +$langs->load("facture"); +$langs->load("orders"); +$langs->load("sendings"); +$langs->load("companies"); + +$id=GETPOST('id','int'); +$ref= GETPOST('ref','alpha'); +$lineid=GETPOST('lineid','int'); +$action=GETPOST('action','alpha'); + +// Security check +if ($user->societe_id) $socid=$user->societe_id; +$result = restrictedArea($user, 'propal', $id); + +$object = new Propal($db); + +// Load object +if ($id > 0 || ! empty($ref)) +{ + $ret=$object->fetch($id, $ref); + if ($ret == 0) + { + $langs->load("errors"); + setEventMessage($langs->trans('ErrorRecordNotFound'), 'errors'); + $error++; + } + else if ($ret < 0) + { + setEventMessage($object->error, 'errors'); + $error++; + } +} +if (! $error) +{ + $object->fetch_thirdparty(); +} +else +{ + header('Location: '.DOL_URL_ROOT.'/comm/propal/list.php'); + exit; +} + + +/* + * Ajout d'un nouveau contact + */ + +if ($action == 'addcontact' && $user->rights->propale->creer) +{ + if ($object->id > 0) + { + $contactid = (GETPOST('userid','int') ? GETPOST('userid','int') : GETPOST('contactid','int')); + $result = $object->add_contact($contactid, $_POST["type"], $_POST["source"]); + } + + if ($result >= 0) + { + header("Location: ".$_SERVER['PHP_SELF']."?id=".$object->id); + exit; + } + else + { + if ($object->error == 'DB_ERROR_RECORD_ALREADY_EXISTS') + { + $langs->load("errors"); + setEventMessage($langs->trans("ErrorThisContactIsAlreadyDefinedAsThisType"), 'errors'); + } + else + { + setEventMessage($object->error, 'errors'); + } + } +} + +// Bascule du statut d'un contact +else if ($action == 'swapstatut' && $user->rights->propale->creer) +{ + if ($object->id > 0) + { + $result=$object->swapContactStatus(GETPOST('ligne')); + } +} + +// Efface un contact +else if ($action == 'deletecontact' && $user->rights->propale->creer) +{ + $result = $object->delete_contact($lineid); + + if ($result >= 0) + { + header("Location: ".$_SERVER['PHP_SELF']."?id=".$object->id); + exit; + } + else + { + dol_print_error($db); + } +} + +else if ($action == 'setaddress' && $user->rights->propale->creer) +{ + $result=$object->setDeliveryAddress($_POST['fk_address']); + if ($result < 0) dol_print_error($db,$object->error); +} + + +/* + * View + */ + +llxHeader('',$langs->trans('Proposal'),'EN:Commercial_Proposals|FR:Proposition_commerciale|ES:Presupuestos'); + +$form = new Form($db); +$formcompany= new FormCompany($db); +$formother = new FormOther($db); + +if ($object->id > 0) +{ + $head = propal_prepare_head($object); + dol_fiche_head($head, 'contact', $langs->trans("Proposal"), 0, 'propal'); + + /* + * Propal synthese pour rappel + */ + print ''; + + $linkback=''.$langs->trans("BackToList").''; + + // Ref + print ''; + + // Ref client + print ''; + print ''; + + // Customer + print ""; + print ''; + + // Delivery address + if (! empty($conf->global->SOCIETE_ADDRESSES_MANAGEMENT)) + { + print ''; + } + + print "
'.$langs->trans('Ref').''; + print $form->showrefnav($object,'ref',$linkback,1,'ref','ref',''); + print '
'; + print ''; + print '
'; + print $langs->trans('RefCustomer').''; + print '
'; + print '
'; + print $object->ref_client; + print '
".$langs->trans("Company")."'.$object->client->getNomUrl(1).'
'; + print ''; + + if ($action != 'editdelivery_address' && ! empty($object->brouillon)) + print ''; + print '
'; + print $langs->trans('DeliveryAddress'); + print 'socid.'&id='.$object->id.'">'.img_edit($langs->transnoentitiesnoconv('SetDeliveryAddress'),1).'
'; + print '
'; + + if ($action == 'editdelivery_address') + { + $formother->form_address($_SERVER['PHP_SELF'].'?id='.$object->id,$object->fk_delivery_address,$object->socid,'fk_address','propal',$object->id); + } + else + { + $formother->form_address($_SERVER['PHP_SELF'].'?id='.$object->id,$object->fk_delivery_address,$object->socid,'none','propal',$object->id); + } + print '
"; + + print ''; + + print '
'; + + // Contacts lines (modules that overwrite templates must declare this into descriptor) + $dirtpls=array_merge($conf->modules_parts['tpl'],array('/core/tpl')); + foreach($dirtpls as $reldir) + { + $res=@include dol_buildpath($reldir.'/contacts.tpl.php'); + if ($res) break; + } +} + +llxFooter(); + +$db->close(); diff --git a/htdocs/comm/askpricesupplier/document.php b/htdocs/comm/askpricesupplier/document.php new file mode 100644 index 00000000000..d224c20bc97 --- /dev/null +++ b/htdocs/comm/askpricesupplier/document.php @@ -0,0 +1,144 @@ + + * Copyright (C) 2004-2009 Laurent Destailleur + * Copyright (C) 2005 Marc Barilley / Ocebo + * Copyright (C) 2005-2012 Regis Houssin + * Copyright (C) 2013 Cédric Salvador + * + * 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 3 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, see . + */ + +/** + * \file htdocs/comm/propal/document.php + * \ingroup propal + * \brief Management page of documents attached to a business proposal + */ + +require '../../main.inc.php'; +require_once DOL_DOCUMENT_ROOT.'/comm/propal/class/propal.class.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/propal.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/images.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/core/class/html.formfile.class.php'; + +$langs->load('compta'); +$langs->load('other'); + +$action = GETPOST('action','alpha'); +$confirm = GETPOST('confirm','alpha'); +$id = GETPOST('id','int'); +$ref = GETPOST('ref','alpha'); + +// Security check +$socid=''; +if (! empty($user->societe_id)) +{ + $action=''; + $socid = $user->societe_id; +} +$result = restrictedArea($user, 'propal', $id); + +// Get parameters +$sortfield = GETPOST("sortfield",'alpha'); +$sortorder = GETPOST("sortorder",'alpha'); +$page = GETPOST("page",'int'); +if ($page == -1) { $page = 0; } +$offset = $conf->liste_limit * $page; +$pageprev = $page - 1; +$pagenext = $page + 1; +if (! $sortorder) $sortorder="ASC"; +if (! $sortfield) $sortfield="name"; + +$object = new Propal($db); +$object->fetch($id,$ref); +if ($object->id > 0) +{ + $object->fetch_thirdparty(); + $upload_dir = $conf->propal->dir_output.'/'.dol_sanitizeFileName($object->ref); + include_once DOL_DOCUMENT_ROOT . '/core/tpl/document_actions_pre_headers.tpl.php'; +} + +/* + * Actions + */ + + + +/* + * View + */ + +llxHeader('',$langs->trans('Proposal'),'EN:Commercial_Proposals|FR:Proposition_commerciale|ES:Presupuestos'); + +$form = new Form($db); + +if ($object->id > 0) +{ + $upload_dir = $conf->propal->dir_output.'/'.dol_sanitizeFileName($object->ref); + + $head = propal_prepare_head($object); + dol_fiche_head($head, 'document', $langs->trans('Proposal'), 0, 'propal'); + + // Construit liste des fichiers + $filearray=dol_dir_list($upload_dir,"files",0,'','(\.meta|_preview\.png)$',$sortfield,(strtolower($sortorder)=='desc'?SORT_DESC:SORT_ASC),1); + $totalsize=0; + foreach($filearray as $key => $file) + { + $totalsize+=$file['size']; + } + + + print ''; + + $linkback=''.$langs->trans("BackToList").''; + + // Ref + print ''; + + // Ref client + print ''; + print ''; + + // Customer + print ""; + print ''; + + print ''; + print ''; + + print '
'.$langs->trans('Ref').''; + print $form->showrefnav($object,'ref',$linkback,1,'ref','ref',''); + print '
'; + print ''; + print '
'; + print $langs->trans('RefCustomer').''; + print '
'; + print '
'; + print $object->ref_client; + print '
".$langs->trans("Company")."'.$object->thirdparty->getNomUrl(1).'
'.$langs->trans("NbOfAttachedFiles").''.count($filearray).'
'.$langs->trans("TotalSizeOfAttachedFiles").''.$totalsize.' '.$langs->trans("bytes").'
'; + + print ''; + + $modulepart = 'propal'; + $permission = $user->rights->propal->creer; + $param = '&id=' . $object->id; + include_once DOL_DOCUMENT_ROOT . '/core/tpl/document_actions_post_headers.tpl.php'; +} +else +{ + print $langs->trans("ErrorUnknown"); +} + +llxFooter(); +$db->close(); diff --git a/htdocs/comm/askpricesupplier/index.php b/htdocs/comm/askpricesupplier/index.php new file mode 100644 index 00000000000..a0e8a3409ab --- /dev/null +++ b/htdocs/comm/askpricesupplier/index.php @@ -0,0 +1,528 @@ + + * Copyright (C) 2004-2011 Laurent Destailleur + * Copyright (C) 2005-2012 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 3 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, see . + */ + +/** + * \file htdocs/comm/propal/index.php + * \ingroup propal + * \brief Home page of proposal area + */ + +require '../../main.inc.php'; +require_once DOL_DOCUMENT_ROOT.'/core/class/html.formfile.class.php'; +require_once DOL_DOCUMENT_ROOT .'/comm/propal/class/propal.class.php'; + +$langs->load("propal"); +$langs->load("companies"); + +// Security check +$socid=GETPOST('socid','int'); +if (isset($user->societe_id) && $user->societe_id > 0) +{ + $action = ''; + $socid = $user->societe_id; +} +$result = restrictedArea($user, 'propal'); + + +/* + * View + */ +$now=dol_now(); +$propalstatic=new Propal($db); +$companystatic=new Societe($db); +$form = new Form($db); +$formfile = new FormFile($db); +$help_url="EN:Module_Commercial_Proposals|FR:Module_Propositions_commerciales|ES:Módulo_Presupuestos"; + +llxHeader("",$langs->trans("ProspectionArea"),$help_url); + +print_fiche_titre($langs->trans("ProspectionArea")); + +//print ''; +//print '
'; +print '
'; + + +/* + * Search form + */ +$var=false; +print ''; +print ''; +print ''; +print ''; +print ''; +print ''; +print ''; +print "
'.$langs->trans("SearchPropal").'
'; +print $langs->trans("Ref").':
'.$langs->trans("Other").':

\n"; + + +/* + * Statistics + */ + +$sql = "SELECT count(p.rowid), p.fk_statut"; +$sql.= " FROM ".MAIN_DB_PREFIX."societe as s"; +$sql.= ", ".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"; +$sql.= " AND p.entity = ".$conf->entity; +if ($user->societe_id) $sql.=' AND p.fk_soc = '.$user->societe_id; +if (!$user->rights->societe->client->voir && !$socid) $sql.= " AND s.rowid = sc.fk_soc AND sc.fk_user = " .$user->id; +$sql.= " AND p.fk_statut IN (0,1,2,3,4)"; +$sql.= " GROUP BY p.fk_statut"; +$resql = $db->query($sql); +if ($resql) +{ + $num = $db->num_rows($resql); + $i = 0; + + $total=0; + $totalinprocess=0; + $dataseries=array(); + $vals=array(); + // -1=Canceled, 0=Draft, 1=Validated, (2=Accepted/On process not managed for customer orders), 3=Closed (Sent/Received, billed or not) + while ($i < $num) + { + $row = $db->fetch_row($resql); + if ($row) + { + //if ($row[1]!=-1 && ($row[1]!=3 || $row[2]!=1)) + { + $vals[$row[1]]=$row[0]; + $totalinprocess+=$row[0]; + } + $total+=$row[0]; + } + $i++; + } + $db->free($resql); + + print ''; + print ''."\n"; + $var=true; + $listofstatus=array(0,1,2,3,4); + foreach ($listofstatus as $status) + { + $dataseries[]=array('label'=>$propalstatic->LibStatut($status,1),'data'=>(isset($vals[$status])?(int) $vals[$status]:0)); + if (! $conf->use_javascript_ajax) + { + $var=!$var; + print ""; + print ''; + print ''; + print "\n"; + } + } + if ($conf->use_javascript_ajax) + { + print ''; + } + //if ($totalinprocess != $total) + //print ''; + print ''; + print "
'.$langs->trans("Statistics").' - '.$langs->trans("Proposals").'
'.$propalstatic->LibStatut($status,0).''.(isset($vals[$status])?$vals[$status]:0).'
'; + $data=array('series'=>$dataseries); + dol_print_graph('stats',300,180,$data,1,'pie',1); + print '
'.$langs->trans("Total").' ('.$langs->trans("CustomersOrdersRunning").')'.$totalinprocess.'
'.$langs->trans("Total").''.$total.'

"; +} +else +{ + dol_print_error($db); +} + + +/* + * Draft proposals + */ +if (! empty($conf->propal->enabled)) +{ + $sql = "SELECT c.rowid, c.ref, s.nom as socname, s.rowid as socid, s.canvas, s.client"; + $sql.= " FROM ".MAIN_DB_PREFIX."propal as c"; + $sql.= ", ".MAIN_DB_PREFIX."societe as s"; + if (!$user->rights->societe->client->voir && !$socid) $sql.= ", ".MAIN_DB_PREFIX."societe_commerciaux as sc"; + $sql.= " WHERE c.fk_soc = s.rowid"; + $sql.= " AND c.entity = ".$conf->entity; + $sql.= " AND c.fk_statut = 0"; + if ($socid) $sql.= " AND c.fk_soc = ".$socid; + if (!$user->rights->societe->client->voir && !$socid) $sql.= " AND s.rowid = sc.fk_soc AND sc.fk_user = " .$user->id; + + $resql=$db->query($sql); + if ($resql) + { + print ''; + print ''; + print ''; + $langs->load("propal"); + $num = $db->num_rows($resql); + if ($num) + { + $i = 0; + $var = True; + while ($i < $num) + { + $var=!$var; + $obj = $db->fetch_object($resql); + print ""; + + $propalstatic->id=$obj->rowid; + $propalstatic->ref=$obj->ref; + print ''; + + $companystatic->id=$obj->socid; + $companystatic->name=$obj->socname; + $companystatic->client=$obj->client; + $companystatic->canvas=$obj->canvas; + print ''; + + print ''; + $i++; + } + } + print "
'.$langs->trans("DraftPropals").'
'.$propalstatic->getNomUrl(1).''.$companystatic->getNomUrl(1,'customer',24).'

"; + } +} + + +//print '
'; +print '
'; + + +$max=5; + +/* + * Last modified proposals + */ + +$sql = "SELECT c.rowid, c.ref, c.fk_statut, s.nom as socname, s.rowid as socid, s.canvas, s.client,"; +$sql.= " date_cloture as datec"; +$sql.= " FROM ".MAIN_DB_PREFIX."propal as c"; +$sql.= ", ".MAIN_DB_PREFIX."societe as s"; +if (!$user->rights->societe->client->voir && !$socid) $sql.= ", ".MAIN_DB_PREFIX."societe_commerciaux as sc"; +$sql.= " WHERE c.fk_soc = s.rowid"; +$sql.= " AND c.entity = ".$conf->entity; +//$sql.= " AND c.fk_statut > 2"; +if ($socid) $sql .= " AND c.fk_soc = ".$socid; +if (!$user->rights->societe->client->voir && !$socid) $sql.= " AND s.rowid = sc.fk_soc AND sc.fk_user = " .$user->id; +$sql.= " ORDER BY c.tms DESC"; +$sql.= $db->plimit($max, 0); + +$resql=$db->query($sql); +if ($resql) +{ + print ''; + print ''; + print ''; + + $num = $db->num_rows($resql); + if ($num) + { + $i = 0; + $var = True; + while ($i < $num) + { + $var=!$var; + $obj = $db->fetch_object($resql); + + print ""; + print ''; + + $companystatic->id=$obj->socid; + $companystatic->name=$obj->socname; + $companystatic->client=$obj->client; + $companystatic->canvas=$obj->canvas; + print ''; + + print ''; + print ''; + print ''; + $i++; + } + } + print "
'.$langs->trans("LastModifiedProposals",$max).'
'; + + $propalstatic->id=$obj->rowid; + $propalstatic->ref=$obj->ref; + + print ''; + print ''; + + print ''; + + print '
'; + print $propalstatic->getNomUrl(1); + print ''; + print ' '; + print ''; + $filename=dol_sanitizeFileName($obj->ref); + $filedir=$conf->propal->dir_output . '/' . dol_sanitizeFileName($obj->ref); + $urlsource=$_SERVER['PHP_SELF'].'?id='.$obj->rowid; + print $formfile->getDocumentsLink($propalstatic->element, $filename, $filedir); + print '
'; + + print '
'.$companystatic->getNomUrl(1,'customer').''.dol_print_date($db->jdate($obj->datec),'day').''.$propalstatic->LibStatut($obj->fk_statut,5).'

"; +} +else dol_print_error($db); + + +/* + * Opened proposals + */ +if (! empty($conf->propal->enabled) && $user->rights->propale->lire) +{ + $langs->load("propal"); + + $now=dol_now(); + + $sql = "SELECT s.nom as socname, s.rowid as socid, s.canvas, s.client, p.rowid as propalid, p.total as total_ttc, p.total_ht, p.ref, p.fk_statut, p.datep as dp, p.fin_validite as dfv"; + $sql.= " FROM ".MAIN_DB_PREFIX."societe as s"; + $sql.= ", ".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"; + $sql.= " AND p.entity = ".$conf->entity; + $sql.= " AND p.fk_statut = 1"; + 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; + $sql.= " ORDER BY p.rowid DESC"; + + $result=$db->query($sql); + if ($result) + { + $total = 0; + $num = $db->num_rows($result); + $i = 0; + if ($num > 0) + { + $var=true; + + print ''; + print ''; + + $nbofloop=min($num, (empty($conf->global->MAIN_MAXLIST_OVERLOAD)?500:$conf->global->MAIN_MAXLIST_OVERLOAD)); + while ($i < $nbofloop) + { + $obj = $db->fetch_object($result); + $var=!$var; + print ''; + + // Ref + print '"; + + $companystatic->id=$obj->socid; + $companystatic->name=$obj->socname; + $companystatic->client=$obj->client; + $companystatic->canvas=$obj->canvas; + print ''."\n"; + + print ''."\n"; + print ''; + print ''."\n"; + print ''."\n"; + $i++; + $total += $obj->total_ttc; + } + if ($num > $nbofloop) + { + print '"; + } + else if ($total>0) + { + print '"; + } + print "
'.$langs->trans("ProposalsOpened").' '.$num.'
'; + + $propalstatic->id=$obj->propalid; + $propalstatic->ref=$obj->ref; + + print ''; + print ''; + print ''; + print '
'; + print $propalstatic->getNomUrl(1); + print ''; + if ($db->jdate($obj->dfv) < ($now - $conf->propal->cloture->warning_delay)) print img_warning($langs->trans("Late")); + print ''; + $filename=dol_sanitizeFileName($obj->ref); + $filedir=$conf->propal->dir_output . '/' . dol_sanitizeFileName($obj->ref); + $urlsource=$_SERVER['PHP_SELF'].'?id='.$obj->propalid; + print $formfile->getDocumentsLink($propalstatic->element, $filename, $filedir); + print '
'; + + print "
'.$companystatic->getNomUrl(1,'customer',44).''; + print dol_print_date($db->jdate($obj->dp),'day').''.price($obj->total_ttc).''.$propalstatic->LibStatut($obj->fk_statut,3).'
'.$langs->trans("XMoreLines", ($num - $nbofloop))."
'.$langs->trans("Total")."".price($total)." 

"; + } + } + else + { + dol_print_error($db); + } +} + +/* + * Proposals to process + */ +/* +if (! empty($conf->propal->enabled)) +{ + $sql = "SELECT c.rowid, c.ref, c.fk_statut, s.nom as name, s.rowid as socid"; + $sql.=" FROM ".MAIN_DB_PREFIX."propal as c"; + $sql.= ", ".MAIN_DB_PREFIX."societe as s"; + if (!$user->rights->societe->client->voir && !$socid) $sql.= ", ".MAIN_DB_PREFIX."societe_commerciaux as sc"; + $sql.= " WHERE c.fk_soc = s.rowid"; + $sql.= " AND c.entity = ".$conf->entity; + $sql.= " AND c.fk_statut = 1"; + if ($socid) $sql.= " AND c.fk_soc = ".$socid; + if (!$user->rights->societe->client->voir && !$socid) $sql.= " AND s.rowid = sc.fk_soc AND sc.fk_user = " .$user->id; + $sql.= " ORDER BY c.rowid DESC"; + + $resql=$db->query($sql); + if ($resql) + { + $num = $db->num_rows($resql); + + print ''; + print ''; + print ''; + + if ($num) + { + $i = 0; + $var = True; + while ($i < $num) + { + $var=!$var; + $obj = $db->fetch_object($resql); + print ""; + print ''; + + print ''; + + print ''; + + print ''; + $i++; + } + } + + print "
'.$langs->trans("ProposalsToProcess").' '.$num.'
'; + + $propalstatic->id=$obj->rowid; + $propalstatic->ref=$obj->ref; + + print ''; + print ''; + + print ''; + + print '
'; + print $propalstatic->getNomUrl(1); + print ''; + print ' '; + print ''; + $filename=dol_sanitizeFileName($obj->ref); + $filedir=$conf->commande->dir_output . '/' . dol_sanitizeFileName($obj->ref); + $urlsource=$_SERVER['PHP_SELF'].'?id='.$obj->rowid; + print $formfile->getDocumentsLink($propalstatic->element, $filename, $filedir); + print '
'; + + print '
'.img_object($langs->trans("ShowCompany"),"company").' '.dol_trunc($obj->name,24).''.$propalstatic->LibStatut($obj->fk_statut,$obj->facture,5).'

"; + } + else dol_print_error($db); +} +*/ + +/* + * Proposal that are in a shipping process + */ +/*if (! empty($conf->propal->enabled)) +{ + $sql = "SELECT c.rowid, c.ref, c.fk_statut, c.facture, s.nom as name, s.rowid as socid"; + $sql.= " FROM ".MAIN_DB_PREFIX."commande as c"; + $sql.= ", ".MAIN_DB_PREFIX."societe as s"; + if (!$user->rights->societe->client->voir && !$socid) $sql.= ", ".MAIN_DB_PREFIX."societe_commerciaux as sc"; + $sql.= " WHERE c.fk_soc = s.rowid"; + $sql.= " AND c.entity = ".$conf->entity; + $sql.= " AND c.fk_statut = 2 "; + if ($socid) $sql.= " AND c.fk_soc = ".$socid; + if (!$user->rights->societe->client->voir && !$socid) $sql.= " AND s.rowid = sc.fk_soc AND sc.fk_user = " .$user->id; + $sql.= " ORDER BY c.rowid DESC"; + + $resql=$db->query($sql); + if ($resql) + { + $num = $db->num_rows($resql); + + print ''; + print ''; + print ''; + + if ($num) + { + $i = 0; + $var = True; + while ($i < $num) + { + $var=!$var; + $obj = $db->fetch_object($resql); + print ""; + print ''; + + print ''; + + print ''; + + print ''; + $i++; + } + } + print "
'.$langs->trans("OnProcessOrders").' '.$num.'
'; + + $propalstatic->id=$obj->rowid; + $propalstatic->ref=$obj->ref; + + print ''; + print ''; + + print ''; + + print '
'; + print $propalstatic->getNomUrl(1); + print ''; + print ' '; + print ''; + $filename=dol_sanitizeFileName($obj->ref); + $filedir=$conf->commande->dir_output . '/' . dol_sanitizeFileName($obj->ref); + $urlsource=$_SERVER['PHP_SELF'].'?id='.$obj->rowid; + print $formfile->getDocumentsLink($propalstatic->element, $filename, $filedir); + print '
'; + + print '
'.img_object($langs->trans("ShowCompany"),"company").' '.$obj->name.''.$propalstatic->LibStatut($obj->fk_statut,$obj->facture,5).'

"; + } + else dol_print_error($db); +} +*/ + +//print '
'; +print ''; + + +llxFooter(); + +$db->close(); diff --git a/htdocs/comm/askpricesupplier/info.php b/htdocs/comm/askpricesupplier/info.php new file mode 100644 index 00000000000..d3a3899537b --- /dev/null +++ b/htdocs/comm/askpricesupplier/info.php @@ -0,0 +1,65 @@ + + * Copyright (C) 2004-2006 Laurent Destailleur + * Copyright (C) 2005-2012 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 3 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, see . + */ + +/** + * \file htdocs/comm/propal/info.php + * \ingroup propal + * \brief Page d'affichage des infos d'une proposition commerciale + */ + +require '../../main.inc.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/comm/propal/class/propal.class.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/propal.lib.php'; + +$langs->load('propal'); +$langs->load('compta'); + +$id=GETPOST('id','int'); +$socid=GETPOST('socid','int'); + +// Security check +if (! empty($user->societe_id)) $socid=$user->societe_id; +$result = restrictedArea($user, 'propal', $id); + + +/* + * View + */ + +llxHeader('',$langs->trans('Proposal'),'EN:Commercial_Proposals|FR:Proposition_commerciale|ES:Presupuestos'); + +$object = new Propal($db); +$object->fetch($id); +$object->fetch_thirdparty(); + +$head = propal_prepare_head($object); +dol_fiche_head($head, 'info', $langs->trans('Proposal'), 0, 'propal'); + +$object->info($object->id); + +print '
'; +dol_print_object_info($object); +print '
'; + +print ''; + + +llxFooter(); +$db->close(); diff --git a/htdocs/comm/askpricesupplier/list.php b/htdocs/comm/askpricesupplier/list.php new file mode 100644 index 00000000000..c28128e81c5 --- /dev/null +++ b/htdocs/comm/askpricesupplier/list.php @@ -0,0 +1,464 @@ + + * Copyright (C) 2004-2011 Laurent Destailleur + * Copyright (C) 2004 Eric Seigne + * Copyright (C) 2005 Marc Barilley / Ocebo + * Copyright (C) 2005-2013 Regis Houssin + * Copyright (C) 2006 Andre Cianfarani + * Copyright (C) 2010-2011 Juanjo Menent + * Copyright (C) 2010-2011 Philippe Grand + * Copyright (C) 2012 Christophe Battarel + * Copyright (C) 2013 Cédric Salvador +* + * 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 3 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, see . + */ + +/** + * \file htdocs/comm/propal/list.php + * \ingroup propal + * \brief Page of commercial proposals card and list + */ + +require '../../main.inc.php'; +require_once DOL_DOCUMENT_ROOT.'/core/class/html.formother.class.php'; +require_once DOL_DOCUMENT_ROOT.'/core/class/html.formfile.class.php'; +require_once DOL_DOCUMENT_ROOT.'/core/class/html.formpropal.class.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/comm/propal/class/propal.class.php'; +if (! empty($conf->projet->enabled)) + require_once DOL_DOCUMENT_ROOT.'/projet/class/project.class.php'; + +$langs->load('companies'); +$langs->load('propal'); +$langs->load('compta'); +$langs->load('bills'); +$langs->load('orders'); +$langs->load('products'); + +$socid=GETPOST('socid','int'); + +$search_user=GETPOST('search_user','int'); +$search_sale=GETPOST('search_sale','int'); +$search_ref=GETPOST('sf_ref')?GETPOST('sf_ref','alpha'):GETPOST('search_ref','alpha'); +$search_refcustomer=GETPOST('search_refcustomer','alpha'); +$search_societe=GETPOST('search_societe','alpha'); +$search_montant_ht=GETPOST('search_montant_ht','alpha'); +$search_author=GETPOST('search_author','alpha'); +$search_town=GETPOST('search_town','alpha'); +$viewstatut=$db->escape(GETPOST('viewstatut')); +$object_statut=$db->escape(GETPOST('propal_statut')); + +$sall=GETPOST("sall"); +$mesg=(GETPOST("msg") ? GETPOST("msg") : GETPOST("mesg")); +$year=GETPOST("year"); +$month=GETPOST("month"); + +// Nombre de ligne pour choix de produit/service predefinis +$NBLINES=4; + +// Security check +$module='propal'; +$dbtable=''; +$objectid=''; +if (! empty($user->societe_id)) $socid=$user->societe_id; +if (! empty($socid)) +{ + $objectid=$socid; + $module='societe'; + $dbtable='&societe'; +} +$result = restrictedArea($user, $module, $objectid, $dbtable); + +if (GETPOST("button_removefilter") || GETPOST("button_removefilter_x")) // Both tests are required to be compatible with all browsers +{ + $search_categ=''; + $search_user=''; + $search_sale=''; + $search_ref=''; + $search_refcustomer=''; + $search_societe=''; + $search_montant_ht=''; + $search_author=''; + $search_town=''; + $year=''; + $month=''; + $viewstatut=''; + $object_statut=''; +} + +if($object_statut != '') +$viewstatut=$object_statut; + + +// Initialize technical object to manage hooks of thirdparties. Note that conf->hooks_modules contains array array +$hookmanager->initHooks(array('propallist')); + + + +/* + * Actions + */ + + +$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'); + + + +/* + * View + */ + +llxHeader('',$langs->trans('Proposal'),'EN:Commercial_Proposals|FR:Proposition_commerciale|ES:Presupuestos'); + +$form = new Form($db); +$formother = new FormOther($db); +$formfile = new FormFile($db); +$formpropal = new FormPropal($db); +$companystatic=new Societe($db); + +$now=dol_now(); + +$sortfield = GETPOST("sortfield",'alpha'); +$sortorder = GETPOST("sortorder",'alpha'); +$page = GETPOST("page",'int'); +if ($page == -1) { $page = 0; } +$offset = $conf->liste_limit * $page; +$pageprev = $page - 1; +$pagenext = $page + 1; + +if (! $sortfield) $sortfield='p.datep'; +if (! $sortorder) $sortorder='DESC'; +$limit = $conf->liste_limit; + + +$sql = 'SELECT s.rowid, s.nom as name, s.town, s.client, s.code_client,'; +$sql.= ' p.rowid as propalid, p.note_private, p.total_ht, p.ref, p.ref_client, p.fk_statut, p.fk_user_author, p.datep as dp, p.fin_validite as dfv,'; +if (! $user->rights->societe->client->voir && ! $socid) $sql .= " sc.fk_soc, sc.fk_user,"; +$sql.= ' u.login'; +$sql.= ' FROM '.MAIN_DB_PREFIX.'societe as s, '.MAIN_DB_PREFIX.'propal as p'; +if ($sall) $sql.= ' LEFT JOIN '.MAIN_DB_PREFIX.'propaldet as pd ON p.rowid=pd.fk_propal'; +$sql.= ' LEFT JOIN '.MAIN_DB_PREFIX.'user as u ON p.fk_user_author = u.rowid'; +// 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.=", ".MAIN_DB_PREFIX."element_contact as c"; + $sql.=", ".MAIN_DB_PREFIX."c_type_contact as tc"; +} +$sql.= ' WHERE p.fk_soc = s.rowid'; +$sql.= ' AND p.entity = '.$conf->entity; +if (! $user->rights->societe->client->voir && ! $socid) //restriction +{ + $sql.= " AND s.rowid = sc.fk_soc AND sc.fk_user = " .$user->id; +} +if ($search_town) {//restriction + $sql .= natural_search('s.town', $search_town); +} +if ($search_ref) { + $sql .= natural_search('p.ref', $search_ref); +} +if ($search_refcustomer) { + $sql .= natural_search('p.ref_client', $search_refcustomer); +} +if ($search_societe) { + $sql .= natural_search('s.nom', $search_societe); +} +if ($search_author) +{ + $sql.= " AND u.login LIKE '%".$db->escape(trim($search_author))."%'"; +} +if ($search_montant_ht) +{ + $sql.= " AND p.total_ht='".$db->escape(price2num(trim($search_montant_ht)))."'"; +} +if ($sall) { + $sql .= natural_search(array('s.nom', 'p.note_private', 'p.note_public', 'pd.description'), $sall); +} +if ($socid) $sql.= ' AND s.rowid = '.$socid; +if ($viewstatut <> '') +{ + $sql.= ' AND p.fk_statut IN ('.$viewstatut.')'; +} +if ($month > 0) +{ + if ($year > 0 && empty($day)) + $sql.= " AND p.datep 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 p.datep 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(p.datep, '%m') = '".$month."'"; +} +else if ($year > 0) +{ + $sql.= " AND p.datep BETWEEN '".$db->idate(dol_get_first_day($year,1,false))."' AND '".$db->idate(dol_get_last_day($year,12,false))."'"; +} +if ($search_sale > 0) $sql.= " AND s.rowid = sc.fk_soc AND sc.fk_user = " .$search_sale; +if ($search_user > 0) +{ + $sql.= " AND c.fk_c_type_contact = tc.rowid AND tc.element='propal' AND tc.source='internal' AND c.element_id = p.rowid AND c.fk_socpeople = ".$search_user; +} + + +$sql.= ' ORDER BY '.$sortfield.' '.$sortorder.', p.ref DESC'; + +$nbtotalofrecords = 0; +if (empty($conf->global->MAIN_DISABLE_FULL_SCANLIST)) +{ + $result = $db->query($sql); + $nbtotalofrecords = $db->num_rows($result); +} + + +$sql.= $db->plimit($limit + 1,$offset); +$result=$db->query($sql); + +if ($result) +{ + $objectstatic=new Propal($db); + $userstatic=new User($db); + $num = $db->num_rows($result); + + if ($socid) + { + $soc = new Societe($db); + $soc->fetch($socid); + } + + $param='&socid='.$socid.'&viewstatut='.$viewstatut; + if ($month) $param.='&month='.$month; + if ($year) $param.='&year='.$year; + 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_user > 0) $param.='&search_user='.$search_user; + if ($search_sale > 0) $param.='&search_sale='.$search_sale; + if ($search_montant_ht) $param.='&search_montant_ht='.$search_montant_ht; + if ($search_author) $param.='&search_author='.$search_author; + if ($search_town) $param.='&search_town='.$search_town; + print_barre_liste($langs->trans('ListOfProposals').' '.($socid?'- '.$soc->name:''), $page, $_SERVER["PHP_SELF"],$param,$sortfield,$sortorder,'',$num,$nbtotalofrecords); + + // Lignes des champs de filtre + print '
'; + + $i = 0; + print ''; + + $moreforfilter=''; + + // If the user can view prospects other than his' + if ($user->rights->societe->client->voir || $socid) + { + $langs->load("commercial"); + $moreforfilter.=$langs->trans('ThirdPartiesOfSaleRepresentative'). ': '; + $moreforfilter.=$formother->select_salesrepresentatives($search_sale,'search_sale',$user); + $moreforfilter.='       '; + } + // If the user can view prospects other than his' + if ($user->rights->societe->client->voir || $socid) + { + $moreforfilter.=$langs->trans('LinkedToSpecificUsers'). ': '; + $moreforfilter.=$form->select_dolusers($search_user,'search_user',1); + } + if (! empty($moreforfilter)) + { + print ''; + print ''; + } + + print ''; + print_liste_field_titre($langs->trans('Ref'),$_SERVER["PHP_SELF"],'p.ref','',$param,'',$sortfield,$sortorder); + print_liste_field_titre($langs->trans('RefCustomer'),$_SERVER["PHP_SELF"],'p.ref_client','',$param,'',$sortfield,$sortorder); + print_liste_field_titre($langs->trans('Company'),$_SERVER["PHP_SELF"],'s.nom','',$param,'',$sortfield,$sortorder); + print_liste_field_titre($langs->trans('Town'),$_SERVER["PHP_SELF"],'s.town','',$param,'',$sortfield,$sortorder); + print_liste_field_titre($langs->trans('Date'),$_SERVER["PHP_SELF"],'p.datep','',$param, 'align="center"',$sortfield,$sortorder); + print_liste_field_titre($langs->trans('DateEndPropalShort'),$_SERVER["PHP_SELF"],'dfv','',$param, 'align="center"',$sortfield,$sortorder); + print_liste_field_titre($langs->trans('AmountHT'),$_SERVER["PHP_SELF"],'p.total_ht','',$param, 'align="right"',$sortfield,$sortorder); + print_liste_field_titre($langs->trans('Author'),$_SERVER["PHP_SELF"],'u.login','',$param,'align="center"',$sortfield,$sortorder); + print_liste_field_titre($langs->trans('Status'),$_SERVER["PHP_SELF"],'p.fk_statut','',$param,'align="right"',$sortfield,$sortorder); + print_liste_field_titre(''); + print "\n"; + + print ''; + print ''; + print ''; + print ''; + print ''; + // Date + print ''; + print ''; + // Amount + print ''; + // Author + print ''; + print ''; + + print ''; + + print "\n"; + + $var=true; + $total=0; + $subtotal=0; + + while ($i < min($num,$limit)) + { + $objp = $db->fetch_object($result); + $now = dol_now(); + $var=!$var; + print ''; + print '\n"; + + // Customer ref + print ''; + + $url = DOL_URL_ROOT.'/comm/card.php?socid='.$objp->rowid; + + // Company + $companystatic->id=$objp->rowid; + $companystatic->name=$objp->name; + $companystatic->client=$objp->client; + $companystatic->code_client=$objp->code_client; + print ''; + + // Town + print ''; + + // Date proposal + print '\n"; + + // Date end validity + if ($objp->dfv) + { + print ''; + } + else + { + print ''; + } + + print '\n"; + + $userstatic->id=$objp->fk_user_author; + $userstatic->login=$objp->login; + print '\n"; + + print '\n"; + + print ''; + + print "\n"; + + $total += $objp->total_ht; + $subtotal += $objp->total_ht; + + $i++; + } + + if ($total>0) + { + if($num<$limit){ + $var=!$var; + print ''; + print ''; + print ''; + } + else + { + $var=!$var; + print ''; + print ''; + print ''; + } + + } + + print '
'; + print $moreforfilter; + print '
'; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + //print $langs->trans('Month').': '; + print ''; + //print ' '.$langs->trans('Year').': '; + $syear = $year; + $formother->select_year($syear,'year',1, 20, 5); + print ' '; + print ''; + print ''; + print ''; + print ''; + $formpropal->selectProposalStatus($viewstatut,1); + print ''; + print ''; + print ''; + print '
'; + + $objectstatic->id=$objp->propalid; + $objectstatic->ref=$objp->ref; + + print ''; + print ''; + + print ''; + + // Ref + print '
'; + print $objectstatic->getNomUrl(1); + print ''; + if ($objp->fk_statut == 1 && $db->jdate($objp->dfv) < ($now - $conf->propal->cloture->warning_delay)) print img_warning($langs->trans("Late")); + if (! empty($objp->note_private)) + { + print ' '; + print ''.img_picto($langs->trans("ViewPrivateNote"),'object_generic').''; + print ''; + } + print ''; + $filename=dol_sanitizeFileName($objp->ref); + $filedir=$conf->propal->dir_output . '/' . dol_sanitizeFileName($objp->ref); + $urlsource=$_SERVER['PHP_SELF'].'?id='.$objp->propalid; + print $formfile->getDocumentsLink($objectstatic->element, $filename, $filedir); + print '
'; + + print "
'; + print $objp->ref_client; + print ''; + print $companystatic->getNomUrl(1,'customer'); + print ''; + print $objp->town; + print ''; + print dol_print_date($db->jdate($objp->dp), 'day'); + print "'.dol_print_date($db->jdate($objp->dfv),'day'); + print ' '.price($objp->total_ht)."'; + if ($userstatic->id) print $userstatic->getLoginUrl(1); + else print ' '; + print "'.$objectstatic->LibStatut($objp->fk_statut,5)." 
'.$langs->trans("TotalHT").''.price($total).'
'.$langs->trans("TotalHTforthispage").''.price($total).'
'; + + print '
'; + + $db->free($result); +} +else +{ + dol_print_error($db); +} + +// End of page +llxFooter(); +$db->close(); diff --git a/htdocs/comm/askpricesupplier/note.php b/htdocs/comm/askpricesupplier/note.php new file mode 100644 index 00000000000..9292684d06f --- /dev/null +++ b/htdocs/comm/askpricesupplier/note.php @@ -0,0 +1,151 @@ + + * Copyright (C) 2004-2012 Laurent Destailleur + * Copyright (C) 2004 Eric Seigne + * Copyright (C) 2005-2012 Regis Houssin + * Copyright (C) 2013 Florian Henry + * + * 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 3 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, see . + */ + +/** + * \file htdocs/comm/propal/note.php + * \ingroup propal + * \brief Fiche d'information sur une proposition commerciale + */ + +require '../../main.inc.php'; +require_once DOL_DOCUMENT_ROOT.'/comm/propal/class/propal.class.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/propal.lib.php'; + +$langs->load('propal'); +$langs->load('compta'); +$langs->load('bills'); + +$id = GETPOST('id','int'); +$ref=GETPOST('ref','alpha'); +$action=GETPOST('action','alpha'); + +// Security check +if ($user->societe_id) $socid=$user->societe_id; +$result = restrictedArea($user, 'propale', $id, 'propal'); + +$object = new Propal($db); + + + +/******************************************************************************/ +/* Actions */ +/******************************************************************************/ + +$permissionnote=$user->rights->propale->creer; // Used by the include of actions_setnotes.inc.php + +include DOL_DOCUMENT_ROOT.'/core/actions_setnotes.inc.php'; // Must be include, not includ_once + + + +/******************************************************************************/ +/* Affichage fiche */ +/******************************************************************************/ + +llxHeader('',$langs->trans('Proposal'),'EN:Commercial_Proposals|FR:Proposition_commerciale|ES:Presupuestos'); + +$form = new Form($db); + +if ($id > 0 || ! empty($ref)) +{ + if ($mesg) print $mesg; + + $now=dol_now(); + + if ($object->fetch($id, $ref)) + { + $societe = new Societe($db); + if ( $societe->fetch($object->socid) ) + { + $head = propal_prepare_head($object); + dol_fiche_head($head, 'note', $langs->trans('Proposal'), 0, 'propal'); + + print ''; + + $linkback = ''.$langs->trans('BackToList').''; + + // Ref + print ''; + + // Ref client + print ''; + print ''; + + // Customer + if ( is_null($object->client) ) + $object->fetch_thirdparty(); + print ""; + print ''; + + // Ligne info remises tiers + print ''; + + // Date + print ''; + print ''; + + // Date fin propal + print ''; + print ''; + print ''; + + print "
'.$langs->trans('Ref').''; + print $form->showrefnav($object,'ref',$linkback,1,'ref','ref',''); + print '
'; + print ''; + print '
'; + print $langs->trans('RefCustomer').''; + print '
'; + print '
'; + print $object->ref_client; + print '
".$langs->trans("Company")."'.$object->client->getNomUrl(1).'
'.$langs->trans('Discounts').''; + if ($societe->remise_percent) print $langs->trans("CompanyHasRelativeDiscount",$societe->remise_percent); + else print $langs->trans("CompanyHasNoRelativeDiscount"); + $absolute_discount=$societe->getAvailableDiscounts(); + print '. '; + if ($absolute_discount) print $langs->trans("CompanyHasAbsoluteDiscount",price($absolute_discount),$langs->trans("Currency".$conf->currency)); + else print $langs->trans("CompanyHasNoAbsoluteDiscount"); + print '.'; + print '
'.$langs->trans('Date').''; + print dol_print_date($object->date,'daytext'); + print '
'.$langs->trans('DateEndPropal').''; + if ($object->fin_validite) + { + print dol_print_date($object->fin_validite,'daytext'); + if ($object->statut == 1 && $object->fin_validite < ($now - $conf->propal->cloture->warning_delay)) print img_warning($langs->trans("Late")); + } + else + { + print $langs->trans("Unknown"); + } + print '
"; + + print '
'; + + include DOL_DOCUMENT_ROOT.'/core/tpl/notes.tpl.php'; + + dol_fiche_end(); + } + } +} + + +llxFooter(); +$db->close(); diff --git a/htdocs/comm/askpricesupplier/tpl/index.html b/htdocs/comm/askpricesupplier/tpl/index.html new file mode 100644 index 00000000000..e69de29bb2d diff --git a/htdocs/comm/askpricesupplier/tpl/linkedobjectblock.tpl.php b/htdocs/comm/askpricesupplier/tpl/linkedobjectblock.tpl.php new file mode 100644 index 00000000000..cb920afd5fc --- /dev/null +++ b/htdocs/comm/askpricesupplier/tpl/linkedobjectblock.tpl.php @@ -0,0 +1,79 @@ + + * Copyright (C) 2013 Juanjo Menent + * Copyright (C) 2014 Marcos García + * + * 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 3 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, see . + */ + +/** + * \file htdocs/comm/propal/tpl/linkedobjectblock.tpl.php + * \ingroup propal + * \brief Template to show objects linked to proposals + */ +?> + + + +'; +print_titre($langs->trans('RelatedCommercialProposals')); +?> + + + + + + + + + + > + + + + + + + + + + + +
trans("Ref"); ?>trans('RefCustomer'); ?>trans("Date"); ?>trans("AmountHTShort"); ?>trans("Status"); ?>
+ trans("ShowPropal"),"propal").' '.$object->ref; ?>ref_client; ?>date,'day'); ?>rights->propale->lire) { + $total = $total + $object->total_ht; + echo price($object->total_ht); + } ?>getLibStatut(3); ?>
trans('TotalHT'); ?>rights->propale->lire) { + echo price($total); + } ?> 
+ + diff --git a/htdocs/core/modules/modAskPriceSupplier.class.php b/htdocs/core/modules/modAskPriceSupplier.class.php new file mode 100644 index 00000000000..9ae6d15ba71 --- /dev/null +++ b/htdocs/core/modules/modAskPriceSupplier.class.php @@ -0,0 +1,226 @@ + + * Copyright (C) 2004-2010 Laurent Destailleur + * Copyright (C) 2004 Sebastien Di Cintio + * Copyright (C) 2004 Benoit Mortier + * Copyright (C) 2005-2012 Regis Houssin + * Copyright (C) 2012 Juanjo Menent + * + * 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 3 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, see . + */ + +/** + * \defgroup propale Module commercial proposals + * \brief Module pour gerer la tenue de propositions commerciales + * \file htdocs/core/modules/modPropale.class.php + * \ingroup propale + * \brief Fichier de description et activation du module Propale + */ +include_once DOL_DOCUMENT_ROOT .'/core/modules/DolibarrModules.class.php'; + + +/** + * Classe de description et activation du module Propale + */ +class modAskPriceSupplier extends DolibarrModules +{ + + /** + * Constructor. Define names, constants, directories, boxes, permissions + * + * @param DoliDB $db Database handler + */ + function __construct($db) + { + global $conf; + + $this->db = $db; + $this->numero = 999999; + + $this->family = "products"; + // Module label (no space allowed), used if translation string 'ModuleXXXName' not found (where XXX is value of numeric property 'numero' of module) + $this->name = preg_replace('/^mod/i','',get_class($this)); + $this->description = "askpricesupplierDESC"; + + // Possible values for version are: 'development', 'experimental', 'dolibarr' or version + $this->version = '0.1'; + + $this->const_name = 'MAIN_MODULE_'.strtoupper($this->name); + $this->special = 0; + $this->picto='askpricesupplier'; + + // Data directories to create when module is enabled + $this->dirs = array(); + + // Dependancies + $this->depends = array('modFournisseur'); + $this->requiredby = array(); + $this->config_page_url = array("askpricesupplier.php"); + $this->langfiles = array("askpricesupplier"); + + // Constants + $this->const = array(); + $r=0; + + /*$this->const[$r][0] = "PROPALE_ADDON_PDF"; + $this->const[$r][1] = "chaine"; + $this->const[$r][2] = "azur"; + $this->const[$r][3] = 'Nom du gestionnaire de generation des propales en PDF'; + $this->const[$r][4] = 0; + $r++;*/ + + // Boxes + $this->boxes = array(); + + // Permissions + $this->rights = array(); + $this->rights_class = 'askpricesupplier'; + $r=0; + + $r++; + $this->rights[$r][0] = $this->numero + $r; // id de la permission + $this->rights[$r][1] = 'Créer/modifier les demandes fournisseurs'; // libelle de la permission + $this->rights[$r][3] = 1; // La permission est-elle une permission par defaut + $this->rights[$r][4] = 'create'; + + $r++; + $this->rights[$r][0] = $this->numero + $r; // id de la permission + $this->rights[$r][1] = 'Lire les demandes fournisseurs'; // libelle de la permission + $this->rights[$r][3] = 1; // La permission est-elle une permission par defaut + $this->rights[$r][4] = 'read'; + + $r++; + $this->rights[$r][0] = $this->numero + $r; // id de la permission + $this->rights[$r][1] = 'Valider les demandes fournisseurs'; // libelle de la permission + $this->rights[$r][3] = 0; // La permission est-elle une permission par defaut + $this->rights[$r][4] = 'read'; + $this->rights[$r][5] = 'validate'; + + $r++; + $this->rights[$r][0] = $this->numero + $r; // id de la permission + $this->rights[$r][1] = 'Envoyer les demandes fournisseurs'; // libelle de la permission + $this->rights[$r][3] = 0; // La permission est-elle une permission par defaut + $this->rights[$r][4] = 'read'; + $this->rights[$r][5] = 'send'; + + $r++; + $this->rights[$r][0] = $this->numero + $r; // id de la permission + $this->rights[$r][1] = 'Supprimer les demandes fournisseurs'; // libelle de la permission + $this->rights[$r][3] = 0; // La permission est-elle une permission par defaut + $this->rights[$r][4] = 'delete'; + + // Exports + //-------- + $r=0; +/* + $r++; + $this->export_code[$r]=$this->rights_class.'_'.$r; + $this->export_label[$r]='ProposalsAndProposalsLines'; // Translation key (used only if key ExportDataset_xxx_z not found) + $this->export_permission[$r]=array(array("propale","export")); + $this->export_fields_array[$r]=array('s.rowid'=>"IdCompany",'s.nom'=>'CompanyName','s.address'=>'Address','s.zip'=>'Zip','s.town'=>'Town','co.code'=>'CountryCode','s.phone'=>'Phone','s.siren'=>'ProfId1','s.siret'=>'ProfId2','s.ape'=>'ProfId3','s.idprof4'=>'ProfId4','c.rowid'=>"Id",'c.ref'=>"Ref",'c.ref_client'=>"RefCustomer",'c.fk_soc'=>"IdCompany",'c.datec'=>"DateCreation",'c.datep'=>"DatePropal",'c.fin_validite'=>"DateEndPropal",'c.remise_percent'=>"GlobalDiscount",'c.total_ht'=>"TotalHT",'c.total'=>"TotalTTC",'c.fk_statut'=>'Status','c.note_public'=>"Note",'c.date_livraison'=>'DeliveryDate','c.fk_user_author'=>'CreatedById','uc.login'=>'CreatedByLogin','c.fk_user_valid'=>'ValidatedById','uv.login'=>'ValidatedByLogin','cd.rowid'=>'LineId','cd.label'=>"Label",'cd.description'=>"LineDescription",'cd.product_type'=>'TypeOfLineServiceOrProduct','cd.tva_tx'=>"LineVATRate",'cd.qty'=>"LineQty",'cd.total_ht'=>"LineTotalHT",'cd.total_tva'=>"LineTotalVAT",'cd.total_ttc'=>"LineTotalTTC",'p.rowid'=>'ProductId','p.ref'=>'ProductRef','p.label'=>'ProductLabel'); + //$this->export_TypeFields_array[$r]=array('s.rowid'=>"List:societe:nom",'s.nom'=>'Text','s.address'=>'Text','s.zip'=>'Text','s.town'=>'Text','co.code'=>'Text','s.phone'=>'Text','s.siren'=>'Text','s.siret'=>'Text','s.ape'=>'Text','s.idprof4'=>'Text','c.ref'=>"Text",'c.ref_client'=>"Text",'c.datec'=>"Date",'c.datep'=>"Date",'c.fin_validite'=>"Date",'c.remise_percent'=>"Numeric",'c.total_ht'=>"Numeric",'c.total'=>"Numeric",'c.fk_statut'=>'Status','c.note_public'=>"Text",'c.date_livraison'=>'Date','cd.description'=>"Text",'cd.product_type'=>'Boolean','cd.tva_tx'=>"Numeric",'cd.qty'=>"Numeric",'cd.total_ht'=>"Numeric",'cd.total_tva'=>"Numeric",'cd.total_ttc'=>"Numeric",'p.rowid'=>'List:Product:label','p.ref'=>'Text','p.label'=>'Text'); + $this->export_TypeFields_array[$r]=array('s.nom'=>'Text','s.address'=>'Text','s.zip'=>'Text','s.town'=>'Text','co.code'=>'Text','s.phone'=>'Text','s.siren'=>'Text','s.siret'=>'Text','s.ape'=>'Text','s.idprof4'=>'Text','c.ref'=>"Text",'c.ref_client'=>"Text",'c.datec'=>"Date",'c.datep'=>"Date",'c.fin_validite'=>"Date",'c.remise_percent'=>"Numeric",'c.total_ht'=>"Numeric",'c.total'=>"Numeric",'c.fk_statut'=>'Status','c.note_public'=>"Text",'c.date_livraison'=>'Date','cd.description'=>"Text",'cd.product_type'=>'Boolean','cd.tva_tx'=>"Numeric",'cd.qty'=>"Numeric",'cd.total_ht'=>"Numeric",'cd.total_tva'=>"Numeric",'cd.total_ttc'=>"Numeric",'p.ref'=>'Text','p.label'=>'Text'); + $this->export_entities_array[$r]=array('s.rowid'=>"company",'s.nom'=>'company','s.address'=>'company','s.zip'=>'company','s.town'=>'company','co.code'=>'company','s.phone'=>'company','s.siren'=>'company','s.ape'=>'company','s.idprof4'=>'company','s.siret'=>'company','c.rowid'=>"propal",'c.ref'=>"propal",'c.ref_client'=>"propal",'c.fk_soc'=>"propal",'c.datec'=>"propal",'c.datep'=>"propal",'c.fin_validite'=>"propal",'c.remise_percent'=>"propal",'c.total_ht'=>"propal",'c.total'=>"propal",'c.fk_statut'=>"propal",'c.note_public'=>"propal",'c.date_livraison'=>"propal",'cd.rowid'=>'propal_line','cd.label'=>"propal_line",'cd.description'=>"propal_line",'cd.product_type'=>'propal_line','cd.tva_tx'=>"propal_line",'cd.qty'=>"propal_line",'cd.total_ht'=>"propal_line",'cd.total_tva'=>"propal_line",'cd.total_ttc'=>"propal_line",'p.rowid'=>'product','p.ref'=>'product','p.label'=>'product'); + $this->export_dependencies_array[$r]=array('propal_line'=>'cd.rowid','product'=>'cd.rowid'); // To add unique key if we ask a field of a child to avoid the DISTINCT to discard them + + $this->export_sql_start[$r]='SELECT DISTINCT '; + $this->export_sql_end[$r] =' FROM '.MAIN_DB_PREFIX.'societe as s '; + $this->export_sql_end[$r] .=' LEFT JOIN '.MAIN_DB_PREFIX.'c_country as co ON s.fk_pays = co.rowid,'; + $this->export_sql_end[$r] .=' '.MAIN_DB_PREFIX.'propal as c'; + $this->export_sql_end[$r] .=' LEFT JOIN '.MAIN_DB_PREFIX.'user as uc ON c.fk_user_author = uc.rowid'; + $this->export_sql_end[$r] .=' LEFT JOIN '.MAIN_DB_PREFIX.'user as uv ON c.fk_user_valid = uc.rowid'; + $this->export_sql_end[$r] .=' LEFT JOIN '.MAIN_DB_PREFIX.'propal_extrafields as extra ON c.rowid = extra.fk_object'; + $this->export_sql_end[$r] .=', '.MAIN_DB_PREFIX.'propaldet as cd'; + $this->export_sql_end[$r] .=' LEFT JOIN '.MAIN_DB_PREFIX.'product as p on (cd.fk_product = p.rowid)'; + $this->export_sql_end[$r] .=' WHERE c.fk_soc = s.rowid AND c.rowid = cd.fk_propal'; + $this->export_sql_end[$r] .=' AND c.entity = '.$conf->entity; + */ + + // Main menu entries + $this->menu = array(); // List of menus to add + $r=0; + $this->menu[$r]=array( + 'fk_menu'=>'fk_mainmenu=commercial', // Use 'fk_mainmenu=xxx' or 'fk_mainmenu=xxx,fk_leftmenu=yyy' where xxx is mainmenucode and yyy is a leftmenucode + 'type'=>'left', // This is a Left menu entry + 'titre'=>'askpricesupplierMENU_LEFT_TITLE', + 'leftmenu'=>'askpricesuppliersubmenu', + 'url'=>'/askpricesupplier/index.php', + 'langs'=>'askpricesupplier', // Lang file to use (without .lang) by module. File must be in langs/code_CODE/ directory. + 'enabled'=>'$conf->askpricesupplier->enabled', // Define condition to show or hide menu entry. Use '$conf->mymodule->enabled' if entry must be visible if module is enabled. Use '$leftmenu==\'system\'' to show if leftmenu system is selected. + 'perms'=>'$user->rights->askpricesupplier->read', // Use 'perms'=>'$user->rights->mymodule->level1->level2' if you want your menu with a permission rules + 'user'=>2 // 0=Menu for internal users, 1=external users, 2=both + ); + $r++; + + $this->menu[$r]=array( + 'fk_menu'=>'fk_mainmenu=commercial,fk_leftmenu=askpricesuppliersubmenu', + 'type'=>'left', + 'titre'=>'askpricesupplierMENU_LEFT_TITLE_NEW', + 'url'=>'/askpricesupplier/card.php?action=create', + 'langs'=>'askpricesupplier', + 'enabled'=>'$conf->askpricesupplier->enabled', + 'perms'=>'$user->rights->askpricesupplier->create', + 'user'=>2 + ); + $r++; + + $this->menu[$r]=array( + 'fk_menu'=>'fk_mainmenu=commercial,fk_leftmenu=askpricesuppliersubmenu', + 'type'=>'left', + 'titre'=>'askpricesupplierMENU_LEFT_TITLE_LIST', + 'url'=>'/askpricesupplier/list.php', + 'langs'=>'askpricesupplier', + 'enabled'=>'$conf->askpricesupplier->enabled', + 'perms'=>'$user->rights->askpricesupplier->read', + 'user'=>2 + ); + $r++; + } + + + /** + * Function called when module is enabled. + * The init function add constants, boxes, permissions and menus (defined in constructor) into Dolibarr database. + * It also creates data directories + * + * @param string $options Options when enabling module ('', 'noboxes') + * @return int 1 if OK, 0 if KO + */ + function init($options='') + { + //global $conf,$langs; + + $sql = array(); + + $result=$this->_load_tables('/mymodule/sql/'); + + return $this->_init($sql, $options); + } + + /** + * Function called when module is disabled. + * Remove from database constants, boxes and permissions from Dolibarr database. + * Data directories are not deleted + * + * @param string $options Options when enabling module ('', 'noboxes') + * @return int 1 if OK, 0 if KO + */ + function remove($options='') + { + $sql = array(); + + return $this->_remove($sql,$options); + } + +} diff --git a/htdocs/langs/fr_FR/askpricesupplier.lang b/htdocs/langs/fr_FR/askpricesupplier.lang new file mode 100644 index 00000000000..784082f42c4 --- /dev/null +++ b/htdocs/langs/fr_FR/askpricesupplier.lang @@ -0,0 +1,6 @@ +# Dolibarr language file - Source file is en_US - askpricesupplier +AskPriceSupplier=Demande de prix fournisseur +askpricesupplierDESC=Gestion des demandes de prix aux fournisseurs +askpricesupplierMENU_LEFT_TITLE=Demandes de prix fourn. +askpricesupplierMENU_LEFT_TITLE_NEW=Nouvelle demande +askpricesupplierMENU_LEFT_TITLE_LIST=Liste \ No newline at end of file diff --git a/htdocs/theme/eldy/img/object_askpricesupplier.png b/htdocs/theme/eldy/img/object_askpricesupplier.png new file mode 100644 index 0000000000000000000000000000000000000000..9ab48924ccb26606d331789871b185e8c015e221 GIT binary patch literal 1038 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmUzPnffIy#(^vlDyqr z82*Fcg1yTp14TFsJR*yMvQ&rUPlPc?>bf)*fbHU{?2ZaSX9I-8(7Q zV{)L#@$)q|uYE|Jw9wCFsp6Iz#@~~~Iz*?`t#DX0;l!dAoovBKDMRtV6p^UgOMHT* zv-EScnt8q-+}7l?GUuvsWZ;vS1yg2k-4^+3|8E;kMUj#RMLX|&w*Fp!?yvA)_s&_>)=GLaBtp^V}&N!QPBgZU4XIf<0_0<6y)1E(hqSNN8 zB)H!*I4CIZ1A~0rdhxk)V_&?kZb;B*IeF64#N6C@X;A5gJ1bbz0vpeM{P^*{kD9R4 zLP-mm^9wJ^G;iE1I9Yi9gA%KSmtP)`W< z3Z5T$AHn?nbX-h+mRnq$+>s>1h&*v^0nGzz^5Yz(Zp*&u=;`6P@wSYmIqu9)zXSGF z0*~eIH-=A}I`!z`gr9obrZjb(IN`C>M{VA8TfB60PLxo-A<2i@&Bi4p3 ztjNsNT(o#`tx)HYGa>IE@9s#;lHmDz+Bh5IwlpO}#QtMhKx?`d&& z_SLfM>gw*e6~JHnm(}D-X7jA%>TKEVr;@v^Eu}1{dOpci{T1OqNuK#;`m-Hg;U_|W zKek@pSe;rihm~aN^%yH%v-I4M4 zcQtq3mCTN^eC3}{qqK5%IqhBtjMJyq8KpTQo~O!eaxLHz$YeDOJ{# z6w?zE{>xP5e`X<1!WKbb{!uM)jVMV;EJ?LWE=mPb3`Pb9mbyS>XdGf_Y-MC_Wo)W# nU}R-raJl_f1&W5;{FKbJO57S2-AXzF)WG2B>gTe~DWM4ff-TFL literal 0 HcmV?d00001 From 6fee87ca56752dc11c764604641045a1835c16f4 Mon Sep 17 00:00:00 2001 From: phf Date: Mon, 26 Jan 2015 17:35:37 +0100 Subject: [PATCH 002/287] [CORE] ajout en commentaire de la requete sql de creation de table (#new_ask_price). --- htdocs/core/modules/modAskPriceSupplier.class.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/htdocs/core/modules/modAskPriceSupplier.class.php b/htdocs/core/modules/modAskPriceSupplier.class.php index 9ae6d15ba71..1c108c572d1 100644 --- a/htdocs/core/modules/modAskPriceSupplier.class.php +++ b/htdocs/core/modules/modAskPriceSupplier.class.php @@ -201,9 +201,11 @@ class modAskPriceSupplier extends DolibarrModules { //global $conf,$langs; + /*CREATE IF NOT EXISTS llx_askpricesupplier (rowid int auto_increment);*/ + $sql = array(); - $result=$this->_load_tables('/mymodule/sql/'); + //$result=$this->_load_tables('/mymodule/sql/'); return $this->_init($sql, $options); } From aaacca9b136deb2fa7f65192ad949290eb563b05 Mon Sep 17 00:00:00 2001 From: phf Date: Tue, 27 Jan 2015 16:53:27 +0100 Subject: [PATCH 003/287] =?UTF-8?q?[CORE]=20premi=C3=A8re=20partie=20des?= =?UTF-8?q?=20grosses=20modifications=20(#new=5Fask=5Fprice).?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- htdocs/comm/askpricesupplier.php | 2328 +++++++++++++++++ .../class/askpricesupplier.class.php | 270 +- htdocs/comm/askpricesupplier/index.php | 94 +- .../sql/llx_askpricesupplier.sql | 58 + .../sql/llx_askpricesupplier_extrafields.sql | 8 + .../sql/llx_askpricesupplierdet.sql | 36 + .../llx_askpricesupplierdet_extrafields.sql | 8 + .../tpl/linkedobjectblock.tpl.php | 6 +- htdocs/core/lib/askpricesupplier.lib.php | 148 ++ .../doc/doc_generic_proposal_odt.modules.php | 484 ++++ .../modules/askpricesupplier/doc/index.html | 0 .../askpricesupplier/doc/pdf_azur.modules.php | 1385 ++++++++++ .../core/modules/askpricesupplier/index.html | 0 .../askpricesupplier/mod_propale_marbre.php | 153 ++ .../askpricesupplier/mod_propale_saphir.php | 131 + .../modules_askpricesupplier.php | 165 ++ .../modules/modAskPriceSupplier.class.php | 75 +- .../interface_90_all_Demo.class.php-NORUN | 13 + htdocs/langs/fr_FR/askpricesupplier.lang | 125 +- 19 files changed, 5283 insertions(+), 204 deletions(-) create mode 100644 htdocs/comm/askpricesupplier.php create mode 100644 htdocs/comm/askpricesupplier/sql/llx_askpricesupplier.sql create mode 100644 htdocs/comm/askpricesupplier/sql/llx_askpricesupplier_extrafields.sql create mode 100644 htdocs/comm/askpricesupplier/sql/llx_askpricesupplierdet.sql create mode 100644 htdocs/comm/askpricesupplier/sql/llx_askpricesupplierdet_extrafields.sql create mode 100644 htdocs/core/lib/askpricesupplier.lib.php create mode 100644 htdocs/core/modules/askpricesupplier/doc/doc_generic_proposal_odt.modules.php create mode 100644 htdocs/core/modules/askpricesupplier/doc/index.html create mode 100644 htdocs/core/modules/askpricesupplier/doc/pdf_azur.modules.php create mode 100644 htdocs/core/modules/askpricesupplier/index.html create mode 100644 htdocs/core/modules/askpricesupplier/mod_propale_marbre.php create mode 100644 htdocs/core/modules/askpricesupplier/mod_propale_saphir.php create mode 100644 htdocs/core/modules/askpricesupplier/modules_askpricesupplier.php diff --git a/htdocs/comm/askpricesupplier.php b/htdocs/comm/askpricesupplier.php new file mode 100644 index 00000000000..bd694f4a925 --- /dev/null +++ b/htdocs/comm/askpricesupplier.php @@ -0,0 +1,2328 @@ + + * Copyright (C) 2004-2014 Laurent Destailleur + * Copyright (C) 2004 Eric Seigne + * Copyright (C) 2005 Marc Barilley / Ocebo + * Copyright (C) 2005-2012 Regis Houssin + * Copyright (C) 2006 Andre Cianfarani + * Copyright (C) 2010-2014 Juanjo Menent + * Copyright (C) 2010-2011 Philippe Grand + * Copyright (C) 2012-2013 Christophe Battarel + * Copyright (C) 2013-2014 Florian Henry + * Copyright (C) 2014 Ferran Marcet + * + * 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 3 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, see . + */ + +/** + * \file htdocs/comm/propal.php + * \ingroup propale + * \brief Page of commercial proposals card and list + */ +require '../main.inc.php'; +require_once DOL_DOCUMENT_ROOT . '/core/class/html.formother.class.php'; +require_once DOL_DOCUMENT_ROOT . '/core/class/html.formfile.class.php'; +require_once DOL_DOCUMENT_ROOT . '/core/class/html.formpropal.class.php'; +require_once DOL_DOCUMENT_ROOT . '/comm/askpricesupplier/class/askpricesupplier.class.php'; +require_once DOL_DOCUMENT_ROOT . '/comm/action/class/actioncomm.class.php'; +require_once DOL_DOCUMENT_ROOT . '/core/modules/askpricesupplier/modules_askpricesupplier.php'; +require_once DOL_DOCUMENT_ROOT . '/core/lib/askpricesupplier.lib.php'; +require_once DOL_DOCUMENT_ROOT . '/core/lib/functions2.lib.php'; +require_once DOL_DOCUMENT_ROOT . '/core/class/extrafields.class.php'; +if (! empty($conf->projet->enabled)) { + require_once DOL_DOCUMENT_ROOT . '/projet/class/project.class.php'; + require_once DOL_DOCUMENT_ROOT . '/core/class/html.formprojet.class.php'; +} + +$langs->load('companies'); +$langs->load('askpricesupplier'); +$langs->load('compta'); +$langs->load('bills'); +$langs->load('orders'); +$langs->load('products'); +$langs->load("deliveries"); +$langs->load('sendings'); +if (! empty($conf->margin->enabled)) + $langs->load('margins'); + +$error = 0; + +$id = GETPOST('id', 'int'); +$ref = GETPOST('ref', 'alpha'); +$socid = GETPOST('socid', 'int'); +$action = GETPOST('action', 'alpha'); +$origin = GETPOST('origin', 'alpha'); +$originid = GETPOST('originid', 'int'); +$confirm = GETPOST('confirm', 'alpha'); +$lineid = GETPOST('lineid', 'int'); +$contactid = GETPOST('contactid','int'); + +// PDF +$hidedetails = (GETPOST('hidedetails', 'int') ? GETPOST('hidedetails', 'int') : (! empty($conf->global->MAIN_GENERATE_DOCUMENTS_HIDE_DETAILS) ? 1 : 0)); +$hidedesc = (GETPOST('hidedesc', 'int') ? GETPOST('hidedesc', 'int') : (! empty($conf->global->MAIN_GENERATE_DOCUMENTS_HIDE_DESC) ? 1 : 0)); +$hideref = (GETPOST('hideref', 'int') ? GETPOST('hideref', 'int') : (! empty($conf->global->MAIN_GENERATE_DOCUMENTS_HIDE_REF) ? 1 : 0)); + +// Nombre de ligne pour choix de produit/service predefinis +$NBLINES = 4; + +// Security check +if (! empty($user->societe_id)) $socid = $user->societe_id; +$result = restrictedArea($user, 'askpricesupplier', $id); + +$object = new AskPriceSupplier($db); +$extrafields = new ExtraFields($db); + +// fetch optionals attributes and labels +$extralabels = $extrafields->fetch_name_optionals_label($object->table_element); + +// Load object +if ($id > 0 || ! empty($ref)) { + $ret = $object->fetch($id, $ref); + if ($ret > 0) + $ret = $object->fetch_thirdparty(); + if ($ret < 0) + dol_print_error('', $object->error); +} + +// Initialize technical object to manage hooks of thirdparties. Note that conf->hooks_modules contains array array +$hookmanager->initHooks(array('propalcard','globalcard')); + +$permissionnote = $user->rights->askpricesupplier->creer; // Used by the include of actions_setnotes.inc.php + + +/* + * Actions + */ + +$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'); + +if (empty($reshook)) +{ + include DOL_DOCUMENT_ROOT . '/core/actions_setnotes.inc.php'; // Must be include, not includ_once + + // Action clone object + if ($action == 'confirm_clone' && $confirm == 'yes') + { + if (1 == 0 && ! GETPOST('clone_content') && ! GETPOST('clone_receivers')) + { + setEventMessage($langs->trans("NoCloneOptionsSpecified"), 'errors'); + } + else + { + if ($object->id > 0) { + $result = $object->createFromClone($socid); + if ($result > 0) { + header("Location: " . $_SERVER['PHP_SELF'] . '?id=' . $result); + exit(); + } else { + setEventMessage($object->error, 'errors'); + $action = ''; + } + } + } + } + + // Delete proposal + else if ($action == 'confirm_delete' && $confirm == 'yes' && $user->rights->askpricesupplier->supprimer) + { + $result = $object->delete($user); + if ($result > 0) { + header('Location: ' . DOL_URL_ROOT . '/comm/askpricesupplier/list.php'); + exit(); + } else { + $langs->load("errors"); + setEventMessage($langs->trans($object->error), 'errors'); + } + } + + // Remove line + else if ($action == 'confirm_deleteline' && $confirm == 'yes' && $user->rights->askpricesupplier->creer) + { + $result = $object->deleteline($lineid); + // reorder lines + if ($result) + $object->line_order(true); + + if (empty($conf->global->MAIN_DISABLE_PDF_AUTOUPDATE)) { + // Define output language + $outputlangs = $langs; + if (! empty($conf->global->MAIN_MULTILANGS)) { + $outputlangs = new Translate("", $conf); + $newlang = (GETPOST('lang_id') ? GETPOST('lang_id') : $object->thirdparty->default_lang); + $outputlangs->setDefaultLang($newlang); + } + $ret = $object->fetch($id); // Reload to get new records + $object->generateDocument($object->modelpdf, $outputlangs, $hidedetails, $hidedesc, $hideref); + } + + header('Location: ' . $_SERVER["PHP_SELF"] . '?id=' . $object->id); + exit(); + } + + // Validation + else if ($action == 'confirm_validate' && $confirm == 'yes' && + ((empty($conf->global->MAIN_USE_ADVANCED_PERMS) && ! empty($user->rights->askpricesupplier->creer)) + || (! empty($conf->global->MAIN_USE_ADVANCED_PERMS) && ! empty($user->rights->askpricesupplier->validate))) + ) + { + $result = $object->valid($user); + if ($result >= 0) + { + if (empty($conf->global->MAIN_DISABLE_PDF_AUTOUPDATE)) + { + // Define output language + if (empty($conf->global->MAIN_DISABLE_PDF_AUTOUPDATE)) + { + $outputlangs = $langs; + $newlang = ''; + if ($conf->global->MAIN_MULTILANGS && empty($newlang) && GETPOST('lang_id')) $newlang = GETPOST('lang_id','alpha'); + if ($conf->global->MAIN_MULTILANGS && empty($newlang)) $newlang = $object->thirdparty->default_lang; + if (! empty($newlang)) { + $outputlangs = new Translate("", $conf); + $outputlangs->setDefaultLang($newlang); + } + $model=$object->modelpdf; + $ret = $object->fetch($id); // Reload to get new records + + $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref); + } + } + } else { + $langs->load("errors"); + if (count($object->errors) > 0) setEventMessage($object->errors, 'errors'); + else setEventMessage($langs->trans($object->error), 'errors'); + } + } + + else if ($action == 'setdate' && $user->rights->askpricesupplier->creer) + { + $datep = dol_mktime(12, 0, 0, $_POST['remonth'], $_POST['reday'], $_POST['reyear']); + + if (empty($datep)) { + $error ++; + setEventMessage($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("Date")), 'errors'); + } + + if (! $error) { + $result = $object->set_date($user, $datep); + if ($result < 0) + dol_print_error($db, $object->error); + } + } + else if ($action == 'setecheance' && $user->rights->askpricesupplier->creer) + { + $result = $object->set_echeance($user, dol_mktime(12, 0, 0, $_POST['echmonth'], $_POST['echday'], $_POST['echyear'])); + if ($result < 0) + dol_print_error($db, $object->error); + } + else if ($action == 'setdate_livraison' && $user->rights->askpricesupplier->creer) + { + $result = $object->set_date_livraison($user, dol_mktime(12, 0, 0, $_POST['liv_month'], $_POST['liv_day'], $_POST['liv_year'])); + if ($result < 0) + dol_print_error($db, $object->error); + } + + // Positionne ref client + else if ($action == 'set_ref_client' && $user->rights->askpricesupplier->creer) + { + $object->set_ref_client($user, $_POST['ref_client']); + } + + // Create proposal + else if ($action == 'add' && $user->rights->askpricesupplier->creer) + { + $object->socid = $socid; + $object->fetch_thirdparty(); + + $datep = dol_mktime(12, 0, 0, GETPOST('remonth'), GETPOST('reday'), GETPOST('reyear')); + $date_delivery = dol_mktime(12, 0, 0, GETPOST('liv_month'), GETPOST('liv_day'), GETPOST('liv_year')); + $duration = GETPOST('duree_validite'); + + if (empty($datep)) { + setEventMessage($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("Date")), 'errors'); + $action = 'create'; + $error ++; + } + if (empty($duration)) { + setEventMessage($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("ValidityDuration")), 'errors'); + $action = 'create'; + $error ++; + } + + if ($socid < 1) { + setEventMessage($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("Customer")), 'errors'); + $action = 'create'; + $error ++; + } + + if (! $error) + { + $db->begin(); + + // Si on a selectionne une propal a copier, on realise la copie + if (GETPOST('createmode') == 'copy' && GETPOST('copie_askpricesupplier')) + { + if ($object->fetch(GETPOST('copie_askpricesupplier')) > 0) { + $object->ref = GETPOST('ref'); + $object->datep = $datep; + $object->date_livraison = $date_delivery; + $object->availability_id = GETPOST('availability_id'); + $object->demand_reason_id = GETPOST('demand_reason_id'); + $object->fk_delivery_address = GETPOST('fk_address'); + $object->shipping_method_id = GETPOST('shipping_method_id', 'int'); + $object->duree_validite = $duration; + $object->cond_reglement_id = GETPOST('cond_reglement_id'); + $object->mode_reglement_id = GETPOST('mode_reglement_id'); + $object->fk_account = GETPOST('fk_account', 'int'); + $object->remise_percent = GETPOST('remise_percent'); + $object->remise_absolue = GETPOST('remise_absolue'); + $object->socid = GETPOST('socid'); + $object->contactid = GETPOST('contactid'); + $object->fk_project = GETPOST('projectid'); + $object->modelpdf = GETPOST('model'); + $object->author = $user->id; // deprecated + $object->note = GETPOST('note'); + $object->statut = 0; + + $id = $object->create_from($user); + } else { + setEventMessage($langs->trans("ErrorFailedToCopyProposal", GETPOST('copie_askpricesupplier')), 'errors'); + } + } else { + $object->ref = GETPOST('ref'); + $object->ref_client = GETPOST('ref_client'); + $object->datep = $datep; + $object->date_livraison = $date_delivery; + $object->availability_id = GETPOST('availability_id'); + $object->demand_reason_id = GETPOST('demand_reason_id'); + $object->fk_delivery_address = GETPOST('fk_address'); + $object->shipping_method_id = GETPOST('shipping_method_id', 'int'); + $object->duree_validite = GETPOST('duree_validite'); + $object->cond_reglement_id = GETPOST('cond_reglement_id'); + $object->mode_reglement_id = GETPOST('mode_reglement_id'); + $object->fk_account = GETPOST('fk_account', 'int'); + $object->contactid = GETPOST('contactid'); + $object->fk_project = GETPOST('projectid'); + $object->modelpdf = GETPOST('model'); + $object->author = $user->id; // deprecated + $object->note = GETPOST('note'); + + $object->origin = GETPOST('origin'); + $object->origin_id = GETPOST('originid'); + + for($i = 1; $i <= $conf->global->PRODUCT_SHOW_WHEN_CREATE; $i ++) + { + if ($_POST['idprod' . $i]) { + $xid = 'idprod' . $i; + $xqty = 'qty' . $i; + $xremise = 'remise' . $i; + $object->add_product($_POST[$xid], $_POST[$xqty], $_POST[$xremise]); + } + } + + // Fill array 'array_options' with data from add form + $ret = $extrafields->setOptionalsFromPost($extralabels, $object); + if ($ret < 0) { + $error ++; + $action = 'create'; + } + } + + if (! $error) + { + if ($origin && $originid) + { + // Parse element/subelement (ex: project_task) + $element = $subelement = $origin; + if (preg_match('/^([^_]+)_([^_]+)/i', $origin, $regs)) { + $element = $regs [1]; + $subelement = $regs [2]; + } + + // For compatibility + if ($element == 'order') { + $element = $subelement = 'commande'; + } + if ($element == 'askpricesupplier') { + $element = 'comm/askpricesupplier'; + $subelement = 'askpricesupplier'; + } + if ($element == 'contract') { + $element = $subelement = 'contrat'; + } + if ($element == 'inter') { + $element = $subelement = 'ficheinter'; + } + if ($element == 'shipping') { + $element = $subelement = 'expedition'; + } + + $object->origin = $origin; + $object->origin_id = $originid; + + // Possibility to add external linked objects with hooks + $object->linked_objects [$object->origin] = $object->origin_id; + if (is_array($_POST['other_linked_objects']) && ! empty($_POST['other_linked_objects'])) { + $object->linked_objects = array_merge($object->linked_objects, $_POST['other_linked_objects']); + } + + $id = $object->create($user); + if ($id > 0) + { + dol_include_once('/' . $element . '/class/' . $subelement . '.class.php'); + + $classname = ucfirst($subelement); + $srcobject = new $classname($db); + + dol_syslog("Try to find source object origin=" . $object->origin . " originid=" . $object->origin_id . " to add lines"); + $result = $srcobject->fetch($object->origin_id); + + if ($result > 0) + { + $lines = $srcobject->lines; + if (empty($lines) && method_exists($srcobject, 'fetch_lines')) + { + $srcobject->fetch_lines(); + $lines = $srcobject->lines; + } + + $fk_parent_line=0; + $num=count($lines); + for ($i=0;$i<$num;$i++) + { + $label=(! empty($lines[$i]->label)?$lines[$i]->label:''); + $desc=(! empty($lines[$i]->desc)?$lines[$i]->desc:$lines[$i]->libelle); + + // Positive line + $product_type = ($lines[$i]->product_type ? $lines[$i]->product_type : 0); + + // Date start + $date_start = false; + if ($lines[$i]->date_debut_prevue) + $date_start = $lines[$i]->date_debut_prevue; + if ($lines[$i]->date_debut_reel) + $date_start = $lines[$i]->date_debut_reel; + if ($lines[$i]->date_start) + $date_start = $lines[$i]->date_start; + + // Date end + $date_end = false; + if ($lines[$i]->date_fin_prevue) + $date_end = $lines[$i]->date_fin_prevue; + if ($lines[$i]->date_fin_reel) + $date_end = $lines[$i]->date_fin_reel; + if ($lines[$i]->date_end) + $date_end = $lines[$i]->date_end; + + // Reset fk_parent_line for no child products and special product + if (($lines[$i]->product_type != 9 && empty($lines[$i]->fk_parent_line)) || $lines[$i]->product_type == 9) { + $fk_parent_line = 0; + } + + // Extrafields + if (empty($conf->global->MAIN_EXTRAFIELDS_DISABLED) && method_exists($lines[$i], 'fetch_optionals')) { + $lines[$i]->fetch_optionals($lines[$i]->rowid); + $array_option = $lines[$i]->array_options; + } + + $tva_tx=get_default_tva($mysoc, $object->thirdparty); + + $result = $object->addline($desc, $lines[$i]->subprice, $lines[$i]->qty, $tva_tx, $lines[$i]->localtax1_tx, $lines[$i]->localtax2_tx, $lines[$i]->fk_product, $lines[$i]->remise_percent, 'HT', 0, $lines[$i]->info_bits, $product_type, $lines[$i]->rang, $lines[$i]->special_code, $fk_parent_line, $lines[$i]->fk_fournprice, $lines[$i]->pa_ht, $label, $date_start, $date_end, $array_option); + + if ($result > 0) { + $lineid = $result; + } else { + $lineid = 0; + $error ++; + break; + } + + // Defined the new fk_parent_line + if ($result > 0 && $lines[$i]->product_type == 9) { + $fk_parent_line = $result; + } + } + + // Hooks + $parameters = array('objFrom' => $srcobject); + $reshook = $hookmanager->executeHooks('createFrom', $parameters, $object, $action); // Note that $action and $object may have been + // modified by hook + if ($reshook < 0) + $error ++; + } else { + setEventMessages($srcobject->error, $srcobject->errors, 'errors'); + $error ++; + } + } else { + setEventMessages($object->error, $object->errors, 'errors'); + $error ++; + } + } // Standard creation + else + { + $id = $object->create($user); + } + + if ($id > 0) + { + // Insertion contact par defaut si defini + if (GETPOST('contactid') > 0) + { + $result = $object->add_contact(GETPOST('contactid'), 'CUSTOMER', 'external'); + if ($result < 0) + { + $error++; + setEventMessage($langs->trans("ErrorFailedToAddContact"), 'errors'); + } + } + + if (! $error) + { + $db->commit(); + + // Define output language + if (empty($conf->global->MAIN_DISABLE_PDF_AUTOUPDATE)) + { + $outputlangs = $langs; + $newlang = ''; + if ($conf->global->MAIN_MULTILANGS && empty($newlang) && GETPOST('lang_id')) $newlang = GETPOST('lang_id','alpha'); + if ($conf->global->MAIN_MULTILANGS && empty($newlang)) $newlang = $object->thirdparty->default_lang; + if (! empty($newlang)) { + $outputlangs = new Translate("", $conf); + $outputlangs->setDefaultLang($newlang); + } + $model=$object->modelpdf; + + $ret = $object->fetch($id); // Reload to get new records + $result=$object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref); + if ($result < 0) dol_print_error($db,$result); + } + + header('Location: ' . $_SERVER["PHP_SELF"] . '?id=' . $id); + exit(); + } + else + { + $db->rollback(); + $action='create'; + } + } + else + { + setEventMessages($object->error, $object->errors, 'errors'); + $db->rollback(); + $action='create'; + } + } + } + } + + // Classify billed + else if ($action == 'classifybilled' && $user->rights->askpricesupplier->cloturer) { + $object->cloture($user, 4, ''); + } + + // Reopen proposal + else if ($action == 'confirm_reopen' && $user->rights->askpricesupplier->cloturer && ! GETPOST('cancel')) { + // prevent browser refresh from reopening proposal several times + if ($object->statut == 2 || $object->statut == 3 || $object->statut == 4) { + $object->reopen($user, 1); + } + } + + // Close proposal + else if ($action == 'setstatut' && $user->rights->askpricesupplier->cloturer && ! GETPOST('cancel')) { + if (! GETPOST('statut')) { + setEventMessage($langs->trans("ErrorFieldRequired", $langs->transnoentities("CloseAs")), 'errors'); + $action = 'statut'; + } else { + // prevent browser refresh from closing proposal several times + if ($object->statut == 1) { + $object->cloture($user, GETPOST('statut'), GETPOST('note')); + } + } + } + + // Classify billed + else if ($action == 'classifybilled' && $user->rights->askpricesupplier->cloturer) { + $object->cloture($user, 4, ''); + } + + // Reopen proposal + else if ($action == 'confirm_reopen' && $user->rights->askpricesupplier->cloturer && ! GETPOST('cancel')) { + // prevent browser refresh from reopening proposal several times + if ($object->statut == 2 || $object->statut == 3 || $object->statut == 4) { + $object->reopen($user, 1); + } + } + + // Close proposal + else if ($action == 'setstatut' && $user->rights->askpricesupplier->cloturer && ! GETPOST('cancel')) { + if (! GETPOST('statut')) { + setEventMessage($langs->trans("ErrorFieldRequired", $langs->transnoentities("CloseAs")), 'errors'); + $action = 'statut'; + } else { + // prevent browser refresh from closing proposal several times + if ($object->statut == 1) { + $object->cloture($user, GETPOST('statut'), GETPOST('note')); + } + } + } + + include DOL_DOCUMENT_ROOT.'/core/actions_printing.inc.php'; + + + /* + * Send mail + */ + + // Actions to send emails + $actiontypecode='AC_ASKPRICE'; + $trigger_name='ASKPRICESUPPLIER_SENTBYMAIL'; + $paramname='id'; + $mode='emailfromaskpricesupplier'; + include DOL_DOCUMENT_ROOT.'/core/actions_sendmails.inc.php'; + + + + // Go back to draft + if ($action == 'modif' && $user->rights->askpricesupplier->creer) + { + $object->set_draft($user); + + if (empty($conf->global->MAIN_DISABLE_PDF_AUTOUPDATE)) + { + // Define output language + $outputlangs = $langs; + if (! empty($conf->global->MAIN_MULTILANGS)) { + $outputlangs = new Translate("", $conf); + $newlang = (GETPOST('lang_id') ? GETPOST('lang_id') : $object->thirdparty->default_lang); + $outputlangs->setDefaultLang($newlang); + } + $ret = $object->fetch($id); // Reload to get new records + $object->generateDocument($object->modelpdf, $outputlangs, $hidedetails, $hidedesc, $hideref); + } + } + + else if ($action == "setabsolutediscount" && $user->rights->askpricesupplier->creer) { + if ($_POST["remise_id"]) { + if ($object->id > 0) { + $result = $object->insert_discount($_POST["remise_id"]); + if ($result < 0) { + setEventMessage($object->error, 'errors'); + } + } + } + } + + // Add line + else if ($action == 'addline' && $user->rights->askpricesupplier->creer) { + + // Set if we used free entry or predefined product + $predef=''; + $product_desc=(GETPOST('dp_desc')?GETPOST('dp_desc'):''); + $price_ht = GETPOST('price_ht'); + if (GETPOST('prod_entry_mode') == 'free') + { + $idprod=0; + $tva_tx = (GETPOST('tva_tx') ? GETPOST('tva_tx') : 0); + } + else + { + $idprod=GETPOST('idprod', 'int'); + $tva_tx = ''; + } + + $qty = GETPOST('qty' . $predef); + $remise_percent = GETPOST('remise_percent' . $predef); + + // Extrafields + $extrafieldsline = new ExtraFields($db); + $extralabelsline = $extrafieldsline->fetch_name_optionals_label($object->table_element_line); + $array_option = $extrafieldsline->getOptionalsFromPost($extralabelsline, $predef); + // Unset extrafield + if (is_array($extralabelsline)) { + // Get extra fields + foreach ($extralabelsline as $key => $value) { + unset($_POST["options_" . $key]); + } + } + + if (GETPOST('prod_entry_mode') == 'free' && empty($idprod) && GETPOST('type') < 0) { + setEventMessage($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("Type")), 'errors'); + $error ++; + } + + if (GETPOST('prod_entry_mode') == 'free' && empty($idprod) && $price_ht == '') // Unit price can be 0 but not ''. Also price can be negative for proposal. + { + setEventMessage($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("UnitPriceHT")), 'errors'); + $error ++; + } + if (GETPOST('prod_entry_mode') == 'free' && empty($idprod) && empty($product_desc)) { + setEventMessage($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("Description")), 'errors'); + $error ++; + } + + if (! $error && ($qty >= 0) && (! empty($product_desc) || ! empty($idprod))) { + $pu_ht = 0; + $pu_ttc = 0; + $price_min = 0; + $price_base_type = (GETPOST('price_base_type', 'alpha') ? GETPOST('price_base_type', 'alpha') : 'HT'); + + $db->begin(); + + // Ecrase $pu par celui du produit + // Ecrase $desc par celui du produit + // Ecrase $txtva par celui du produit + if (! empty($idprod)) { + $prod = new Product($db); + $prod->fetch($idprod); + + $label = ((GETPOST('product_label') && GETPOST('product_label') != $prod->label) ? GETPOST('product_label') : ''); + + // If prices fields are update + $tva_tx = get_default_tva($mysoc, $object->thirdparty, $prod->id); + $tva_npr = get_default_npr($mysoc, $object->thirdparty, $prod->id); + $pu_ht = $prod->price; + $pu_ttc = $prod->price_ttc; + $price_min = $prod->price_min; + $price_base_type = $prod->price_base_type; + + // On defini prix unitaire + if (! empty($conf->global->PRODUIT_MULTIPRICES) && $object->thirdparty->price_level) + { + $pu_ht = $prod->multiprices[$object->thirdparty->price_level]; + $pu_ttc = $prod->multiprices_ttc[$object->thirdparty->price_level]; + $price_min = $prod->multiprices_min[$object->thirdparty->price_level]; + $price_base_type = $prod->multiprices_base_type[$object->thirdparty->price_level]; + if (isset($prod->multiprices_tva_tx[$object->thirdparty->price_level])) $tva_tx=$prod->multiprices_tva_tx[$object->thirdparty->price_level]; + if (isset($prod->multiprices_recuperableonly[$object->thirdparty->price_level])) $tva_npr=$prod->multiprices_recuperableonly[$object->thirdparty->price_level]; + } + elseif (! empty($conf->global->PRODUIT_CUSTOMER_PRICES)) + { + require_once DOL_DOCUMENT_ROOT . '/product/class/productcustomerprice.class.php'; + + $prodcustprice = new Productcustomerprice($db); + + $filter = array('t.fk_product' => $prod->id,'t.fk_soc' => $object->thirdparty->id); + + $result = $prodcustprice->fetch_all('', '', 0, 0, $filter); + if ($result) { + if (count($prodcustprice->lines) > 0) { + $pu_ht = price($prodcustprice->lines [0]->price); + $pu_ttc = price($prodcustprice->lines [0]->price_ttc); + $price_base_type = $prodcustprice->lines [0]->price_base_type; + $prod->tva_tx = $prodcustprice->lines [0]->tva_tx; + } + } + } + + // if price ht is forced (ie: calculated by margin rate and cost price) + if (! empty($price_ht)) { + $pu_ht = price2num($price_ht, 'MU'); + $pu_ttc = price2num($pu_ht * (1 + ($tva_tx / 100)), 'MU'); + } + + // On reevalue prix selon taux tva car taux tva transaction peut etre different + // de ceux du produit par defaut (par exemple si pays different entre vendeur et acheteur). + elseif ($tva_tx != $prod->tva_tx) { + if ($price_base_type != 'HT') { + $pu_ht = price2num($pu_ttc / (1 + ($tva_tx / 100)), 'MU'); + } else { + $pu_ttc = price2num($pu_ht * (1 + ($tva_tx / 100)), 'MU'); + } + } + + $desc = ''; + + // Define output language + if (! empty($conf->global->MAIN_MULTILANGS) && ! empty($conf->global->PRODUIT_TEXTS_IN_THIRDPARTY_LANGUAGE)) { + $outputlangs = $langs; + $newlang = ''; + if (empty($newlang) && GETPOST('lang_id')) + $newlang = GETPOST('lang_id'); + if (empty($newlang)) + $newlang = $object->thirdparty->default_lang; + if (! empty($newlang)) { + $outputlangs = new Translate("", $conf); + $outputlangs->setDefaultLang($newlang); + } + + $desc = (! empty($prod->multilangs [$outputlangs->defaultlang] ["description"])) ? $prod->multilangs [$outputlangs->defaultlang] ["description"] : $prod->description; + } else { + $desc = $prod->description; + } + + $desc = dol_concatdesc($desc, $product_desc); + + // Add custom code and origin country into description + if (empty($conf->global->MAIN_PRODUCT_DISABLE_CUSTOMCOUNTRYCODE) && (! empty($prod->customcode) || ! empty($prod->country_code))) { + $tmptxt = '('; + if (! empty($prod->customcode)) + $tmptxt .= $langs->transnoentitiesnoconv("CustomCode") . ': ' . $prod->customcode; + if (! empty($prod->customcode) && ! empty($prod->country_code)) + $tmptxt .= ' - '; + if (! empty($prod->country_code)) + $tmptxt .= $langs->transnoentitiesnoconv("CountryOrigin") . ': ' . getCountry($prod->country_code, 0, $db, $langs, 0); + $tmptxt .= ')'; + $desc = dol_concatdesc($desc, $tmptxt); + } + + $type = $prod->type; + } else { + $pu_ht = price2num($price_ht, 'MU'); + $pu_ttc = price2num(GETPOST('price_ttc'), 'MU'); + $tva_npr = (preg_match('/\*/', $tva_tx) ? 1 : 0); + $tva_tx = str_replace('*', '', $tva_tx); + $label = (GETPOST('product_label') ? GETPOST('product_label') : ''); + $desc = $product_desc; + $type = GETPOST('type'); + } + + // Margin + $fournprice = (GETPOST('fournprice' . $predef) ? GETPOST('fournprice' . $predef) : ''); + $buyingprice = (GETPOST('buying_price' . $predef) ? GETPOST('buying_price' . $predef) : ''); + + $date_start = dol_mktime(0, 0, 0, GETPOST('date_start' . $predef . 'month'), GETPOST('date_start' . $predef . 'day'), GETPOST('date_start' . $predef . 'year')); + $date_end = dol_mktime(0, 0, 0, GETPOST('date_end' . $predef . 'month'), GETPOST('date_end' . $predef . 'day'), GETPOST('date_end' . $predef . 'year')); + + // Local Taxes + $localtax1_tx = get_localtax($tva_tx, 1, $object->thirdparty); + $localtax2_tx = get_localtax($tva_tx, 2, $object->thirdparty); + + $info_bits = 0; + if ($tva_npr) + $info_bits |= 0x01; + + if (! empty($price_min) && (price2num($pu_ht) * (1 - price2num($remise_percent) / 100) < price2num($price_min))) { + $mesg = $langs->trans("CantBeLessThanMinPrice", price(price2num($price_min, 'MU'), 0, $langs, 0, 0, - 1, $conf->currency)); + setEventMessage($mesg, 'errors'); + } else { + // Insert line + $result = $object->addline($desc, $pu_ht, $qty, $tva_tx, $localtax1_tx, $localtax2_tx, $idprod, $remise_percent, $price_base_type, $pu_ttc, $info_bits, $type, - 1, 0, GETPOST('fk_parent_line'), $fournprice, $buyingprice, $label, $date_start, $date_end, $array_option); + + if ($result > 0) { + $db->commit(); + + if (empty($conf->global->MAIN_DISABLE_PDF_AUTOUPDATE)) { + // Define output language + $outputlangs = $langs; + if (! empty($conf->global->MAIN_MULTILANGS)) { + $outputlangs = new Translate("", $conf); + $newlang = (GETPOST('lang_id') ? GETPOST('lang_id') : $object->thirdparty->default_lang); + $outputlangs->setDefaultLang($newlang); + } + $ret = $object->fetch($id); // Reload to get new records + $object->generateDocument($object->modelpdf, $outputlangs, $hidedetails, $hidedesc, $hideref); + } + + unset($_POST['prod_entry_mode']); + + unset($_POST['qty']); + unset($_POST['type']); + unset($_POST['remise_percent']); + unset($_POST['price_ht']); + unset($_POST['price_ttc']); + unset($_POST['tva_tx']); + unset($_POST['product_ref']); + unset($_POST['product_label']); + unset($_POST['product_desc']); + unset($_POST['fournprice']); + unset($_POST['buying_price']); + unset($_POST['np_marginRate']); + unset($_POST['np_markRate']); + unset($_POST['dp_desc']); + unset($_POST['idprod']); + + unset($_POST['date_starthour']); + unset($_POST['date_startmin']); + unset($_POST['date_startsec']); + unset($_POST['date_startday']); + unset($_POST['date_startmonth']); + unset($_POST['date_startyear']); + unset($_POST['date_endhour']); + unset($_POST['date_endmin']); + unset($_POST['date_endsec']); + unset($_POST['date_endday']); + unset($_POST['date_endmonth']); + unset($_POST['date_endyear']); + } else { + $db->rollback(); + + setEventMessage($object->error, 'errors'); + } + } + } + } + + // Mise a jour d'une ligne dans la propale + else if ($action == 'updateligne' && $user->rights->askpricesupplier->creer && GETPOST('save') == $langs->trans("Save")) { + // Define info_bits + $info_bits = 0; + if (preg_match('/\*/', GETPOST('tva_tx'))) + $info_bits |= 0x01; + + // Clean parameters + $description = dol_htmlcleanlastbr(GETPOST('product_desc')); + + // Define vat_rate + $vat_rate = (GETPOST('tva_tx') ? GETPOST('tva_tx') : 0); + $vat_rate = str_replace('*', '', $vat_rate); + $localtax1_rate = get_localtax($vat_rate, 1, $object->thirdparty); + $localtax2_rate = get_localtax($vat_rate, 2, $object->thirdparty); + $pu_ht = GETPOST('price_ht'); + + // Add buying price + $fournprice = (GETPOST('fournprice') ? GETPOST('fournprice') : ''); + $buyingprice = (GETPOST('buying_price') ? GETPOST('buying_price') : ''); + + $date_start = dol_mktime(0, 0, 0, GETPOST('date_startmonth'), GETPOST('date_startday'), GETPOST('date_startyear')); + $date_end = dol_mktime(0, 0, 0, GETPOST('date_endmonth'), GETPOST('date_endday'), GETPOST('date_endyear')); + + // Extrafields + $extrafieldsline = new ExtraFields($db); + $extralabelsline = $extrafieldsline->fetch_name_optionals_label($object->table_element_line); + $array_option = $extrafieldsline->getOptionalsFromPost($extralabelsline); + // Unset extrafield + if (is_array($extralabelsline)) { + // Get extra fields + foreach ($extralabelsline as $key => $value) { + unset($_POST["options_" . $key]); + } + } + + // Define special_code for special lines + $special_code=GETPOST('special_code'); + if (! GETPOST('qty')) $special_code=3; + + // Check minimum price + $productid = GETPOST('productid', 'int'); + if (! empty($productid)) { + $product = new Product($db); + $res = $product->fetch($productid); + + $type = $product->type; + + $price_min = $product->price_min; + if (! empty($conf->global->PRODUIT_MULTIPRICES) && ! empty($object->thirdparty->price_level)) + $price_min = $product->multiprices_min [$object->thirdparty->price_level]; + + $label = ((GETPOST('update_label') && GETPOST('product_label')) ? GETPOST('product_label') : ''); + + if ($price_min && (price2num($pu_ht) * (1 - price2num(GETPOST('remise_percent')) / 100) < price2num($price_min))) { + setEventMessage($langs->trans("CantBeLessThanMinPrice", price(price2num($price_min, 'MU'), 0, $langs, 0, 0, - 1, $conf->currency)), 'errors'); + $error ++; + } + } else { + $type = GETPOST('type'); + $label = (GETPOST('product_label') ? GETPOST('product_label') : ''); + + // Check parameters + if (GETPOST('type') < 0) { + setEventMessage($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("Type")), 'errors'); + $error ++; + } + } + + if (! $error) { + $db->begin(); + + $result = $object->updateline(GETPOST('lineid'), $pu_ht, GETPOST('qty'), GETPOST('remise_percent'), $vat_rate, $localtax1_rate, $localtax2_rate, $description, 'HT', $info_bits, $special_code, GETPOST('fk_parent_line'), 0, $fournprice, $buyingprice, $label, $type, $date_start, $date_end, $array_option); + + if ($result >= 0) { + $db->commit(); + + if (empty($conf->global->MAIN_DISABLE_PDF_AUTOUPDATE)) { + // Define output language + $outputlangs = $langs; + if (! empty($conf->global->MAIN_MULTILANGS)) { + $outputlangs = new Translate("", $conf); + $newlang = (GETPOST('lang_id') ? GETPOST('lang_id') : $object->thirdparty->default_lang); + $outputlangs->setDefaultLang($newlang); + } + $ret = $object->fetch($id); // Reload to get new records + $object->generateDocument($object->modelpdf, $outputlangs, $hidedetails, $hidedesc, $hideref); + } + + unset($_POST['qty']); + unset($_POST['type']); + unset($_POST['productid']); + unset($_POST['remise_percent']); + unset($_POST['price_ht']); + unset($_POST['price_ttc']); + unset($_POST['tva_tx']); + unset($_POST['product_ref']); + unset($_POST['product_label']); + unset($_POST['product_desc']); + unset($_POST['fournprice']); + unset($_POST['buying_price']); + } else { + $db->rollback(); + + setEventMessage($object->error, 'errors'); + } + } + } + + else if ($action == 'updateligne' && $user->rights->propal->creer && GETPOST('cancel') == $langs->trans('Cancel')) { + header('Location: ' . $_SERVER['PHP_SELF'] . '?id=' . $object->id); // Pour reaffichage de la fiche en cours d'edition + exit(); + } + + // Generation doc (depuis lien ou depuis cartouche doc) + else if ($action == 'builddoc' && $user->rights->askpricesupplier->creer) { + if (GETPOST('model')) { + $object->setDocModel($user, GETPOST('model')); + } + + // Define output language + $outputlangs = $langs; + if (! empty($conf->global->MAIN_MULTILANGS)) { + $outputlangs = new Translate("", $conf); + $newlang = (GETPOST('lang_id') ? GETPOST('lang_id') : $object->thirdparty->default_lang); + $outputlangs->setDefaultLang($newlang); + } + $ret = $object->fetch($id); // Reload to get new records + $result = $object->generateDocument($object->modelpdf, $outputlangs, $hidedetails, $hidedesc, $hideref); + + if ($result <= 0) { + dol_print_error($db, $result); + exit(); + } else { + header('Location: ' . $_SERVER["PHP_SELF"] . '?id=' . $object->id . (empty($conf->global->MAIN_JUMP_TAG) ? '' : '#builddoc')); + exit(); + } + } + + // Remove file in doc form + else if ($action == 'remove_file' && $user->rights->askpricesupplier->creer) { + if ($object->id > 0) { + require_once DOL_DOCUMENT_ROOT . '/core/lib/files.lib.php'; + + $langs->load("other"); + $upload_dir = $conf->askpricesupplier->dir_output; + $file = $upload_dir . '/' . GETPOST('file'); + $ret = dol_delete_file($file, 0, 0, 0, $object); + if ($ret) + setEventMessage($langs->trans("FileWasRemoved", GETPOST('file'))); + else + setEventMessage($langs->trans("ErrorFailToDeleteFile", GETPOST('file')), 'errors'); + } + } + + // Set project + else if ($action == 'classin' && $user->rights->askpricesupplier->creer) { + $object->setProject($_POST['projectid']); + } + + // Delai de livraison + else if ($action == 'setavailability' && $user->rights->askpricesupplier->creer) { + $result = $object->availability($_POST['availability_id']); + } + + // Origine de la propale + else if ($action == 'setdemandreason' && $user->rights->askpricesupplier->creer) { + $result = $object->demand_reason($_POST['demand_reason_id']); + } + + // Conditions de reglement + else if ($action == 'setconditions' && $user->rights->askpricesupplier->creer) { + $result = $object->setPaymentTerms(GETPOST('cond_reglement_id', 'int')); + } + + else if ($action == 'setremisepercent' && $user->rights->askpricesupplier->creer) { + $result = $object->set_remise_percent($user, $_POST['remise_percent']); + } + + else if ($action == 'setremiseabsolue' && $user->rights->askpricesupplier->creer) { + $result = $object->set_remise_absolue($user, $_POST['remise_absolue']); + } + + // Mode de reglement + else if ($action == 'setmode' && $user->rights->askpricesupplier->creer) { + $result = $object->setPaymentMethods(GETPOST('mode_reglement_id', 'int')); + } + + // bank account + else if ($action == 'setbankaccount' && $user->rights->askpricesupplier->creer) { + $result=$object->setBankAccount(GETPOST('fk_account', 'int')); + } + + // shipping method + else if ($action == 'setshippingmethod' && $user->rights->askpricesupplier->creer) { + $result=$object->setShippingMethod(GETPOST('shipping_method_id', 'int')); + } + + /* + * Ordonnancement des lignes + */ + + else if ($action == 'up' && $user->rights->askpricesupplier->creer) { + $object->line_up(GETPOST('rowid')); + + if (empty($conf->global->MAIN_DISABLE_PDF_AUTOUPDATE)) { + // Define output language + $outputlangs = $langs; + if (! empty($conf->global->MAIN_MULTILANGS)) { + $outputlangs = new Translate("", $conf); + $newlang = (GETPOST('lang_id') ? GETPOST('lang_id') : $object->thirdparty->default_lang); + $outputlangs->setDefaultLang($newlang); + } + $ret = $object->fetch($id); // Reload to get new records + $object->generateDocument($object->modelpdf, $outputlangs, $hidedetails, $hidedesc, $hideref); + } + + header('Location: ' . $_SERVER["PHP_SELF"] . '?id=' . $id . '#' . GETPOST('rowid')); + exit(); + } + + else if ($action == 'down' && $user->rights->askpricesupplier->creer) { + $object->line_down(GETPOST('rowid')); + + if (empty($conf->global->MAIN_DISABLE_PDF_AUTOUPDATE)) { + // Define output language + $outputlangs = $langs; + if (! empty($conf->global->MAIN_MULTILANGS)) { + $outputlangs = new Translate("", $conf); + $newlang = (GETPOST('lang_id') ? GETPOST('lang_id') : $object->thirdparty->default_lang); + $outputlangs->setDefaultLang($newlang); + } + $ret = $object->fetch($id); // Reload to get new records + $object->generateDocument($object->modelpdf, $outputlangs, $hidedetails, $hidedesc, $hideref); + } + + header('Location: ' . $_SERVER["PHP_SELF"] . '?id=' . $id . '#' . GETPOST('rowid')); + exit(); + } else if ($action == 'update_extras') { + // Fill array 'array_options' with data from update form + $extralabels = $extrafields->fetch_name_optionals_label($object->table_element); + $ret = $extrafields->setOptionalsFromPost($extralabels, $object, GETPOST('attribute')); + if ($ret < 0) + $error ++; + + if (! $error) { + // Actions on extra fields (by external module or standard code) + // FIXME le hook fait double emploi avec le trigger !! + $hookmanager->initHooks(array('propaldao')); + $parameters = array('id' => $object->id); + $reshook = $hookmanager->executeHooks('insertExtraFields', $parameters, $object, $action); // Note that $action and $object may have been + // modified by + // some hooks + if (empty($reshook)) { + $result = $object->insertExtraFields(); + if ($result < 0) { + $error ++; + } + } else if ($reshook < 0) + $error ++; + } + + if ($error) + $action = 'edit_extras'; + } + + if (! empty($conf->global->MAIN_DISABLE_CONTACTS_TAB) && $user->rights->askpricesupplier->creer) + { + if ($action == 'addcontact') + { + if ($object->id > 0) { + $contactid = (GETPOST('userid') ? GETPOST('userid') : GETPOST('contactid')); + $result = $object->add_contact($contactid, $_POST["type"], $_POST["source"]); + } + + if ($result >= 0) { + header("Location: " . $_SERVER['PHP_SELF'] . "?id=" . $object->id); + exit(); + } else { + if ($object->error == 'DB_ERROR_RECORD_ALREADY_EXISTS') { + $langs->load("errors"); + setEventMessage($langs->trans("ErrorThisContactIsAlreadyDefinedAsThisType"), 'errors'); + } else { + setEventMessage($object->error, 'errors'); + } + } + } + + // Bascule du statut d'un contact + else if ($action == 'swapstatut') { + if ($object->fetch($id) > 0) { + $result = $object->swapContactStatus(GETPOST('ligne')); + } else { + dol_print_error($db); + } + } + + // Efface un contact + else if ($action == 'deletecontact') { + $object->fetch($id); + $result = $object->delete_contact($lineid); + + if ($result >= 0) { + header("Location: " . $_SERVER['PHP_SELF'] . "?id=" . $object->id); + exit(); + } else { + dol_print_error($db); + } + } + } +} + + +/* + * View + */ + +llxHeader('', $langs->trans('CommRequests'), 'EN:Commercial_Proposals|FR:Proposition_commerciale|ES:Presupuestos'); + +$form = new Form($db); +$formother = new FormOther($db); +$formfile = new FormFile($db); +$formpropal = new FormPropal($db); +$companystatic = new Societe($db); + +$now = dol_now(); + +// Add new proposal +if ($action == 'create') +{ + print_fiche_titre($langs->trans("NewAskPrice")); + + $soc = new Societe($db); + if ($socid > 0) + $res = $soc->fetch($socid); + + // Load objectsrc + if (! empty($origin) && ! empty($originid)) + { + // Parse element/subelement (ex: project_task) + $element = $subelement = $origin; + if (preg_match('/^([^_]+)_([^_]+)/i', $origin, $regs)) { + $element = $regs [1]; + $subelement = $regs [2]; + } + + if ($element == 'project') { + $projectid = $originid; + } else { + // For compatibility + if ($element == 'order' || $element == 'commande') { + $element = $subelement = 'commande'; + } + if ($element == 'askpricesupplier') { + $element = 'comm/askpricesupplier'; + $subelement = 'askpricesupplier'; + } + if ($element == 'contract') { + $element = $subelement = 'contrat'; + } + if ($element == 'shipping') { + $element = $subelement = 'expedition'; + } + + dol_include_once('/' . $element . '/class/' . $subelement . '.class.php'); + + $classname = ucfirst($subelement); + $objectsrc = new $classname($db); + $objectsrc->fetch($originid); + if (empty($objectsrc->lines) && method_exists($objectsrc, 'fetch_lines')) + { + $objectsrc->fetch_lines(); + } + $objectsrc->fetch_thirdparty(); + + $projectid = (! empty($objectsrc->fk_project) ? $objectsrc->fk_project : ''); + $ref_client = (! empty($objectsrc->ref_client) ? $objectsrc->ref_client : ''); + $ref_int = (! empty($objectsrc->ref_int) ? $objectsrc->ref_int : ''); + + $soc = $objectsrc->thirdparty; + + $cond_reglement_id = (! empty($objectsrc->cond_reglement_id)?$objectsrc->cond_reglement_id:(! empty($soc->cond_reglement_id)?$soc->cond_reglement_id:1)); + $mode_reglement_id = (! empty($objectsrc->mode_reglement_id)?$objectsrc->mode_reglement_id:(! empty($soc->mode_reglement_id)?$soc->mode_reglement_id:0)); + $remise_percent = (! empty($objectsrc->remise_percent)?$objectsrc->remise_percent:(! empty($soc->remise_percent)?$soc->remise_percent:0)); + $remise_absolue = (! empty($objectsrc->remise_absolue)?$objectsrc->remise_absolue:(! empty($soc->remise_absolue)?$soc->remise_absolue:0)); + $dateinvoice = (empty($dateinvoice)?(empty($conf->global->MAIN_AUTOFILL_DATE)?-1:''):$dateinvoice); + + // Replicate extrafields + $objectsrc->fetch_optionals($originid); + $object->array_options = $objectsrc->array_options; + } + } + + $object = new AskPriceSupplier($db); + + print '
'; + print ''; + print ''; + if ($origin != 'project' && $originid) { + print ''; + print ''; + } + + dol_fiche_head(); + + print ''; + + // Reference + print ''; + + // Ref customer + print ''; + print ''; + + // Third party + print ''; + print ''; + if ($socid > 0) { + print ''; + } else { + print ''; + } + print '' . "\n"; + + // Contacts (ask contact only if thirdparty already defined). TODO do this also into order and invoice. + if ($socid > 0) + { + print "'; + } + + if ($socid > 0) + { + // Ligne info remises tiers + print ''; + } + + // Date + print ''; + + // Validaty duration + print ''; + + // Terms of payment + print ''; + + // Mode of payment + print ''; + + // Bank Account + if (! empty($conf->global->BANK_ASK_PAYMENT_BANK_DURING_PROPOSAL) && $conf->banque->enabled) { + print ''; + } + + // What trigger creation + print ''; + + // Delivery delay + print ''; + + // Shipping Method + if (! empty($conf->expedition->enabled)) { + print ''; + } + + // Delivery date (or manufacturing) + print ''; + print ''; + + // Model + print ''; + print ''; + print '"; + + // Project + if (! empty($conf->projet->enabled) && $socid > 0) { + + $formproject = new FormProjets($db); + + $projectid = 0; + if ($origin == 'project') + $projectid = ($originid ? $originid : 0); + + print ''; + print ''; + print ''; + } + + // Other attributes + $parameters = array('colspan' => ' colspan="3"'); + $reshook = $hookmanager->executeHooks('formObjectOptions', $parameters, $object, $action); // Note that $action and $object may have been modified + // by + // hook + if (empty($reshook) && ! empty($extrafields->attribute_label)) { + print $object->showOptionals($extrafields, 'edit'); + } + + + // Lines from source + if (! empty($origin) && ! empty($originid) && is_object($objectsrc)) + { + // TODO for compatibility + if ($origin == 'contrat') { + // Calcul contrat->price (HT), contrat->total (TTC), contrat->tva + $objectsrc->remise_absolue = $remise_absolue; + $objectsrc->remise_percent = $remise_percent; + $objectsrc->update_price(1, - 1, 1); + } + + print "\n"; + print "\n"; + print '' . "\n"; + print '' . "\n"; + print '' . "\n"; + print ''; + print ''; + + $newclassname = $classname; + if ($newclassname == 'Askpricesupplier') + $newclassname = 'CommRequest'; + elseif ($newclassname == 'Commande') + $newclassname = 'Order'; + elseif ($newclassname == 'Expedition') + $newclassname = 'Sending'; + elseif ($newclassname == 'Fichinter') + $newclassname = 'Intervention'; + + print ''; + print ''; + print '"; + if ($mysoc->localtax1_assuj == "1" || $objectsrc->total_localtax1 != 0 ) // Localtax1 + { + print '"; + } + + if ($mysoc->localtax2_assuj == "1" || $objectsrc->total_localtax2 != 0) // Localtax2 + { + print '"; + } + print '"; + } + + print "
' . $langs->trans('Ref') . '' . $langs->trans("Draft") . '
' . $langs->trans('RefCustomer') . ''; + print '
' . $langs->trans('Customer') . ''; + print $soc->getNomUrl(1); + print ''; + print ''; + print $form->select_company('', 'socid', 's.client = 1 OR s.client = 2 OR s.client = 3', 1); + print '
" . $langs->trans("DefaultContact") . ''; + $form->select_contacts($soc->id, $contactid, 'contactid', 1, $srccontactslist); + print '
' . $langs->trans('Discounts') . ''; + if ($soc->remise_percent) + print $langs->trans("CompanyHasRelativeDiscount", $soc->remise_percent); + else + print $langs->trans("CompanyHasNoRelativeDiscount"); + $absolute_discount = $soc->getAvailableDiscounts(); + print '. '; + if ($absolute_discount) + print $langs->trans("CompanyHasAbsoluteDiscount", price($absolute_discount), $langs->trans("Currency" . $conf->currency)); + else + print $langs->trans("CompanyHasNoAbsoluteDiscount"); + print '.'; + print '
' . $langs->trans('Date') . ''; + $form->select_date('', '', '', '', '', "addask", 1, 1); + print '
' . $langs->trans("ValidityDuration") . ' ' . $langs->trans("days") . '
' . $langs->trans('PaymentConditionsShort') . ''; + $form->select_conditions_paiements($soc->cond_reglement_id, 'cond_reglement_id'); + print '
' . $langs->trans('PaymentMode') . ''; + $form->select_types_paiements($soc->mode_reglement_id, 'mode_reglement_id'); + print '
' . $langs->trans('BankAccount') . ''; + $form->select_comptes($fk_account, 'fk_account', 0, '', 1); + print '
' . $langs->trans('Source') . ''; + $form->selectInputReason('', 'demand_reason_id', "SRC_PROP", 1); + print '
' . $langs->trans('AvailabilityPeriod') . ''; + $form->selectAvailabilityDelay('', 'availability_id', '', 1); + print '
' . $langs->trans('SendingMethod') . ''; + print $form->selectShippingMethod($shipping_method_id, 'shipping_method_id', '', 1); + print '
' . $langs->trans("DeliveryDate") . ''; + if ($conf->global->DATE_LIVRAISON_WEEK_DELAY != "") { + $tmpdte = time() + ((7 * $conf->global->DATE_LIVRAISON_WEEK_DELAY) * 24 * 60 * 60); + $syear = date("Y", $tmpdte); + $smonth = date("m", $tmpdte); + $sday = date("d", $tmpdte); + $form->select_date($syear."-".$smonth."-".$sday, 'liv_', '', '', '', "addask"); + } else { + $form->select_date(-1, 'liv_', '', '', '', "addask", 1, 1); + } + print '
' . $langs->trans("DefaultModel") . ''; + $liste = ModelePDFAskPriceSupplier::liste_modeles($db); + print $form->selectarray('model', $liste, ($conf->global->ASKPRICESUPPLIER_ADDON_PDF_ODT_DEFAULT ? $conf->global->ASKPRICESUPPLIER_ADDON_PDF_ODT_DEFAULT : $conf->global->ASKPRICESUPPLIER_ADDON_PDF)); + print "
' . $langs->trans("Project") . ''; + + $numprojet = $formproject->select_projects($soc->id, $projectid); + if ($numprojet == 0) { + $langs->load("projects"); + print '   ' . $langs->trans("AddProject") . ''; + } + print '
' . $langs->trans($newclassname) . '' . $objectsrc->getNomUrl(1) . '
' . $langs->trans('TotalHT') . '' . price($objectsrc->total_ht) . '
' . $langs->trans('TotalVAT') . '' . price($objectsrc->total_tva) . "
' . $langs->transcountry("AmountLT1", $mysoc->country_code) . '' . price($objectsrc->total_localtax1) . "
' . $langs->transcountry("AmountLT2", $mysoc->country_code) . '' . price($objectsrc->total_localtax2) . "
' . $langs->trans('TotalTTC') . '' . price($objectsrc->total_ttc) . "
\n"; + + + /* + * Combobox pour la fonction de copie + */ + + if (empty($conf->global->ASKPRICESUPPLIER_CLONE_ON_CREATE_PAGE)) print ''; + + if (! empty($conf->global->ASKPRICESUPPLIER_CLONE_ON_CREATE_PAGE) || ! empty($conf->global->PRODUCT_SHOW_WHEN_CREATE)) print '
'; + if (! empty($conf->global->ASKPRICESUPPLIER_CLONE_ON_CREATE_PAGE)) + { + // For backward compatibility + print ''; + print ''; + print ''; + print ''; + + if (! empty($conf->global->PRODUCT_SHOW_WHEN_CREATE)) + print ''; + + print ''; + print ''; + } + + if (! empty($conf->global->PRODUCT_SHOW_WHEN_CREATE)) + { + print ''; + } + if (! empty($conf->global->ASKPRICESUPPLIER_CLONE_ON_CREATE_PAGE) || ! empty($conf->global->PRODUCT_SHOW_WHEN_CREATE)) print '
' . $langs->trans("CopyAskFrom") . ' '; + $liste_ask = array(); + $liste_ask [0] = ''; + + $sql = "SELECT p.rowid as id, p.ref, s.nom"; + $sql .= " FROM " . MAIN_DB_PREFIX . "askpricesupplier p"; + $sql .= ", " . MAIN_DB_PREFIX . "societe s"; + $sql .= " WHERE s.rowid = p.fk_soc"; + $sql .= " AND p.entity = " . $conf->entity; + $sql .= " AND p.fk_statut <> 0"; + $sql .= " ORDER BY Id"; + + $resql = $db->query($sql); + if ($resql) { + $num = $db->num_rows($resql); + $i = 0; + while ($i < $num) { + $row = $db->fetch_row($resql); + $propalRefAndSocName = $row [1] . " - " . $row [2]; + $liste_ask [$row [0]] = $propalRefAndSocName; + $i ++; + } + print $form->selectarray("copie_askpricesupplier", $liste_ask, 0); + } else { + dol_print_error($db); + } + print '
 
' . $langs->trans("CreateEmptyAsk") . '
'; + if (! empty($conf->product->enabled) || ! empty($conf->service->enabled)) { + $lib = $langs->trans("ProductsAndServices"); + + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + for($i = 1; $i <= $conf->global->PRODUCT_SHOW_WHEN_CREATE; $i ++) { + print ''; + print ''; + print ''; + print ''; + } + print "
' . $lib . '' . $langs->trans("Qty") . '' . $langs->trans("ReductionShort") . '
'; + // multiprix + if ($conf->global->PRODUIT_MULTIPRICES && $soc->price_level) + $form->select_produits('', "idprod" . $i, '', $conf->product->limit_size, $soc->price_level); + else + $form->select_produits('', "idprod" . $i, '', $conf->product->limit_size); + print '%
"; + } + print '
'; + + dol_fiche_end(); + + $langs->load("bills"); + print '
'; + print ''; + print '     '; + print ''; + print '
'; + + print "
"; + + + // Show origin lines + if (! empty($origin) && ! empty($originid) && is_object($objectsrc)) { + print '
'; + + $title = $langs->trans('ProductsAndServices'); + print_titre($title); + + print ''; + + $objectsrc->printOriginLinesList(); + + print '
'; + } + +} else { + /* + * Show object in view mode + */ + + $soc = new Societe($db); + $soc->fetch($object->socid); + + $head = propal_prepare_head($object); + dol_fiche_head($head, 'comm', $langs->trans('CommRequest'), 0, 'CommRequest'); + + $formconfirm = ''; + + // Clone confirmation + if ($action == 'clone') { + // Create an array for form + $formquestion = array( + // 'text' => $langs->trans("ConfirmClone"), + // array('type' => 'checkbox', 'name' => 'clone_content', 'label' => $langs->trans("CloneMainAttributes"), 'value' => 1), + // array('type' => 'checkbox', 'name' => 'update_prices', 'label' => $langs->trans("PuttingPricesUpToDate"), 'value' => + // 1), + array('type' => 'other','name' => 'socid','label' => $langs->trans("SelectThirdParty"),'value' => $form->select_company(GETPOST('socid', 'int'), 'socid', '(s.client=1 OR s.client=2 OR s.client=3)'))); + // Paiement incomplet. On demande si motif = escompte ou autre + $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"] . '?id=' . $object->id, $langs->trans('CloneAsk'), $langs->trans('ConfirmCloneAsk', $object->ref), 'confirm_clone', $formquestion, 'yes', 1); + } + + // Confirm delete + else if ($action == 'delete') { + $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"] . '?id=' . $object->id, $langs->trans('DeleteAsk'), $langs->trans('ConfirmDeleteAsk', $object->ref), 'confirm_delete', '', 0, 1); + } + + // Confirm reopen + else if ($action == 'reopen') { + $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"] . '?id=' . $object->id, $langs->trans('ReOpen'), $langs->trans('ConfirmReOpenAsk', $object->ref), 'confirm_reopen', '', 0, 1); + } + + // Confirmation delete product/service line + else if ($action == 'ask_deleteline') { + $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"] . '?id=' . $object->id . '&lineid=' . $lineid, $langs->trans('DeleteProductLine'), $langs->trans('ConfirmDeleteProductLine'), 'confirm_deleteline', '', 0, 1); + } + + // Confirm validate proposal + else if ($action == 'validate') { + $error = 0; + + // on verifie si l'objet est en numerotation provisoire + $ref = substr($object->ref, 1, 4); + if ($ref == 'PROV') { + $numref = $object->getNextNumRef($soc); + if (empty($numref)) { + $error ++; + setEventMessage($object->error, 'errors'); + } + } else { + $numref = $object->ref; + } + + $text = $langs->trans('ConfirmValidateAsk', $numref); + if (! empty($conf->notification->enabled)) { + require_once DOL_DOCUMENT_ROOT . '/core/class/notify.class.php'; + $notify = new Notify($db); + $text .= '
'; + $text .= $notify->confirmMessage('ASKPRICESUPPLIER_VALIDATE', $object->socid); + } + + if (! $error) + $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"] . '?id=' . $object->id, $langs->trans('ValidateAsk'), $text, 'confirm_validate', '', 0, 1); + } + + if (! $formconfirm) { + $parameters = array('lineid' => $lineid); + $formconfirm = $hookmanager->executeHooks('formConfirm', $parameters, $object, $action); // Note that $action and $object may have been modified + // by + // hook + } + + // Print form confirm + print $formconfirm; + + print ''; + + $linkback = '' . $langs->trans("BackToList") . ''; + + // Ref + print ''; + + // Ref customer + print ''; + print ''; + + // Company + print ''; + print ''; + + // Ligne info remises tiers + print ''; + + // Date of proposal + print ''; + print ''; + + // Date end proposal + print ''; + print ''; + print ''; + + // Payment term + print ''; + print ''; + + // Delivery date + $langs->load('deliveries'); + print ''; + print ''; + + // Delivery delay + print ''; + print ''; + + // Shipping Method + if (! empty($conf->expedition->enabled)) { + print ''; + print ''; + } + + // Origin of demand + print ''; + print ''; + + // Payment mode + print ''; + print ''; + + // Project + if (! empty($conf->projet->enabled)) { + $langs->load("projects"); + print ''; + } else { + print '
' . $langs->trans('Ref') . ''; + print $form->showrefnav($object, 'ref', $linkback, 1, 'ref', 'ref', ''); + print '
'; + print ''; + if ($action != 'refclient' && ! empty($object->brouillon)) + print ''; + print ''; + print '
'; + print $langs->trans('RefCustomer') . '' . img_edit($langs->trans('Modify')) . '
'; + print '
'; + if ($user->rights->askpricesupplier->creer && $action == 'refclient') { + print '
'; + print ''; + print ''; + print ''; + print ' '; + print '
'; + } else { + print $object->ref_client; + } + print '
' . $langs->trans('Company') . '' . $soc->getNomUrl(1) . '
' . $langs->trans('Discounts') . ''; + if ($soc->remise_percent) + print $langs->trans("CompanyHasRelativeDiscount", $soc->remise_percent); + else + print $langs->trans("CompanyHasNoRelativeDiscount"); + print '. '; + $absolute_discount = $soc->getAvailableDiscounts('', 'fk_facture_source IS NULL'); + $absolute_creditnote = $soc->getAvailableDiscounts('', 'fk_facture_source IS NOT NULL'); + $absolute_discount = price2num($absolute_discount, 'MT'); + $absolute_creditnote = price2num($absolute_creditnote, 'MT'); + if ($absolute_discount) { + if ($object->statut > 0) { + print $langs->trans("CompanyHasAbsoluteDiscount", price($absolute_discount, 0, $langs, 0, 0, -1, $conf->currency)); + } else { + // Remise dispo de type non avoir + $filter = 'fk_facture_source IS NULL'; + print '
'; + $form->form_remise_dispo($_SERVER["PHP_SELF"] . '?id=' . $object->id, 0, 'remise_id', $soc->id, $absolute_discount, $filter); + } + } + if ($absolute_creditnote) { + print $langs->trans("CompanyHasCreditNote", price($absolute_creditnote, 0, $langs, 0, 0, -1, $conf->currency)) . '. '; + } + if (! $absolute_discount && ! $absolute_creditnote) + print $langs->trans("CompanyHasNoAbsoluteDiscount") . '.'; + print '
'; + print ''; + if ($action != 'editdate' && ! empty($object->brouillon)) + print ''; + print '
'; + print $langs->trans('Date'); + print 'id . '">' . img_edit($langs->trans('SetDate'), 1) . '
'; + print '
'; + if (! empty($object->brouillon) && $action == 'editdate') { + print '
'; + print ''; + print ''; + $form->select_date($object->date, 're', '', '', 0, "editdate"); + print ''; + print '
'; + } else { + if ($object->date) { + print dol_print_date($object->date, 'daytext'); + } else { + print ' '; + } + } + print '
'; + print ''; + if ($action != 'editecheance' && ! empty($object->brouillon)) + print ''; + print '
'; + print $langs->trans('DateEndAsk'); + print 'id . '">' . img_edit($langs->trans('SetConditions'), 1) . '
'; + print '
'; + if (! empty($object->brouillon) && $action == 'editecheance') { + print '
'; + print ''; + print ''; + $form->select_date($object->fin_validite, 'ech', '', '', '', "editecheance"); + print ''; + print '
'; + } else { + if (! empty($object->fin_validite)) { + print dol_print_date($object->fin_validite, 'daytext'); + if ($object->statut == 1 && $object->fin_validite < ($now - $conf->askpricesupplier->cloture->warning_delay)) + print img_warning($langs->trans("Late")); + } else { + print ' '; + } + } + print '
'; + print ''; + if ($action != 'editconditions' && ! empty($object->brouillon)) + print ''; + print '
'; + print $langs->trans('PaymentConditionsShort'); + print 'id . '">' . img_edit($langs->transnoentitiesnoconv('SetConditions'), 1) . '
'; + print '
'; + if ($action == 'editconditions') { + $form->form_conditions_reglement($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->cond_reglement_id, 'cond_reglement_id'); + } else { + $form->form_conditions_reglement($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->cond_reglement_id, 'none'); + } + print '
'; + print ''; + if ($action != 'editdate_livraison' && ! empty($object->brouillon)) + print ''; + print '
'; + print $langs->trans('DeliveryDate'); + print 'id . '">' . img_edit($langs->transnoentitiesnoconv('SetDeliveryDate'), 1) . '
'; + print '
'; + if ($action == 'editdate_livraison') { + print '
'; + print ''; + print ''; + $form->select_date($object->date_livraison, 'liv_', '', '', '', "editdate_livraison"); + print ''; + print '
'; + } else { + print dol_print_date($object->date_livraison, 'daytext'); + } + print '
'; + print ''; + if ($action != 'editavailability' && ! empty($object->brouillon)) + print ''; + print '
'; + print $langs->trans('AvailabilityPeriod'); + if (! empty($conf->commande->enabled)) + print ' (' . $langs->trans('AfterOrder') . ')'; + print 'id . '">' . img_edit($langs->transnoentitiesnoconv('SetAvailability'), 1) . '
'; + print '
'; + if ($action == 'editavailability') { + $form->form_availability($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->availability_id, 'availability_id', 1); + } else { + $form->form_availability($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->availability_id, 'none', 1); + } + + print '
'; + print ''; + if ($action != 'editshippingmethod' && $user->rights->propal->creer) + print ''; + print '
'; + print $langs->trans('SendingMethod'); + print 'id.'">'.img_edit($langs->trans('SetShippingMode'),1).'
'; + print '
'; + if ($action == 'editshippingmethod') { + $form->formSelectShippingMethod($_SERVER['PHP_SELF'].'?id='.$object->id, $object->shipping_method_id, 'shipping_method_id', 1); + } else { + $form->formSelectShippingMethod($_SERVER['PHP_SELF'].'?id='.$object->id, $object->shipping_method_id, 'none'); + } + print '
'; + print ''; + if ($action != 'editdemandreason' && ! empty($object->brouillon)) + print ''; + print '
'; + print $langs->trans('Source'); + print 'id . '">' . img_edit($langs->transnoentitiesnoconv('SetDemandReason'), 1) . '
'; + print '
'; + if ($action == 'editdemandreason') { + $form->formInputReason($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->demand_reason_id, 'demand_reason_id', 1); + } else { + $form->formInputReason($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->demand_reason_id, 'none'); + } + print '
'; + print ''; + if ($action != 'editmode' && ! empty($object->brouillon)) + print ''; + print '
'; + print $langs->trans('PaymentMode'); + print 'id . '">' . img_edit($langs->transnoentitiesnoconv('SetMode'), 1) . '
'; + print '
'; + if ($action == 'editmode') { + $form->form_modes_reglement($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->mode_reglement_id, 'mode_reglement_id'); + } else { + $form->form_modes_reglement($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->mode_reglement_id, 'none'); + } + print '
'; + print ''; + if ($user->rights->askpricesupplier->creer) { + if ($action != 'classify') + print ''; + print '
'; + print $langs->trans('Project') . '' . img_edit($langs->transnoentitiesnoconv('SetProject')) . '
'; + print '
'; + if ($action == 'classify') { + $form->form_project($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->socid, $object->fk_project, 'projectid'); + } else { + $form->form_project($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->socid, $object->fk_project, 'none'); + } + print '
'; + if (! empty($object->fk_project)) { + print ''; + $proj = new Project($db); + $proj->fetch($object->fk_project); + print ''; + print $proj->ref; + print ''; + print ''; + } else { + print ' '; + } + } + print ''; + } + + if ($soc->outstanding_limit) + { + // Outstanding Bill + print ''; + print $langs->trans('OutstandingBill'); + print ''; + print price($soc->get_OutstandingBill()) . ' / '; + print price($soc->outstanding_limit, 0, '', 1, - 1, - 1, $conf->currency); + print ''; + print ''; + } + + if (! empty($conf->global->BANK_ASK_PAYMENT_BANK_DURING_PROPOSAL) && $conf->banque->enabled) + { + // Bank Account + print ''; + print ''; + if ($action != 'editbankaccount' && $user->rights->propal->creer) + print ''; + print '
'; + print $langs->trans('BankAccount'); + print 'id.'">'.img_edit($langs->trans('SetBankAccount'),1).'
'; + print ''; + if ($action == 'editbankaccount') { + $form->formSelectAccount($_SERVER['PHP_SELF'].'?id='.$object->id, $object->fk_account, 'fk_account', 1); + } else { + $form->formSelectAccount($_SERVER['PHP_SELF'].'?id='.$object->id, $object->fk_account, 'none'); + } + print ''; + print ''; + } + + // Other attributes + $cols = 3; + include DOL_DOCUMENT_ROOT . '/core/tpl/extrafields_view.tpl.php'; + + // Amount HT + print '' . $langs->trans('AmountHT') . ''; + print '' . price($object->total_ht, '', $langs, 0, - 1, - 1, $conf->currency) . ''; + print ''; + + // Margin Infos + if (! empty($conf->margin->enabled)) { + print ''; + $object->displayMarginInfos(); + print ''; + } + print ''; + + // Amount VAT + print '' . $langs->trans('AmountVAT') . ''; + print '' . price($object->total_tva, '', $langs, 0, - 1, - 1, $conf->currency) . ''; + print ''; + + // Amount Local Taxes + if ($mysoc->localtax1_assuj == "1" || $object->total_localtax1 != 0) // Localtax1 + { + print '' . $langs->transcountry("AmountLT1", $mysoc->country_code) . ''; + print '' . price($object->total_localtax1, '', $langs, 0, - 1, - 1, $conf->currency) . ''; + print ''; + } + if ($mysoc->localtax2_assuj == "1" || $object->total_localtax2 != 0) // Localtax2 + { + print '' . $langs->transcountry("AmountLT2", $mysoc->country_code) . ''; + print '' . price($object->total_localtax2, '', $langs, 0, - 1, - 1, $conf->currency) . ''; + print ''; + } + + // Amount TTC + print '' . $langs->trans('AmountTTC') . ''; + print '' . price($object->total_ttc, '', $langs, 0, - 1, - 1, $conf->currency) . ''; + print ''; + + // Statut + print '' . $langs->trans('Status') . '' . $object->getLibStatut(4) . ''; + + print '
'; + + if (! empty($conf->global->MAIN_DISABLE_CONTACTS_TAB)) { + $blocname = 'contacts'; + $title = $langs->trans('ContactsAddresses'); + include DOL_DOCUMENT_ROOT . '/core/tpl/bloc_showhide.tpl.php'; + } + + if (! empty($conf->global->MAIN_DISABLE_NOTES_TAB)) { + $blocname = 'notes'; + $title = $langs->trans('Notes'); + include DOL_DOCUMENT_ROOT . '/core/tpl/bloc_showhide.tpl.php'; + } + + /* + * Lines + */ + + // Show object lines + $result = $object->getLinesArray(); + + print '
+ + + + + '; + + if (! empty($conf->use_javascript_ajax) && $object->statut == 0) { + include DOL_DOCUMENT_ROOT . '/core/tpl/ajaxrow.tpl.php'; + } + + print ''; + + if (! empty($object->lines)) + $ret = $object->printObjectLines($action, $mysoc, $soc, $lineid, 1); + + // Form to add new line + if ($object->statut == 0 && $user->rights->propal->creer) + { + if ($action != 'editline') + { + $var = true; + + // Add products/services form + $object->formAddObjectLine(1, $mysoc, $soc); + + $parameters = array(); + $reshook = $hookmanager->executeHooks('formAddObjectLine', $parameters, $object, $action); // Note that $action and $object may have been modified by hook + } + } + + print '
'; + + print "
\n"; + + dol_fiche_end(); + + if ($action == 'statut') + { + /* + * Form to close proposal (signed or not) + */ + $form_close = '
'; + $form_close .= ''; + $form_close .= ''; + $form_close .= ''; + $form_close .= ''; + $form_close .= ''; + $form_close .= '
' . $langs->trans("CloseAs") . ''; + $form_close .= ''; + $form_close .= ''; + $form_close .= '
' . $langs->trans('Note') . '
'; + $form_close .= ''; + $form_close .= '   '; + $form_close .= ' '; + $form_close .= '
'; + + print $form_close; + } + + /* + * Boutons Actions + */ + if ($action != 'presend') { + print '
'; + + $parameters = array(); + $reshook = $hookmanager->executeHooks('addMoreActionsButtons', $parameters, $object, $action); // Note that $action and $object may have been + // modified by hook + if (empty($reshook)) + { + if ($action != 'statut' && $action != 'editline') + { + // Validate + if ($object->statut == 0 && $object->total_ttc >= 0 && count($object->lines) > 0 && + ((empty($conf->global->MAIN_USE_ADVANCED_PERMS) && ! empty($user->rights->propal->creer)) + || (! empty($conf->global->MAIN_USE_ADVANCED_PERMS) && ! empty($user->rights->askpricesupplier->validate))) + ) { + if (count($object->lines) > 0) + print ''; + // else print ''.$langs->trans('Validate').''; + } + // Create event + if ($conf->agenda->enabled && ! empty($conf->global->MAIN_ADD_EVENT_ON_ELEMENT_CARD)) // Add hidden condition because this is not a "workflow" action so should appears somewhere else on page. + { + print '' . $langs->trans("AddAction") . ''; + } + // Edit + if ($object->statut == 1 && $user->rights->askpricesupplier->creer) { + print ''; + } + + // ReOpen + if (($object->statut == 2 || $object->statut == 3 || $object->statut == 4) && $user->rights->askpricesupplier->cloturer) { + print ''; + } + + // Send + if ($object->statut == 1 || $object->statut == 2) { + if (empty($conf->global->MAIN_USE_ADVANCED_PERMS) || $user->rights->askpricesupplier->propal_advance->send) { + print ''; + } else + print ''; + } + + // Create an order + if (! empty($conf->commande->enabled) && $object->statut == 2) { + if ($user->rights->commande->creer) { + print ''; + } + } + + // Create contract + if ($conf->contrat->enabled && $object->statut == 2) { + $langs->load("contracts"); + + if ($user->rights->contrat->creer) { + print ''; + } + } + + // Create an invoice and classify billed + if ($object->statut == 2) { + if (! empty($conf->facture->enabled) && $user->rights->facture->creer) + { + print ''; + } + + $arrayofinvoiceforpropal = $object->getInvoiceArrayList(); + if ((is_array($arrayofinvoiceforpropal) && count($arrayofinvoiceforpropal) > 0) || ! empty($conf->global->WORKFLOW_PROPAL_CAN_CLASSIFIED_BILLED_WITHOUT_INVOICES)) + { + print ''; + } + } + + // Close + if ($object->statut == 1 && $user->rights->askpricesupplier->cloturer) { + print ''; + } + + // Clone + if ($user->rights->askpricesupplier->creer) { + print ''; + } + + // Delete + if ($user->rights->askpricesupplier->supprimer) { + print ''; + } + } + } + + print '
'; + } + print "
\n"; + + if ($action != 'presend') + { + print '
'; + // print '
'; + // print ''; // ancre + + /* + * Documents generes + */ + $filename = dol_sanitizeFileName($object->ref); + $filedir = $conf->propal->dir_output . "/" . dol_sanitizeFileName($object->ref); + $urlsource = $_SERVER["PHP_SELF"] . "?id=" . $object->id; + $genallowed = $user->rights->askpricesupplier->creer; + $delallowed = $user->rights->askpricesupplier->supprimer; + + $var = true; + + $somethingshown = $formfile->show_documents('propal', $filename, $filedir, $urlsource, $genallowed, $delallowed, $object->modelpdf, 1, 0, 0, 28, 0, '', 0, '', $soc->default_lang); + + /* + * Linked object block + */ + $somethingshown = $object->showLinkedObjectBlock(); + + print '
'; + // print '
'; + + // List of actions on element + include_once DOL_DOCUMENT_ROOT . '/core/class/html.formactions.class.php'; + $formactions = new FormActions($db); + $somethingshown = $formactions->showactions($object, 'propal', $socid); + + // print '
'; + print '
'; + } + + /* + * Action presend + */ + if ($action == 'presend') + { + $object->fetch_projet(); + + $ref = dol_sanitizeFileName($object->ref); + include_once DOL_DOCUMENT_ROOT . '/core/lib/files.lib.php'; + $fileparams = dol_most_recent_file($conf->propal->dir_output . '/' . $ref, preg_quote($ref, '/')); + $file = $fileparams ['fullname']; + + // Define output language + $outputlangs = $langs; + $newlang = ''; + if ($conf->global->MAIN_MULTILANGS && empty($newlang) && ! empty($_REQUEST['lang_id'])) + $newlang = $_REQUEST['lang_id']; + if ($conf->global->MAIN_MULTILANGS && empty($newlang)) + $newlang = $object->thirdparty->default_lang; + + if (!empty($newlang)) + { + $outputlangs = new Translate('', $conf); + $outputlangs->setDefaultLang($newlang); + $outputlangs->load('commercial'); + } + + // Build document if it not exists + if (! $file || ! is_readable($file)) { + $result = $object->generateDocument(GETPOST('model') ? GETPOST('model') : $object->modelpdf, $outputlangs, $hidedetails, $hidedesc, $hideref); + if ($result <= 0) { + dol_print_error($db, $result); + exit(); + } + $fileparams = dol_most_recent_file($conf->askpricesupplier->dir_output . '/' . $ref, preg_quote($ref, '/')); + $file = $fileparams ['fullname']; + } + + print '
'; + print_titre($langs->trans('SendAskByMail')); + + // Create form object + include_once DOL_DOCUMENT_ROOT . '/core/class/html.formmail.class.php'; + $formmail = new FormMail($db); + $formmail->param['langsmodels']=(empty($newlang)?$langs->defaultlang:$newlang); + $formmail->fromtype = 'user'; + $formmail->fromid = $user->id; + $formmail->fromname = $user->getFullName($langs); + $formmail->frommail = $user->email; + $formmail->withfrom = 1; + $liste = array(); + foreach ($object->thirdparty->thirdparty_and_contact_email_array(1) as $key => $value) + $liste [$key] = $value; + $formmail->withto = GETPOST("sendto") ? GETPOST("sendto") : $liste; + $formmail->withtocc = $liste; + $formmail->withtoccc = (! empty($conf->global->MAIN_EMAIL_USECCC) ? $conf->global->MAIN_EMAIL_USECCC : false); + if (empty($object->ref_client)) { + $formmail->withtopic = $outputlangs->trans('SendAskRef', '__ASKREF__'); + } else if (! empty($object->ref_client)) { + $formmail->withtopic = $outputlangs->trans('SendAskRef', '__ASKREF__ (__REFCLIENT__)'); + } + $formmail->withfile = 2; + $formmail->withbody = 1; + $formmail->withdeliveryreceipt = 1; + $formmail->withcancel = 1; + + // Tableau des substitutions + $formmail->substit['__ASKREF__'] = $object->ref; + $formmail->substit['__SIGNATURE__'] = $user->signature; + $formmail->substit['__REFCLIENT__'] = $object->ref_client; + $formmail->substit['__THIRPARTY_NAME__'] = $object->thirdparty->name; + $formmail->substit['__PROJECT_REF__'] = (is_object($object->projet)?$object->projet->ref:''); + $formmail->substit['__PERSONALIZED__'] = ''; + $formmail->substit['__CONTACTCIVNAME__'] = ''; + + // Find the good contact adress + $custcontact = ''; + $contactarr = array(); + $contactarr = $object->liste_contact(- 1, 'external'); + + if (is_array($contactarr) && count($contactarr) > 0) { + foreach ($contactarr as $contact) { + if ($contact ['libelle'] == $langs->trans('TypeContact_askpricesupplier_external_CUSTOMER')) { // TODO Use code and not label + $contactstatic = new Contact($db); + $contactstatic->fetch($contact ['id']); + $custcontact = $contactstatic->getFullName($langs, 1); + } + } + + if (! empty($custcontact)) { + $formmail->substit['__CONTACTCIVNAME__'] = $custcontact; + } + } + + // Tableau des parametres complementaires + $formmail->param['action'] = 'send'; + $formmail->param['models'] = 'propal_send'; + $formmail->param['id'] = $object->id; + $formmail->param['returnurl'] = $_SERVER["PHP_SELF"] . '?id=' . $object->id; + // Init list of files + if (GETPOST("mode") == 'init') { + $formmail->clear_attached_files(); + $formmail->add_attached_files($file, basename($file), dol_mimetype($file)); + } + + print $formmail->get_form(); + + print '
'; + } +} + +// End of page +llxFooter(); +$db->close(); diff --git a/htdocs/comm/askpricesupplier/class/askpricesupplier.class.php b/htdocs/comm/askpricesupplier/class/askpricesupplier.class.php index f68a1f4f708..b2c7fc4dfb2 100644 --- a/htdocs/comm/askpricesupplier/class/askpricesupplier.class.php +++ b/htdocs/comm/askpricesupplier/class/askpricesupplier.class.php @@ -37,14 +37,14 @@ require_once DOL_DOCUMENT_ROOT .'/contact/class/contact.class.php'; require_once DOL_DOCUMENT_ROOT .'/margin/lib/margins.lib.php'; /** - * Class to manage proposals + * Class to manage price ask supplier */ -class Propal extends CommonObject +class AskPriceSupplier extends CommonObject { - public $element='propal'; - public $table_element='propal'; - public $table_element_line='propaldet'; - public $fk_element='fk_propal'; + public $element='askpricesupplier'; + public $table_element='askpricesupplier'; + public $table_element_line='askpricesupplierdet'; + public $fk_element='fk_askpricesupplier'; protected $ismultientitymanaged = 1; // 0=No test on entity, 1=Test with field entity, 2=Test with link by societe /** @@ -128,33 +128,33 @@ class Propal extends CommonObject * * @param DoliDB $db Database handler * @param int $socid Id third party - * @param int $propalid Id proposal + * @param int $askpricesupplierid Id askpricesupplier */ - function __construct($db, $socid="", $propalid=0) + function __construct($db, $socid="", $askpricesupplierid=0) { global $conf,$langs; $this->db = $db; $this->socid = $socid; - $this->id = $propalid; + $this->id = $askpricesupplierid; $this->products = array(); $this->remise = 0; $this->remise_percent = 0; $this->remise_absolue = 0; - $this->duree_validite=$conf->global->PROPALE_VALIDITY_DURATION; + $this->duree_validite=$conf->global->ASKPRICESUPPLIER_VALIDITY_DURATION; - $langs->load("propal"); - $this->labelstatut[0]=(! empty($conf->global->PROPAL_STATUS_DRAFT_LABEL) ? $conf->global->PROPAL_STATUS_DRAFT_LABEL : $langs->trans("PropalStatusDraft")); - $this->labelstatut[1]=(! empty($conf->global->PROPAL_STATUS_VALIDATED_LABEL) ? $conf->global->PROPAL_STATUS_VALIDATED_LABEL : $langs->trans("PropalStatusValidated")); - $this->labelstatut[2]=(! empty($conf->global->PROPAL_STATUS_SIGNED_LABEL) ? $conf->global->PROPAL_STATUS_SIGNED_LABEL : $langs->trans("PropalStatusSigned")); - $this->labelstatut[3]=(! empty($conf->global->PROPAL_STATUS_NOTSIGNED_LABEL) ? $conf->global->PROPAL_STATUS_NOTSIGNED_LABEL : $langs->trans("PropalStatusNotSigned")); - $this->labelstatut[4]=(! empty($conf->global->PROPAL_STATUS_BILLED_LABEL) ? $conf->global->PROPAL_STATUS_BILLED_LABEL : $langs->trans("PropalStatusBilled")); - $this->labelstatut_short[0]=(! empty($conf->global->PROPAL_STATUS_DRAFTSHORT_LABEL) ? $conf->global->PROPAL_STATUS_DRAFTSHORT_LABEL : $langs->trans("PropalStatusDraftShort")); - $this->labelstatut_short[1]=(! empty($conf->global->PROPAL_STATUS_VALIDATEDSHORT_LABEL) ? $conf->global->PROPAL_STATUS_VALIDATEDSHORT_LABEL : $langs->trans("Opened")); - $this->labelstatut_short[2]=(! empty($conf->global->PROPAL_STATUS_SIGNEDSHORT_LABEL) ? $conf->global->PROPAL_STATUS_SIGNEDSHORT_LABEL : $langs->trans("PropalStatusSignedShort")); - $this->labelstatut_short[3]=(! empty($conf->global->PROPAL_STATUS_NOTSIGNEDSHORT_LABEL) ? $conf->global->PROPAL_STATUS_NOTSIGNEDSHORT_LABEL : $langs->trans("PropalStatusNotSignedShort")); - $this->labelstatut_short[4]=(! empty($conf->global->PROPAL_STATUS_BILLEDSHORT_LABEL) ? $conf->global->PROPAL_STATUS_BILLEDSHORT_LABEL : $langs->trans("PropalStatusBilledShort")); + $langs->load("askpricesupplier"); + $this->labelstatut[0]=(! empty($conf->global->ASKPRICESUPPLIER_STATUS_DRAFT_LABEL) ? $conf->global->ASKPRICESUPPLIER_STATUS_DRAFT_LABEL : $langs->trans("AskpricesupplierStatusDraft")); + $this->labelstatut[1]=(! empty($conf->global->ASKPRICESUPPLIER_STATUS_VALIDATED_LABEL) ? $conf->global->ASKPRICESUPPLIER_STATUS_VALIDATED_LABEL : $langs->trans("AskpricesupplierStatusValidated")); + $this->labelstatut[2]=(! empty($conf->global->ASKPRICESUPPLIER_STATUS_SIGNED_LABEL) ? $conf->global->ASKPRICESUPPLIER_STATUS_SIGNED_LABEL : $langs->trans("AskpricesupplierStatusSigned")); + $this->labelstatut[3]=(! empty($conf->global->ASKPRICESUPPLIER_STATUS_NOTSIGNED_LABEL) ? $conf->global->ASKPRICESUPPLIER_STATUS_NOTSIGNED_LABEL : $langs->trans("AskpricesupplierStatusNotSigned")); + $this->labelstatut[4]=(! empty($conf->global->ASKPRICESUPPLIER_STATUS_BILLED_LABEL) ? $conf->global->ASKPRICESUPPLIER_STATUS_BILLED_LABEL : $langs->trans("AskpricesupplierStatusBilled")); + $this->labelstatut_short[0]=(! empty($conf->global->ASKPRICESUPPLIER_STATUS_DRAFTSHORT_LABEL) ? $conf->global->ASKPRICESUPPLIER_STATUS_DRAFTSHORT_LABEL : $langs->trans("AskpricesupplierStatusDraftShort")); + $this->labelstatut_short[1]=(! empty($conf->global->ASKPRICESUPPLIER_STATUS_VALIDATEDSHORT_LABEL) ? $conf->global->ASKPRICESUPPLIER_STATUS_VALIDATEDSHORT_LABEL : $langs->trans("Opened")); + $this->labelstatut_short[2]=(! empty($conf->global->ASKPRICESUPPLIER_STATUS_SIGNEDSHORT_LABEL) ? $conf->global->ASKPRICESUPPLIER_STATUS_SIGNEDSHORT_LABEL : $langs->trans("AskpricesupplierStatusSignedShort")); + $this->labelstatut_short[3]=(! empty($conf->global->ASKPRICESUPPLIER_STATUS_NOTSIGNEDSHORT_LABEL) ? $conf->global->ASKPRICESUPPLIER_STATUS_NOTSIGNEDSHORT_LABEL : $langs->trans("AskpricesupplierStatusNotSignedShort")); + $this->labelstatut_short[4]=(! empty($conf->global->ASKPRICESUPPLIER_STATUS_BILLEDSHORT_LABEL) ? $conf->global->ASKPRICESUPPLIER_STATUS_BILLEDSHORT_LABEL : $langs->trans("AskpricesupplierStatusBilledShort")); } @@ -199,7 +199,7 @@ class Propal extends CommonObject $price = $prod->price; } - $line = new PropaleLigne($this->db); + $line = new AskPriceSupplierLigne($this->db); $line->fk_product=$idproduct; $line->desc=$productdesc; @@ -239,8 +239,8 @@ class Propal extends CommonObject return -5; } - $propalligne=new PropaleLigne($this->db); - $propalligne->fk_propal=$this->id; + $propalligne=new AskPriceSupplierLigne($this->db); + $propalligne->fk_askpricesupplier=$this->id; $propalligne->fk_remise_except=$remise->id; $propalligne->desc=$remise->description; // Description ligne $propalligne->tva_tx=$remise->tva_tx; @@ -324,7 +324,7 @@ class Propal extends CommonObject { global $mysoc; - dol_syslog(get_class($this)."::addline propalid=$this->id, desc=$desc, pu_ht=$pu_ht, qty=$qty, txtva=$txtva, fk_product=$fk_product, remise_except=$remise_percent, price_base_type=$price_base_type, pu_ttc=$pu_ttc, info_bits=$info_bits, type=$type"); + dol_syslog(get_class($this)."::addline askpricesupplierid=$this->id, desc=$desc, pu_ht=$pu_ht, qty=$qty, txtva=$txtva, fk_product=$fk_product, remise_except=$remise_percent, price_base_type=$price_base_type, pu_ttc=$pu_ttc, info_bits=$info_bits, type=$type"); include_once DOL_DOCUMENT_ROOT.'/core/lib/price.lib.php'; // Clean parameters @@ -391,9 +391,9 @@ class Propal extends CommonObject } // Insert line - $this->line=new PropaleLigne($this->db); + $this->line=new AskPriceSupplierLigne($this->db); - $this->line->fk_propal=$this->id; + $this->line->fk_askpricesupplier=$this->id; $this->line->label=$label; $this->line->desc=$desc; $this->line->qty=$qty; @@ -543,10 +543,10 @@ class Propal extends CommonObject } // Update line - $this->line=new PropaleLigne($this->db); + $this->line=new AskPriceSupplierLigne($this->db); // Stock previous line records - $staticline=new PropaleLigne($this->db); + $staticline=new AskPriceSupplierLigne($this->db); $staticline->fetch($rowid); $this->line->oldline = $staticline; @@ -610,7 +610,7 @@ class Propal extends CommonObject $this->update_price(1); - $this->fk_propal = $this->id; + $this->fk_askpricesupplier = $this->id; $this->rowid = $rowid; $this->db->commit(); @@ -625,7 +625,7 @@ class Propal extends CommonObject } else { - dol_syslog(get_class($this)."::updateline Erreur -2 Propal en mode incompatible pour cette action"); + dol_syslog(get_class($this)."::updateline Erreur -2 Askpricesupplier en mode incompatible pour cette action"); return -2; } } @@ -641,7 +641,7 @@ class Propal extends CommonObject { if ($this->statut == 0) { - $line=new PropaleLigne($this->db); + $line=new AskPriceSupplierLigne($this->db); // For triggers $line->fetch($lineid); @@ -720,7 +720,7 @@ class Propal extends CommonObject $this->db->begin(); // Insert into database - $sql = "INSERT INTO ".MAIN_DB_PREFIX."propal ("; + $sql = "INSERT INTO ".MAIN_DB_PREFIX."askpricesupplier ("; $sql.= "fk_soc"; $sql.= ", price"; $sql.= ", remise"; @@ -779,12 +779,12 @@ class Propal extends CommonObject $resql=$this->db->query($sql); if ($resql) { - $this->id = $this->db->last_insert_id(MAIN_DB_PREFIX."propal"); + $this->id = $this->db->last_insert_id(MAIN_DB_PREFIX."askpricesupplier"); if ($this->id) { $this->ref='(PROV'.$this->id.')'; - $sql = 'UPDATE '.MAIN_DB_PREFIX."propal SET ref='".$this->ref."' WHERE rowid=".$this->id; + $sql = 'UPDATE '.MAIN_DB_PREFIX."askpricesupplier SET ref='".$this->ref."' WHERE rowid=".$this->id; dol_syslog(get_class($this)."::create", LOG_DEBUG); $resql=$this->db->query($sql); @@ -853,7 +853,7 @@ class Propal extends CommonObject // Set delivery address if (! $error && $this->fk_delivery_address) { - $sql = "UPDATE ".MAIN_DB_PREFIX."propal"; + $sql = "UPDATE ".MAIN_DB_PREFIX."askpricesupplier"; $sql.= " SET fk_delivery_address = ".$this->fk_delivery_address; $sql.= " WHERE ref = '".$this->ref."'"; $sql.= " AND entity = ".$conf->entity; @@ -890,7 +890,7 @@ class Propal extends CommonObject if (! $notrigger) { // Call trigger - $result=$this->call_trigger('PROPAL_CREATE',$user); + $result=$this->call_trigger('ASKPRICESUPPLIER_CREATE',$user); if ($result < 0) { $error++; } // End call triggers } @@ -992,7 +992,7 @@ class Propal extends CommonObject $this->id=0; $this->statut=0; - if (empty($conf->global->PROPALE_ADDON) || ! is_readable(DOL_DOCUMENT_ROOT ."/core/modules/propale/".$conf->global->PROPALE_ADDON.".php")) + if (empty($conf->global->ASKPRICESUPPLIER_ADDON) || ! is_readable(DOL_DOCUMENT_ROOT ."/core/modules/askpricesupplier/".$conf->global->ASKPRICESUPPLIER_ADDON.".php")) { $this->error='ErrorSetupNotComplete'; return -1; @@ -1007,10 +1007,10 @@ class Propal extends CommonObject if (empty($conf->global->MAIN_KEEP_REF_CUSTOMER_ON_CLONING)) $this->ref_client = ''; // Set ref - require_once DOL_DOCUMENT_ROOT ."/core/modules/propale/".$conf->global->PROPALE_ADDON.'.php'; - $obj = $conf->global->PROPALE_ADDON; - $modPropale = new $obj; - $this->ref = $modPropale->getNextValue($objsoc,$this); + require_once DOL_DOCUMENT_ROOT ."/core/modules/askpricesupplier/".$conf->global->ASKPRICESUPPLIER_ADDON.'.php'; + $obj = $conf->global->ASKPRICESUPPLIER_ADDON; + $modAskPriceSupplier = new $obj; + $this->ref = $modAskPriceSupplier->getNextValue($objsoc,$this); // Create clone $result=$this->create($user); @@ -1041,7 +1041,7 @@ class Propal extends CommonObject } // Call trigger - $result=$this->call_trigger('PROPAL_CLONE',$user); + $result=$this->call_trigger('ASKPRICESUPPLIER_CLONE',$user); if ($result < 0) { $error++; } // End call triggers } @@ -1184,13 +1184,13 @@ class Propal extends CommonObject /* * Lignes propales liees a un produit ou non */ - $sql = "SELECT d.rowid, d.fk_propal, d.fk_parent_line, d.label as custom_label, d.description, d.price, d.tva_tx, d.localtax1_tx, d.localtax2_tx, d.qty, d.fk_remise_except, d.remise_percent, d.subprice, d.fk_product,"; + $sql = "SELECT d.rowid, d.fk_askpricesupplier, d.fk_parent_line, d.label as custom_label, d.description, d.price, d.tva_tx, d.localtax1_tx, d.localtax2_tx, d.qty, d.fk_remise_except, d.remise_percent, d.subprice, d.fk_product,"; $sql.= " d.info_bits, d.total_ht, d.total_tva, d.total_localtax1, d.total_localtax2, d.total_ttc, d.fk_product_fournisseur_price as fk_fournprice, d.buy_price_ht as pa_ht, d.special_code, d.rang, d.product_type,"; $sql.= ' p.ref as product_ref, p.description as product_desc, p.fk_product_type, p.label as product_label,'; $sql.= ' d.date_start, d.date_end'; - $sql.= " FROM ".MAIN_DB_PREFIX."propaldet as d"; + $sql.= " FROM ".MAIN_DB_PREFIX."askpricesupplierdet as d"; $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."product as p ON d.fk_product = p.rowid"; - $sql.= " WHERE d.fk_propal = ".$this->id; + $sql.= " WHERE d.fk_askpricesupplier = ".$this->id; $sql.= " ORDER by d.rang"; $result = $this->db->query($sql); @@ -1203,10 +1203,10 @@ class Propal extends CommonObject { $objp = $this->db->fetch_object($result); - $line = new PropaleLigne($this->db); + $line = new AskPriceSupplierLigne($this->db); $line->rowid = $objp->rowid; - $line->fk_propal = $objp->fk_propal; + $line->fk_askpricesupplier = $objp->fk_askpricesupplier; $line->fk_parent_line = $objp->fk_parent_line; $line->product_type = $objp->product_type; $line->label = $objp->custom_label; @@ -1334,8 +1334,8 @@ class Propal extends CommonObject $error=0; $now=dol_now(); - if ((empty($conf->global->MAIN_USE_ADVANCED_PERMS) && ! empty($user->rights->propal->creer)) - || (! empty($conf->global->MAIN_USE_ADVANCED_PERMS) && ! empty($user->rights->propal->propal_advance->validate))) + if ((empty($conf->global->MAIN_USE_ADVANCED_PERMS) && ! empty($user->rights->askpricesupplier->creer)) + || (! empty($conf->global->MAIN_USE_ADVANCED_PERMS) && ! empty($user->rights->askpricesupplier->propal_advance->validate))) { $this->db->begin(); @@ -1354,7 +1354,7 @@ class Propal extends CommonObject } $this->newref = $num; - $sql = "UPDATE ".MAIN_DB_PREFIX."propal"; + $sql = "UPDATE ".MAIN_DB_PREFIX."askpricesupplier"; $sql.= " SET ref = '".$num."',"; $sql.= " fk_statut = 1, date_valid='".$this->db->idate($now)."', fk_user_valid=".$user->id; $sql.= " WHERE rowid = ".$this->id." AND fk_statut = 0"; @@ -1371,7 +1371,7 @@ class Propal extends CommonObject if (! $error && ! $notrigger) { // Call trigger - $result=$this->call_trigger('PROPAL_VALIDATE',$user); + $result=$this->call_trigger('ASKPRICESUPPLIER_VALIDATE',$user); if ($result < 0) { $error++; } // End call triggers } @@ -1387,8 +1387,8 @@ class Propal extends CommonObject // to not lose the linked files $oldref = dol_sanitizeFileName($this->ref); $newref = dol_sanitizeFileName($num); - $dirsource = $conf->propal->dir_output.'/'.$oldref; - $dirdest = $conf->propal->dir_output.'/'.$newref; + $dirsource = $conf->askpricesupplier->dir_output.'/'.$oldref; + $dirdest = $conf->askpricesupplier->dir_output.'/'.$newref; if (file_exists($dirsource)) { @@ -1397,7 +1397,7 @@ class Propal extends CommonObject { dol_syslog("Rename ok"); // Rename docs starting with $oldref with $newref - $listoffiles=dol_dir_list($conf->propal->dir_output.'/'.$newref, 'files', 1, '^'.preg_quote($oldref,'/')); + $listoffiles=dol_dir_list($conf->askpricesupplier->dir_output.'/'.$newref, 'files', 1, '^'.preg_quote($oldref,'/')); foreach($listoffiles as $fileentry) { $dirsource=$fileentry['name']; @@ -1444,9 +1444,9 @@ class Propal extends CommonObject return -1; } - if (! empty($user->rights->propal->creer)) + if (! empty($user->rights->askpricesupplier->creer)) { - $sql = "UPDATE ".MAIN_DB_PREFIX."propal SET datep = '".$this->db->idate($date)."'"; + $sql = "UPDATE ".MAIN_DB_PREFIX."askpricesupplier SET datep = '".$this->db->idate($date)."'"; $sql.= " WHERE rowid = ".$this->id." AND fk_statut = 0"; dol_syslog(get_class($this)."::set_date", LOG_DEBUG); @@ -1475,7 +1475,7 @@ class Propal extends CommonObject { if (! empty($user->rights->propal->creer)) { - $sql = "UPDATE ".MAIN_DB_PREFIX."propal SET fin_validite = ".($date_fin_validite!=''?"'".$this->db->idate($date_fin_validite)."'":'null'); + $sql = "UPDATE ".MAIN_DB_PREFIX."askpricesupplier SET fin_validite = ".($date_fin_validite!=''?"'".$this->db->idate($date_fin_validite)."'":'null'); $sql.= " WHERE rowid = ".$this->id." AND fk_statut = 0"; if ($this->db->query($sql) ) { @@ -1501,7 +1501,7 @@ class Propal extends CommonObject { if (! empty($user->rights->propal->creer)) { - $sql = "UPDATE ".MAIN_DB_PREFIX."propal "; + $sql = "UPDATE ".MAIN_DB_PREFIX."askpricesupplier "; $sql.= " SET date_livraison = ".($date_livraison!=''?"'".$this->db->idate($date_livraison)."'":'null'); $sql.= " WHERE rowid = ".$this->id; @@ -1530,7 +1530,7 @@ class Propal extends CommonObject { if (! empty($user->rights->propal->creer)) { - $sql = "UPDATE ".MAIN_DB_PREFIX."propal "; + $sql = "UPDATE ".MAIN_DB_PREFIX."askpricesupplier "; $sql.= " SET fk_availability = '".$id."'"; $sql.= " WHERE rowid = ".$this->id; @@ -1559,7 +1559,7 @@ class Propal extends CommonObject { if (! empty($user->rights->propal->creer)) { - $sql = "UPDATE ".MAIN_DB_PREFIX."propal "; + $sql = "UPDATE ".MAIN_DB_PREFIX."askpricesupplier "; $sql.= " SET fk_input_reason = '".$id."'"; $sql.= " WHERE rowid = ".$this->id; @@ -1586,11 +1586,11 @@ class Propal extends CommonObject */ function set_ref_client($user, $ref_client) { - if (! empty($user->rights->propal->creer)) + if (! empty($user->rights->askpricesupplier->creer)) { - dol_syslog('Propale::set_ref_client this->id='.$this->id.', ref_client='.$ref_client); + dol_syslog('AskPriceSupplier::set_ref_client this->id='.$this->id.', ref_client='.$ref_client); - $sql = 'UPDATE '.MAIN_DB_PREFIX.'propal SET ref_client = '.(empty($ref_client) ? 'NULL' : '\''.$this->db->escape($ref_client).'\''); + $sql = 'UPDATE '.MAIN_DB_PREFIX.'askpricesupplier SET ref_client = '.(empty($ref_client) ? 'NULL' : '\''.$this->db->escape($ref_client).'\''); $sql.= ' WHERE rowid = '.$this->id; if ($this->db->query($sql) ) { @@ -1600,7 +1600,7 @@ class Propal extends CommonObject else { $this->error=$this->db->error(); - dol_syslog('Propale::set_ref_client Erreur '.$this->error.' - '.$sql); + dol_syslog('AskPriceSupplier::set_ref_client Erreur '.$this->error.' - '.$sql); return -2; } } @@ -1625,7 +1625,7 @@ class Propal extends CommonObject { $remise = price2num($remise); - $sql = "UPDATE ".MAIN_DB_PREFIX."propal SET remise_percent = ".$remise; + $sql = "UPDATE ".MAIN_DB_PREFIX."askpricesupplier SET remise_percent = ".$remise; $sql.= " WHERE rowid = ".$this->id." AND fk_statut = 0"; if ($this->db->query($sql) ) @@ -1658,7 +1658,7 @@ class Propal extends CommonObject { $remise = price2num($remise); - $sql = "UPDATE ".MAIN_DB_PREFIX."propal "; + $sql = "UPDATE ".MAIN_DB_PREFIX."askpricesupplier "; $sql.= " SET remise_absolue = ".$remise; $sql.= " WHERE rowid = ".$this->id." AND fk_statut = 0"; @@ -1694,7 +1694,7 @@ class Propal extends CommonObject $this->statut = $statut; $error=0; - $sql = "UPDATE ".MAIN_DB_PREFIX."propal"; + $sql = "UPDATE ".MAIN_DB_PREFIX."askpricesupplier"; $sql.= " SET fk_statut = ".$this->statut.","; if (! empty($note)) $sql.= " note_private = '".$this->db->escape($note)."',"; $sql.= " date_cloture=NULL, fk_user_cloture=NULL"; @@ -1712,7 +1712,7 @@ class Propal extends CommonObject if (! $notrigger) { // Call trigger - $result=$this->call_trigger('PROPAL_REOPEN',$user); + $result=$this->call_trigger('ASKPRICESUPPLIER_REOPEN',$user); if ($result < 0) { $error++; } // End call triggers } @@ -1758,20 +1758,20 @@ class Propal extends CommonObject $this->db->begin(); - $sql = "UPDATE ".MAIN_DB_PREFIX."propal"; + $sql = "UPDATE ".MAIN_DB_PREFIX."askpricesupplier"; $sql.= " SET fk_statut = ".$statut.", note_private = '".$this->db->escape($note)."', date_cloture='".$this->db->idate($now)."', fk_user_cloture=".$user->id; $sql.= " WHERE rowid = ".$this->id; $resql=$this->db->query($sql); if ($resql) { - $modelpdf=$conf->global->PROPALE_ADDON_PDF_ODT_CLOSED?$conf->global->PROPALE_ADDON_PDF_ODT_CLOSED:$this->modelpdf; - $trigger_name='PROPAL_CLOSE_REFUSED'; + $modelpdf=$conf->global->ASKPRICESUPPLIER_ADDON_PDF_ODT_CLOSED?$conf->global->ASKPRICESUPPLIER_ADDON_PDF_ODT_CLOSED:$this->modelpdf; + $trigger_name='ASKPRICESUPPLIER_CLOSE_REFUSED'; if ($statut == 2) { - $trigger_name='PROPAL_CLOSE_SIGNED'; - $modelpdf=$conf->global->PROPALE_ADDON_PDF_ODT_TOBILL?$conf->global->PROPALE_ADDON_PDF_ODT_TOBILL:$this->modelpdf; + $trigger_name='ASKPRICESUPPLIER_CLOSE_SIGNED'; + $modelpdf=$conf->global->ASKPRICESUPPLIER_ADDON_PDF_ODT_TOBILL?$conf->global->ASKPRICESUPPLIER_ADDON_PDF_ODT_TOBILL:$this->modelpdf; // The connected company is classified as a client $soc=new Societe($this->db); @@ -1787,7 +1787,7 @@ class Propal extends CommonObject } if ($statut == 4) { - $trigger_name='PROPAL_CLASSIFY_BILLED'; + $trigger_name='ASKPRICESUPPLIER_CLASSIFY_BILLED'; } if (empty($conf->global->MAIN_DISABLE_PDF_AUTOUPDATE)) @@ -1835,7 +1835,7 @@ class Propal extends CommonObject */ function classifyBilled() { - $sql = 'UPDATE '.MAIN_DB_PREFIX.'propal SET fk_statut = 4'; + $sql = 'UPDATE '.MAIN_DB_PREFIX.'askpricesupplier SET fk_statut = 4'; $sql .= ' WHERE rowid = '.$this->id.' AND fk_statut > 0 ;'; if ($this->db->query($sql) ) { @@ -1869,7 +1869,7 @@ class Propal extends CommonObject { global $conf,$langs; - $sql = "UPDATE ".MAIN_DB_PREFIX."propal SET fk_statut = 0"; + $sql = "UPDATE ".MAIN_DB_PREFIX."askpricesupplier SET fk_statut = 0"; $sql.= " WHERE rowid = ".$this->id; if ($this->db->query($sql)) @@ -1908,7 +1908,7 @@ class Propal extends CommonObject $sql.= " p.rowid as propalid, p.fk_statut, p.total_ht, p.ref, p.remise, "; $sql.= " p.datep as dp, p.fin_validite as datelimite"; 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, ".MAIN_DB_PREFIX."c_propalst as c"; + $sql.= " FROM ".MAIN_DB_PREFIX."societe as s, ".MAIN_DB_PREFIX."askpricesupplier as p, ".MAIN_DB_PREFIX."c_propalst as c"; if (! $user->rights->societe->client->voir && ! $socid) $sql .= ", ".MAIN_DB_PREFIX."societe_commerciaux as sc"; $sql.= " WHERE p.entity = ".$conf->entity; $sql.= " AND p.fk_soc = s.rowid"; @@ -1944,7 +1944,7 @@ class Propal extends CommonObject } else { - $ga[$i]['id'] = $obj->propalid; + $ga[$i]['id'] = $obj->askpricesupplierid; $ga[$i]['ref'] = $obj->ref; $ga[$i]['name'] = $obj->name; } @@ -2075,17 +2075,17 @@ class Propal extends CommonObject if (! $notrigger) { // Call trigger - $result=$this->call_trigger('PROPAL_DELETE',$user); + $result=$this->call_trigger('ASKPRICESUPPLIER_DELETE',$user); if ($result < 0) { $error++; } // End call triggers } if (! $error) { - $sql = "DELETE FROM ".MAIN_DB_PREFIX."propaldet WHERE fk_propal = ".$this->id; + $sql = "DELETE FROM ".MAIN_DB_PREFIX."askpricesupplierdet WHERE fk_askpricesupplier = ".$this->id; if ($this->db->query($sql)) { - $sql = "DELETE FROM ".MAIN_DB_PREFIX."propal WHERE rowid = ".$this->id; + $sql = "DELETE FROM ".MAIN_DB_PREFIX."askpricesupplier WHERE rowid = ".$this->id; if ($this->db->query($sql)) { // Delete linked object @@ -2187,10 +2187,10 @@ class Propal extends CommonObject */ function availability($availability_id) { - dol_syslog('Propale::availability('.$availability_id.')'); + dol_syslog('AskPriceSupplier::availability('.$availability_id.')'); if ($this->statut >= 0) { - $sql = 'UPDATE '.MAIN_DB_PREFIX.'propal'; + $sql = 'UPDATE '.MAIN_DB_PREFIX.'askpricesupplier'; $sql .= ' SET fk_availability = '.$availability_id; $sql .= ' WHERE rowid='.$this->id; if ( $this->db->query($sql) ) @@ -2200,14 +2200,14 @@ class Propal extends CommonObject } else { - dol_syslog('Propale::availability Erreur '.$sql.' - '.$this->db->error()); + dol_syslog('AskPriceSupplier::availability Erreur '.$sql.' - '.$this->db->error()); $this->error=$this->db->error(); return -1; } } else { - dol_syslog('Propale::availability, etat propale incompatible'); + dol_syslog('AskPriceSupplier::availability, etat propale incompatible'); $this->error='Etat propale incompatible '.$this->statut; return -2; } @@ -2221,10 +2221,10 @@ class Propal extends CommonObject */ function demand_reason($demand_reason_id) { - dol_syslog('Propale::demand_reason('.$demand_reason_id.')'); + dol_syslog('AskPriceSupplier::demand_reason('.$demand_reason_id.')'); if ($this->statut >= 0) { - $sql = 'UPDATE '.MAIN_DB_PREFIX.'propal'; + $sql = 'UPDATE '.MAIN_DB_PREFIX.'askpricesupplier'; $sql .= ' SET fk_input_reason = '.$demand_reason_id; $sql .= ' WHERE rowid='.$this->id; if ( $this->db->query($sql) ) @@ -2234,14 +2234,14 @@ class Propal extends CommonObject } else { - dol_syslog('Propale::demand_reason Erreur '.$sql.' - '.$this->db->error()); + dol_syslog('AskPriceSupplier::demand_reason Erreur '.$sql.' - '.$this->db->error()); $this->error=$this->db->error(); return -1; } } else { - dol_syslog('Propale::demand_reason, etat propale incompatible'); + dol_syslog('AskPriceSupplier::demand_reason, etat propale incompatible'); $this->error='Etat propale incompatible '.$this->statut; return -2; } @@ -2259,7 +2259,7 @@ class Propal extends CommonObject $sql = "SELECT c.rowid, "; $sql.= " c.datec, c.date_valid as datev, c.date_cloture as dateo,"; $sql.= " c.fk_user_author, c.fk_user_valid, c.fk_user_cloture"; - $sql.= " FROM ".MAIN_DB_PREFIX."propal as c"; + $sql.= " FROM ".MAIN_DB_PREFIX."askpricesupplier as c"; $sql.= " WHERE c.rowid = ".$id; $result = $this->db->query($sql); @@ -2327,7 +2327,7 @@ class Propal extends CommonObject function LibStatut($statut,$mode=1) { global $langs; - $langs->load("propal"); + $langs->load("askpricesupplier"); if ($statut==0) $statuttrans='statut0'; if ($statut==1) $statuttrans='statut1'; @@ -2361,7 +2361,7 @@ class Propal extends CommonObject $clause = " WHERE"; $sql = "SELECT p.rowid, p.ref, p.datec as datec, p.fin_validite as datefin"; - $sql.= " FROM ".MAIN_DB_PREFIX."propal as p"; + $sql.= " FROM ".MAIN_DB_PREFIX."askpricesupplier as p"; if (!$user->rights->societe->client->voir && !$user->societe_id) { $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."societe_commerciaux as sc ON p.fk_soc = sc.fk_soc"; @@ -2376,8 +2376,8 @@ class Propal extends CommonObject $resql=$this->db->query($sql); if ($resql) { - if ($mode == 'opened') $delay_warning=$conf->propal->cloture->warning_delay; - if ($mode == 'signed') $delay_warning=$conf->propal->facturation->warning_delay; + if ($mode == 'opened') $delay_warning=$conf->askpricesupplier->cloture->warning_delay; + if ($mode == 'signed') $delay_warning=$conf->askpricesupplier->facturation->warning_delay; // This assignment in condition is not a bug. It allows walking the results. while ($obj=$this->db->fetch_object($resql)) @@ -2456,7 +2456,7 @@ class Propal extends CommonObject $xnbp = 0; while ($xnbp < $nbp) { - $line=new PropaleLigne($this->db); + $line=new AskPriceSupplierLigne($this->db); $line->desc=$langs->trans("Description")." ".$xnbp; $line->qty=1; $line->subprice=100; @@ -2505,7 +2505,7 @@ class Propal extends CommonObject $clause = "WHERE"; $sql = "SELECT count(p.rowid) as nb"; - $sql.= " FROM ".MAIN_DB_PREFIX."propal as p"; + $sql.= " FROM ".MAIN_DB_PREFIX."askpricesupplier as p"; $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."societe as s ON p.fk_soc = s.rowid"; if (!$user->rights->societe->client->voir && !$user->societe_id) { @@ -2545,20 +2545,20 @@ class Propal extends CommonObject function getNextNumRef($soc) { global $conf, $db, $langs; - $langs->load("propal"); + $langs->load("askpricesupplier"); - if (! empty($conf->global->PROPALE_ADDON)) + if (! empty($conf->global->ASKPRICESUPPLIER_ADDON)) { $mybool=false; - $file = $conf->global->PROPALE_ADDON.".php"; - $classname = $conf->global->PROPALE_ADDON; + $file = $conf->global->ASKPRICESUPPLIER_ADDON.".php"; + $classname = $conf->global->ASKPRICESUPPLIER_ADDON; // Include file with class $dirmodels = array_merge(array('/'), (array) $conf->modules_parts['models']); foreach ($dirmodels as $reldir) { - $dir = dol_buildpath($reldir."core/modules/propale/"); + $dir = dol_buildpath($reldir."core/modules/askpricesupplier/"); // Load file with numbering class (if found) $mybool|=@include_once $dir.$file; @@ -2606,25 +2606,25 @@ class Propal extends CommonObject global $langs; $result=''; - $label=$langs->trans("ShowPropal").': '.$this->ref; + $label=$langs->trans("ShowAskpricesupplier").': '.$this->ref; if (! empty($this->ref_client)) $label.= '
'.$langs->trans('RefCustomer').': '.$this->ref_client; $linkclose = '" title="'.dol_escape_htmltag($label, 1).'" class="classfortooltip">'; if ($option == '') { - $lien = 'load("askpricesupplier"); // Positionne le modele sur le nom du modele a utiliser if (! dol_strlen($modele)) { - if (! empty($conf->global->PROPALE_ADDON_PDF)) + if (! empty($conf->global->ASKPRICESUPPLIER_ADDON_PDF)) { - $modele = $conf->global->PROPALE_ADDON_PDF; + $modele = $conf->global->ASKPRICESUPPLIER_ADDON_PDF; } else { @@ -2737,7 +2737,7 @@ class Propal extends CommonObject } } - $modelpath = "core/modules/propale/doc/"; + $modelpath = "core/modules/askpricesupplier/doc/"; return $this->commonGenerateDocument($modelpath, $modele, $outputlangs, $hidedetails, $hidedesc, $hideref); } @@ -2747,22 +2747,22 @@ class Propal extends CommonObject /** - * \class PropaleLigne - * \brief Class to manage commercial proposal lines + * \class AskPriceSupplierLigne + * \brief Class to manage price ask supplier lines */ -class PropaleLigne extends CommonObject +class AskPriceSupplierLigne extends CommonObject { var $db; var $error; - public $element='propaldet'; - public $table_element='propaldet'; + public $element='askpricesupplierdet'; + public $table_element='askpricesupplierdet'; var $oldline; // From llx_propaldet var $rowid; - var $fk_propal; + var $fk_askpricesupplier; var $fk_parent_line; var $desc; // Description ligne var $fk_product; // Id produit predefini @@ -2833,13 +2833,13 @@ class PropaleLigne extends CommonObject */ function fetch($rowid) { - $sql = 'SELECT pd.rowid, pd.fk_propal, pd.fk_parent_line, pd.fk_product, pd.label as custom_label, pd.description, pd.price, pd.qty, pd.tva_tx,'; + $sql = 'SELECT pd.rowid, pd.fk_askpricesupplier, pd.fk_parent_line, pd.fk_product, pd.label as custom_label, pd.description, pd.price, pd.qty, pd.tva_tx,'; $sql.= ' pd.remise, pd.remise_percent, pd.fk_remise_except, pd.subprice,'; $sql.= ' pd.info_bits, pd.total_ht, pd.total_tva, pd.total_ttc, pd.fk_product_fournisseur_price as fk_fournprice, pd.buy_price_ht as pa_ht, pd.special_code, pd.rang,'; $sql.= ' pd.localtax1_tx, pd.localtax2_tx, pd.total_localtax1, pd.total_localtax2,'; $sql.= ' p.ref as product_ref, p.label as product_label, p.description as product_desc,'; $sql.= ' pd.date_start, pd.date_end, pd.product_type'; - $sql.= ' FROM '.MAIN_DB_PREFIX.'propaldet as pd'; + $sql.= ' FROM '.MAIN_DB_PREFIX.'askpricesupplierdet as pd'; $sql.= ' LEFT JOIN '.MAIN_DB_PREFIX.'product as p ON pd.fk_product = p.rowid'; $sql.= ' WHERE pd.rowid = '.$rowid; @@ -2849,7 +2849,7 @@ class PropaleLigne extends CommonObject $objp = $this->db->fetch_object($result); $this->rowid = $objp->rowid; - $this->fk_propal = $objp->fk_propal; + $this->fk_askpricesupplier = $objp->fk_askpricesupplier; $this->fk_parent_line = $objp->fk_parent_line; $this->label = $objp->custom_label; $this->desc = $objp->description; @@ -2939,14 +2939,14 @@ class PropaleLigne extends CommonObject $this->db->begin(); // Insert line into database - $sql = 'INSERT INTO '.MAIN_DB_PREFIX.'propaldet'; - $sql.= ' (fk_propal, fk_parent_line, label, description, fk_product, product_type,'; + $sql = 'INSERT INTO '.MAIN_DB_PREFIX.'askpricesupplierdet'; + $sql.= ' (fk_askpricesupplier, fk_parent_line, label, description, fk_product, product_type,'; $sql.= ' fk_remise_except, qty, tva_tx, localtax1_tx, localtax2_tx, localtax1_type, localtax2_type,'; $sql.= ' subprice, remise_percent, '; $sql.= ' info_bits, '; $sql.= ' total_ht, total_tva, total_localtax1, total_localtax2, total_ttc, fk_product_fournisseur_price, buy_price_ht, special_code, rang,'; $sql.= ' date_start, date_end)'; - $sql.= " VALUES (".$this->fk_propal.","; + $sql.= " VALUES (".$this->fk_askpricesupplier.","; $sql.= " ".($this->fk_parent_line>0?"'".$this->fk_parent_line."'":"null").","; $sql.= " ".(! empty($this->label)?"'".$this->db->escape($this->label)."'":"null").","; $sql.= " '".$this->db->escape($this->desc)."',"; @@ -2979,7 +2979,7 @@ class PropaleLigne extends CommonObject $resql=$this->db->query($sql); if ($resql) { - $this->rowid=$this->db->last_insert_id(MAIN_DB_PREFIX.'propaldet'); + $this->rowid=$this->db->last_insert_id(MAIN_DB_PREFIX.'askpricesupplierdet'); if (empty($conf->global->MAIN_EXTRAFIELDS_DISABLED)) // For avoid conflicts if trigger used { @@ -2994,7 +2994,7 @@ class PropaleLigne extends CommonObject if (! $notrigger) { // Call trigger - $result=$this->call_trigger('LINEPROPAL_INSERT',$user); + $result=$this->call_trigger('LINEASKPRICESUPPLIER_INSERT',$user); if ($result < 0) { $this->db->rollback(); @@ -3026,8 +3026,8 @@ class PropaleLigne extends CommonObject $error=0; $this->db->begin(); - $sql = "DELETE FROM ".MAIN_DB_PREFIX."propaldet WHERE rowid = ".$this->rowid; - dol_syslog("PropaleLigne::delete", LOG_DEBUG); + $sql = "DELETE FROM ".MAIN_DB_PREFIX."askpricesupplierdet WHERE rowid = ".$this->rowid; + dol_syslog("AskPriceSupplierLigne::delete", LOG_DEBUG); if ($this->db->query($sql) ) { @@ -3044,7 +3044,7 @@ class PropaleLigne extends CommonObject } // Call trigger - $result=$this->call_trigger('LINEPROPAL_DELETE',$user); + $result=$this->call_trigger('LINEASKPRICESUPLLIER_DELETE',$user); if ($result < 0) { $this->db->rollback(); @@ -3105,7 +3105,7 @@ class PropaleLigne extends CommonObject $this->db->begin(); // Mise a jour ligne en base - $sql = "UPDATE ".MAIN_DB_PREFIX."propaldet SET"; + $sql = "UPDATE ".MAIN_DB_PREFIX."askpricesupplierdet SET"; $sql.= " description='".$this->db->escape($this->desc)."'"; $sql.= " , label=".(! empty($this->label)?"'".$this->db->escape($this->label)."'":"null"); $sql.= " , product_type=".$this->product_type; @@ -3154,7 +3154,7 @@ class PropaleLigne extends CommonObject if (! $notrigger) { // Call trigger - $result=$this->call_trigger('LINEPROPAL_UPDATE',$user); + $result=$this->call_trigger('LINEASKPRICESUPPLIER_UPDATE',$user); if ($result < 0) { $this->db->rollback(); @@ -3185,13 +3185,13 @@ class PropaleLigne extends CommonObject $this->db->begin(); // Mise a jour ligne en base - $sql = "UPDATE ".MAIN_DB_PREFIX."propaldet SET"; + $sql = "UPDATE ".MAIN_DB_PREFIX."askpricesupplierdet SET"; $sql.= " total_ht=".price2num($this->total_ht,'MT').""; $sql.= ",total_tva=".price2num($this->total_tva,'MT').""; $sql.= ",total_ttc=".price2num($this->total_ttc,'MT').""; $sql.= " WHERE rowid = ".$this->rowid; - dol_syslog("PropaleLigne::update_total", LOG_DEBUG); + dol_syslog("AskPriceSupplierLigne::update_total", LOG_DEBUG); $resql=$this->db->query($sql); if ($resql) diff --git a/htdocs/comm/askpricesupplier/index.php b/htdocs/comm/askpricesupplier/index.php index a0e8a3409ab..dcd3436bd25 100644 --- a/htdocs/comm/askpricesupplier/index.php +++ b/htdocs/comm/askpricesupplier/index.php @@ -25,9 +25,9 @@ require '../../main.inc.php'; require_once DOL_DOCUMENT_ROOT.'/core/class/html.formfile.class.php'; -require_once DOL_DOCUMENT_ROOT .'/comm/propal/class/propal.class.php'; +require_once DOL_DOCUMENT_ROOT .'/comm/askpricesupplier/class/askpricesupplier.class.php'; -$langs->load("propal"); +$langs->load("askpricesupplier"); $langs->load("companies"); // Security check @@ -37,22 +37,22 @@ if (isset($user->societe_id) && $user->societe_id > 0) $action = ''; $socid = $user->societe_id; } -$result = restrictedArea($user, 'propal'); +$result = restrictedArea($user, 'askpricesupplier'); /* * View */ $now=dol_now(); -$propalstatic=new Propal($db); +$askpricesupplierstatic=new AskPriceSupplier($db); $companystatic=new Societe($db); $form = new Form($db); $formfile = new FormFile($db); $help_url="EN:Module_Commercial_Proposals|FR:Module_Propositions_commerciales|ES:Módulo_Presupuestos"; -llxHeader("",$langs->trans("ProspectionArea"),$help_url); +llxHeader("",$langs->trans("AskPriceSupplierArea"),$help_url); -print_fiche_titre($langs->trans("ProspectionArea")); +print_fiche_titre($langs->trans("AskPriceSupplierArea")); //print ''; //print ''; print '
'; @@ -64,9 +64,9 @@ print '
'; */ $var=false; print ''; -print ''; +print ''; print ''; -print ''; +print ''; print ''; print ''; @@ -80,7 +80,7 @@ print "
'.$langs->trans("SearchPropal").'
'.$langs->trans("SearchRequest").'
'; print $langs->trans("Ref").':
'.$langs->trans("Other").':

\n"; $sql = "SELECT count(p.rowid), p.fk_statut"; $sql.= " FROM ".MAIN_DB_PREFIX."societe as s"; -$sql.= ", ".MAIN_DB_PREFIX."propal as p"; +$sql.= ", ".MAIN_DB_PREFIX."askpricesupplier as p"; if (!$user->rights->societe->client->voir && !$socid) $sql.= ", ".MAIN_DB_PREFIX."societe_commerciaux as sc"; $sql.= " WHERE p.fk_soc = s.rowid"; $sql.= " AND p.entity = ".$conf->entity; @@ -116,17 +116,17 @@ if ($resql) $db->free($resql); print ''; - print ''."\n"; + print ''."\n"; $var=true; $listofstatus=array(0,1,2,3,4); foreach ($listofstatus as $status) { - $dataseries[]=array('label'=>$propalstatic->LibStatut($status,1),'data'=>(isset($vals[$status])?(int) $vals[$status]:0)); + $dataseries[]=array('label'=>$askpricesupplierstatic->LibStatut($status,1),'data'=>(isset($vals[$status])?(int) $vals[$status]:0)); if (! $conf->use_javascript_ajax) { $var=!$var; print ""; - print ''; + print ''; print ''; print "\n"; } @@ -155,7 +155,7 @@ else if (! empty($conf->propal->enabled)) { $sql = "SELECT c.rowid, c.ref, s.nom as socname, s.rowid as socid, s.canvas, s.client"; - $sql.= " FROM ".MAIN_DB_PREFIX."propal as c"; + $sql.= " FROM ".MAIN_DB_PREFIX."askpricesupplier as c"; $sql.= ", ".MAIN_DB_PREFIX."societe as s"; if (!$user->rights->societe->client->voir && !$socid) $sql.= ", ".MAIN_DB_PREFIX."societe_commerciaux as sc"; $sql.= " WHERE c.fk_soc = s.rowid"; @@ -169,8 +169,8 @@ if (! empty($conf->propal->enabled)) { print '
'.$langs->trans("Statistics").' - '.$langs->trans("Proposals").'
'.$langs->trans("Statistics").' - '.$langs->trans("CommRequests").'
'.$propalstatic->LibStatut($status,0).''.$askpricesupplierstatic->LibStatut($status,0).''.(isset($vals[$status])?$vals[$status]:0).'
'; print ''; - print ''; - $langs->load("propal"); + print ''; + $langs->load("askpricesupplier"); $num = $db->num_rows($resql); if ($num) { @@ -182,9 +182,9 @@ if (! empty($conf->propal->enabled)) $obj = $db->fetch_object($resql); print ""; - $propalstatic->id=$obj->rowid; - $propalstatic->ref=$obj->ref; - print ''; + $askpricesupplierstatic->id=$obj->rowid; + $askpricesupplierstatic->ref=$obj->ref; + print ''; $companystatic->id=$obj->socid; $companystatic->name=$obj->socname; @@ -213,7 +213,7 @@ $max=5; $sql = "SELECT c.rowid, c.ref, c.fk_statut, s.nom as socname, s.rowid as socid, s.canvas, s.client,"; $sql.= " date_cloture as datec"; -$sql.= " FROM ".MAIN_DB_PREFIX."propal as c"; +$sql.= " FROM ".MAIN_DB_PREFIX."askpricesupplier as c"; $sql.= ", ".MAIN_DB_PREFIX."societe as s"; if (!$user->rights->societe->client->voir && !$socid) $sql.= ", ".MAIN_DB_PREFIX."societe_commerciaux as sc"; $sql.= " WHERE c.fk_soc = s.rowid"; @@ -229,7 +229,7 @@ if ($resql) { print '
'.$langs->trans("DraftPropals").'
'.$langs->trans("DraftRequests").'
'.$propalstatic->getNomUrl(1).''.$askpricesupplierstatic->getNomUrl(1).'
'; print ''; - print ''; + print ''; $num = $db->num_rows($resql); if ($num) @@ -244,12 +244,12 @@ if ($resql) print ""; print ''; @@ -272,7 +272,7 @@ if ($resql) print ''; print ''; - print ''; + print ''; print ''; $i++; } @@ -285,15 +285,15 @@ else dol_print_error($db); /* * Opened proposals */ -if (! empty($conf->propal->enabled) && $user->rights->propale->lire) +if (! empty($conf->askpricesupplier->enabled) && $user->rights->askpricesupplier->lire) { - $langs->load("propal"); + $langs->load("askpricesupplier"); $now=dol_now(); $sql = "SELECT s.nom as socname, s.rowid as socid, s.canvas, s.client, p.rowid as propalid, p.total as total_ttc, p.total_ht, p.ref, p.fk_statut, p.datep as dp, p.fin_validite as dfv"; $sql.= " FROM ".MAIN_DB_PREFIX."societe as s"; - $sql.= ", ".MAIN_DB_PREFIX."propal as p"; + $sql.= ", ".MAIN_DB_PREFIX."askpricesupplier as p"; if (!$user->rights->societe->client->voir && !$socid) $sql.= ", ".MAIN_DB_PREFIX."societe_commerciaux as sc"; $sql.= " WHERE p.fk_soc = s.rowid"; $sql.= " AND p.entity = ".$conf->entity; @@ -313,7 +313,7 @@ if (! empty($conf->propal->enabled) && $user->rights->propale->lire) $var=true; print '
'.$langs->trans("LastModifiedProposals",$max).'
'.$langs->trans("LastModifiedRequests",$max).'
'; - $propalstatic->id=$obj->rowid; - $propalstatic->ref=$obj->ref; + $askpricesupplierstatic->id=$obj->rowid; + $askpricesupplierstatic->ref=$obj->ref; print ''; print ''; print '
'; - print $propalstatic->getNomUrl(1); + print $askpricesupplierstatic->getNomUrl(1); print ''; @@ -260,7 +260,7 @@ if ($resql) $filename=dol_sanitizeFileName($obj->ref); $filedir=$conf->propal->dir_output . '/' . dol_sanitizeFileName($obj->ref); $urlsource=$_SERVER['PHP_SELF'].'?id='.$obj->rowid; - print $formfile->getDocumentsLink($propalstatic->element, $filename, $filedir); + print $formfile->getDocumentsLink($askpricesupplierstatic->element, $filename, $filedir); print '
'; print '
'.$companystatic->getNomUrl(1,'customer').''.dol_print_date($db->jdate($obj->datec),'day').''.$propalstatic->LibStatut($obj->fk_statut,5).''.$askpricesupplierstatic->LibStatut($obj->fk_statut,5).'
'; - print ''; + print ''; $nbofloop=min($num, (empty($conf->global->MAIN_MAXLIST_OVERLOAD)?500:$conf->global->MAIN_MAXLIST_OVERLOAD)); while ($i < $nbofloop) @@ -325,21 +325,21 @@ if (! empty($conf->propal->enabled) && $user->rights->propale->lire) // Ref print '"; @@ -353,7 +353,7 @@ if (! empty($conf->propal->enabled) && $user->rights->propale->lire) print ''."\n"; print ''; - print ''."\n"; + print ''."\n"; print ''."\n"; $i++; $total += $obj->total_ttc; @@ -412,12 +412,12 @@ if (! empty($conf->propal->enabled)) print ""; print ''; print ''; - print ''; + print ''; print ''; $i++; @@ -484,12 +484,12 @@ if (! empty($conf->propal->enabled)) print ""; print ''; print ''; - print ''; + print ''; print ''; $i++; diff --git a/htdocs/comm/askpricesupplier/sql/llx_askpricesupplier.sql b/htdocs/comm/askpricesupplier/sql/llx_askpricesupplier.sql new file mode 100644 index 00000000000..93389cd5770 --- /dev/null +++ b/htdocs/comm/askpricesupplier/sql/llx_askpricesupplier.sql @@ -0,0 +1,58 @@ +CREATE TABLE `llx_askpricesupplier` ( + `rowid` int(11) NOT NULL AUTO_INCREMENT, + `ref` varchar(30) NOT NULL, + `entity` int(11) NOT NULL DEFAULT '1', + `ref_ext` varchar(255) DEFAULT NULL, + `ref_int` varchar(255) DEFAULT NULL, + `ref_client` varchar(255) DEFAULT NULL, + `fk_soc` int(11) DEFAULT NULL, + `fk_projet` int(11) DEFAULT NULL, + `tms` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `datec` datetime DEFAULT NULL, + `datep` date DEFAULT NULL, + `fin_validite` datetime DEFAULT NULL, + `date_valid` datetime DEFAULT NULL, + `date_cloture` datetime DEFAULT NULL, + `fk_user_author` int(11) DEFAULT NULL, + `fk_user_modif` int(11) DEFAULT NULL, + `fk_user_valid` int(11) DEFAULT NULL, + `fk_user_cloture` int(11) DEFAULT NULL, + `fk_statut` smallint(6) NOT NULL DEFAULT '0', + `price` double DEFAULT '0', + `remise_percent` double DEFAULT '0', + `remise_absolue` double DEFAULT '0', + `remise` double DEFAULT '0', + `total_ht` double(24,8) DEFAULT '0.00000000', + `tva` double(24,8) DEFAULT '0.00000000', + `localtax1` double(24,8) DEFAULT '0.00000000', + `localtax2` double(24,8) DEFAULT '0.00000000', + `total` double(24,8) DEFAULT '0.00000000', + `fk_account` int(11) DEFAULT NULL, + `fk_currency` varchar(3) DEFAULT NULL, + `fk_cond_reglement` int(11) DEFAULT NULL, + `fk_mode_reglement` int(11) DEFAULT NULL, + `note_private` text, + `note_public` text, + `model_pdf` varchar(255) DEFAULT NULL, + `date_livraison` date DEFAULT NULL, + `fk_shipping_method` int(11) DEFAULT NULL, + `fk_availability` int(11) DEFAULT NULL, + `fk_input_reason` int(11) DEFAULT NULL, + `import_key` varchar(14) DEFAULT NULL, + `extraparams` varchar(255) DEFAULT NULL, + `fk_delivery_address` int(11) DEFAULT NULL, + PRIMARY KEY (`rowid`), + UNIQUE KEY `uk_askpricesupplier_ref` (`ref`,`entity`), + KEY `idx_askpricesupplier_fk_soc` (`fk_soc`), + KEY `idx_askpricesupplier_fk_user_author` (`fk_user_author`), + KEY `idx_askpricesupplier_fk_user_valid` (`fk_user_valid`), + KEY `idx_askpricesupplier_fk_user_cloture` (`fk_user_cloture`), + KEY `idx_askpricesupplier_fk_projet` (`fk_projet`), + KEY `idx_askpricesupplier_fk_account` (`fk_account`), + KEY `idx_askpricesupplier_fk_currency` (`fk_currency`), + CONSTRAINT `fk_askpricesupplier_fk_projet` FOREIGN KEY (`fk_projet`) REFERENCES `llx_projet` (`rowid`), + CONSTRAINT `fk_askpricesupplier_fk_soc` FOREIGN KEY (`fk_soc`) REFERENCES `llx_societe` (`rowid`), + CONSTRAINT `fk_askpricesupplier_fk_user_author` FOREIGN KEY (`fk_user_author`) REFERENCES `llx_user` (`rowid`), + CONSTRAINT `fk_askpricesupplier_fk_user_cloture` FOREIGN KEY (`fk_user_cloture`) REFERENCES `llx_user` (`rowid`), + CONSTRAINT `fk_askpricesupplier_fk_user_valid` FOREIGN KEY (`fk_user_valid`) REFERENCES `llx_user` (`rowid`) +) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 diff --git a/htdocs/comm/askpricesupplier/sql/llx_askpricesupplier_extrafields.sql b/htdocs/comm/askpricesupplier/sql/llx_askpricesupplier_extrafields.sql new file mode 100644 index 00000000000..24071c0c5b8 --- /dev/null +++ b/htdocs/comm/askpricesupplier/sql/llx_askpricesupplier_extrafields.sql @@ -0,0 +1,8 @@ +CREATE TABLE `llx_askpricesupplier_extrafields` ( + `rowid` int(11) NOT NULL AUTO_INCREMENT, + `tms` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `fk_object` int(11) NOT NULL, + `import_key` varchar(14) DEFAULT NULL, + PRIMARY KEY (`rowid`), + KEY `idx_askpricesupplier_extrafields` (`fk_object`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 \ No newline at end of file diff --git a/htdocs/comm/askpricesupplier/sql/llx_askpricesupplierdet.sql b/htdocs/comm/askpricesupplier/sql/llx_askpricesupplierdet.sql new file mode 100644 index 00000000000..86c605f2b2d --- /dev/null +++ b/htdocs/comm/askpricesupplier/sql/llx_askpricesupplierdet.sql @@ -0,0 +1,36 @@ +CREATE TABLE `llx_askpricesupplierdet` ( + `rowid` int(11) NOT NULL AUTO_INCREMENT, + `fk_askpricesupplier` int(11) NOT NULL, + `fk_parent_line` int(11) DEFAULT NULL, + `fk_product` int(11) DEFAULT NULL, + `label` varchar(255) DEFAULT NULL, + `description` text, + `fk_remise_except` int(11) DEFAULT NULL, + `tva_tx` double(6,3) DEFAULT '0.000', + `localtax1_tx` double(6,3) DEFAULT '0.000', + `localtax1_type` varchar(10) DEFAULT NULL, + `localtax2_tx` double(6,3) DEFAULT '0.000', + `localtax2_type` varchar(10) DEFAULT NULL, + `qty` double DEFAULT NULL, + `remise_percent` double DEFAULT '0', + `remise` double DEFAULT '0', + `price` double DEFAULT NULL, + `subprice` double(24,8) DEFAULT '0.00000000', + `total_ht` double(24,8) DEFAULT '0.00000000', + `total_tva` double(24,8) DEFAULT '0.00000000', + `total_localtax1` double(24,8) DEFAULT '0.00000000', + `total_localtax2` double(24,8) DEFAULT '0.00000000', + `total_ttc` double(24,8) DEFAULT '0.00000000', + `product_type` int(11) DEFAULT '0', + `date_start` datetime DEFAULT NULL, + `date_end` datetime DEFAULT NULL, + `info_bits` int(11) DEFAULT '0', + `buy_price_ht` double(24,8) DEFAULT '0.00000000', + `fk_product_fournisseur_price` int(11) DEFAULT NULL, + `special_code` int(11) DEFAULT '0', + `rang` int(11) DEFAULT '0', + PRIMARY KEY (`rowid`), + KEY `idx_askpricesupplierdet_fk_askpricesupplierdet` (`fk_askpricesupplier`), + KEY `idx_askpricesupplierdet_fk_product` (`fk_product`), + CONSTRAINT `fk_askpricesupplierdet_fk_propal` FOREIGN KEY (`fk_askpricesupplier`) REFERENCES `llx_askpricesupplier` (`rowid`) +) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8 diff --git a/htdocs/comm/askpricesupplier/sql/llx_askpricesupplierdet_extrafields.sql b/htdocs/comm/askpricesupplier/sql/llx_askpricesupplierdet_extrafields.sql new file mode 100644 index 00000000000..dfd7a889560 --- /dev/null +++ b/htdocs/comm/askpricesupplier/sql/llx_askpricesupplierdet_extrafields.sql @@ -0,0 +1,8 @@ +CREATE TABLE `llx_askpricesupplierdet_extrafields` ( + `rowid` int(11) NOT NULL AUTO_INCREMENT, + `tms` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `fk_object` int(11) NOT NULL, + `import_key` varchar(14) DEFAULT NULL, + PRIMARY KEY (`rowid`), + KEY `idx_askpricesupplierdet_extrafields` (`fk_object`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 \ No newline at end of file diff --git a/htdocs/comm/askpricesupplier/tpl/linkedobjectblock.tpl.php b/htdocs/comm/askpricesupplier/tpl/linkedobjectblock.tpl.php index cb920afd5fc..0ae63216086 100644 --- a/htdocs/comm/askpricesupplier/tpl/linkedobjectblock.tpl.php +++ b/htdocs/comm/askpricesupplier/tpl/linkedobjectblock.tpl.php @@ -52,11 +52,11 @@ foreach($linkedObjectBlock as $object) $var=!$var; ?> > + trans("ShowAskPriceSupplier"),"askpricesupplier").' '.$object->ref; ?> @@ -69,7 +69,7 @@ foreach($linkedObjectBlock as $object) diff --git a/htdocs/core/lib/askpricesupplier.lib.php b/htdocs/core/lib/askpricesupplier.lib.php new file mode 100644 index 00000000000..fd227d512b7 --- /dev/null +++ b/htdocs/core/lib/askpricesupplier.lib.php @@ -0,0 +1,148 @@ + + * Copyright (C) 2005-2012 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 3 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, see . + * or see http://www.gnu.org/ + */ + +/** + * \file htdocs/core/lib/propal.lib.php + * \brief Ensemble de fonctions de base pour le module propal + * \ingroup propal + */ + +/** + * Prepare array with list of tabs + * + * @param object $object Object related to tabs + * @return array Array of tabs to show + */ +function propal_prepare_head($object) +{ + global $langs, $conf, $user; + $langs->load("propal"); + $langs->load("compta"); + + $h = 0; + $head = array(); + + $head[$h][0] = DOL_URL_ROOT.'/comm/propal.php?id='.$object->id; + $head[$h][1] = $langs->trans('ProposalCard'); + $head[$h][2] = 'comm'; + $h++; + + if ((empty($conf->commande->enabled) && ((! empty($conf->expedition_bon->enabled) && $user->rights->expedition->lire) + || (! empty($conf->livraison_bon->enabled) && $user->rights->expedition->livraison->lire)))) + { + $langs->load("sendings"); + $head[$h][0] = DOL_URL_ROOT.'/expedition/propal.php?id='.$object->id; + if ($conf->expedition_bon->enabled) $text=$langs->trans("Shipment"); + if ($conf->livraison_bon->enabled) $text.='/'.$langs->trans("Receivings"); + $head[$h][1] = $text; + $head[$h][2] = 'shipping'; + $h++; + } + if (! empty($conf->global->MAIN_USE_PREVIEW_TABS)) + { + $head[$h][0] = DOL_URL_ROOT.'/comm/propal/apercu.php?id='.$object->id; + $head[$h][1] = $langs->trans("Preview"); + $head[$h][2] = 'preview'; + $h++; + } + + if (empty($conf->global->MAIN_DISABLE_CONTACTS_TAB)) + { + $head[$h][0] = DOL_URL_ROOT.'/comm/propal/contact.php?id='.$object->id; + $head[$h][1] = $langs->trans('ContactsAddresses'); + $head[$h][2] = 'contact'; + $h++; + } + + // Show more tabs from modules + // Entries must be declared in modules descriptor with line + // $this->tabs = array('entity:+tabname:Title:@mymodule:/mymodule/mypage.php?id=__ID__'); to add new tab + // $this->tabs = array('entity:-tabname); to remove a tab + complete_head_from_modules($conf,$langs,$object,$head,$h,'propal'); + + if (empty($conf->global->MAIN_DISABLE_NOTES_TAB)) + { + $nbNote = 0; + if(!empty($object->note_private)) $nbNote++; + if(!empty($object->note_public)) $nbNote++; + $head[$h][0] = DOL_URL_ROOT.'/comm/propal/note.php?id='.$object->id; + $head[$h][1] = $langs->trans('Notes'); + if ($nbNote > 0) $head[$h][1].= ' '.$nbNote.''; + $head[$h][2] = 'note'; + $h++; + } + + require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php'; + $upload_dir = $conf->propal->dir_output . "/" . dol_sanitizeFileName($object->ref); + $nbFiles = count(dol_dir_list($upload_dir,'files',0,'','(\.meta|_preview\.png)$')); + $head[$h][0] = DOL_URL_ROOT.'/comm/propal/document.php?id='.$object->id; + $head[$h][1] = $langs->trans('Documents'); + if($nbFiles > 0) $head[$h][1].= ' '.$nbFiles.''; + $head[$h][2] = 'document'; + $h++; + + $head[$h][0] = DOL_URL_ROOT.'/comm/propal/info.php?id='.$object->id; + $head[$h][1] = $langs->trans('Info'); + $head[$h][2] = 'info'; + $h++; + + complete_head_from_modules($conf,$langs,$object,$head,$h,'propal','remove'); + + return $head; +} + +/** + * Return array head with list of tabs to view object informations. + * + * @return array head array with tabs + */ +function propal_admin_prepare_head() +{ + global $langs, $conf, $user; + + $h = 0; + $head = array(); + + $head[$h][0] = DOL_URL_ROOT.'/admin/propal.php'; + $head[$h][1] = $langs->trans("Miscellaneous"); + $head[$h][2] = 'general'; + $h++; + + // Show more tabs from modules + // Entries must be declared in modules descriptor with line + // $this->tabs = array('entity:+tabname:Title:@mymodule:/mymodule/mypage.php?id=__ID__'); to add new tab + // $this->tabs = array('entity:-tabname:Title:@mymodule:/mymodule/mypage.php?id=__ID__'); to remove a tab + complete_head_from_modules($conf,$langs,null,$head,$h,'propal_admin'); + + $head[$h][0] = DOL_URL_ROOT.'/comm/admin/propal_extrafields.php'; + $head[$h][1] = $langs->trans("ExtraFields"); + $head[$h][2] = 'attributes'; + $h++; + + $head[$h][0] = DOL_URL_ROOT.'/comm/admin/propaldet_extrafields.php'; + $head[$h][1] = $langs->trans("ExtraFieldsLines"); + $head[$h][2] = 'attributeslines'; + $h++; + + complete_head_from_modules($conf,$langs,null,$head,$h,'propal_admin','remove'); + + return $head; +} + + diff --git a/htdocs/core/modules/askpricesupplier/doc/doc_generic_proposal_odt.modules.php b/htdocs/core/modules/askpricesupplier/doc/doc_generic_proposal_odt.modules.php new file mode 100644 index 00000000000..8f79094befc --- /dev/null +++ b/htdocs/core/modules/askpricesupplier/doc/doc_generic_proposal_odt.modules.php @@ -0,0 +1,484 @@ + + * Copyright (C) 2012 Juanjo Menent +* +* 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 3 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, see . +* or see http://www.gnu.org/ +*/ + +/** + * \file htdocs/core/modules/propale/doc/doc_generic_proposal_odt.modules.php + * \ingroup societe + * \brief File of class to build ODT documents for third parties + */ + +require_once DOL_DOCUMENT_ROOT.'/core/modules/propale/modules_propale.php'; +require_once DOL_DOCUMENT_ROOT.'/product/class/product.class.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/doc.lib.php'; + + +/** + * Class to build documents using ODF templates generator + */ +class doc_generic_proposal_odt extends ModelePDFPropales +{ + var $emetteur; // Objet societe qui emet + + var $phpmin = array(5,2,0); // Minimum version of PHP required by module + var $version = 'dolibarr'; + + + /** + * Constructor + * + * @param DoliDB $db Database handler + */ + function __construct($db) + { + global $conf,$langs,$mysoc; + + $langs->load("main"); + $langs->load("companies"); + + $this->db = $db; + $this->name = "ODT templates"; + $this->description = $langs->trans("DocumentModelOdt"); + $this->scandir = 'PROPALE_ADDON_PDF_ODT_PATH'; // Name of constant that is used to save list of directories to scan + + // Dimension page pour format A4 + $this->type = 'odt'; + $this->page_largeur = 0; + $this->page_hauteur = 0; + $this->format = array($this->page_largeur,$this->page_hauteur); + $this->marge_gauche=0; + $this->marge_droite=0; + $this->marge_haute=0; + $this->marge_basse=0; + + $this->option_logo = 1; // Affiche logo + $this->option_tva = 0; // Gere option tva PROPALE_TVAOPTION + $this->option_modereg = 0; // Affiche mode reglement + $this->option_condreg = 0; // Affiche conditions reglement + $this->option_codeproduitservice = 0; // Affiche code produit-service + $this->option_multilang = 1; // Dispo en plusieurs langues + $this->option_escompte = 0; // Affiche si il y a eu escompte + $this->option_credit_note = 0; // Support credit notes + $this->option_freetext = 1; // Support add of a personalised text + $this->option_draft_watermark = 0; // Support add of a watermark on drafts + + // Recupere emetteur + $this->emetteur=$mysoc; + if (! $this->emetteur->country_code) $this->emetteur->country_code=substr($langs->defaultlang,-2); // By default if not defined + } + + + /** + * Return description of a module + * + * @param Translate $langs Lang object to use for output + * @return string Description + */ + function info($langs) + { + global $conf,$langs; + + $langs->load("companies"); + $langs->load("errors"); + + $form = new Form($this->db); + + $texte = $this->description.".
\n"; + $texte.= '
'; + $texte.= ''; + $texte.= ''; + $texte.= ''; + if ($conf->global->MAIN_PROPAL_CHOOSE_ODT_DOCUMENT > 0) + { + $texte.= ''; + $texte.= ''; + $texte.= ''; + } + $texte.= '
'.$langs->trans("ProposalsOpened").' '.$num.'
'.$langs->trans("RequestsOpened").' '.$num.'
'; - $propalstatic->id=$obj->propalid; - $propalstatic->ref=$obj->ref; + $askpricesupplierstatic->id=$obj->propalid; + $askpricesupplierstatic->ref=$obj->ref; print ''; print ''; print ''; print '
'; - print $propalstatic->getNomUrl(1); + print $askpricesupplierstatic->getNomUrl(1); print ''; - if ($db->jdate($obj->dfv) < ($now - $conf->propal->cloture->warning_delay)) print img_warning($langs->trans("Late")); + if ($db->jdate($obj->dfv) < ($now - $conf->askpricesupplier->cloture->warning_delay)) print img_warning($langs->trans("Late")); print ''; $filename=dol_sanitizeFileName($obj->ref); - $filedir=$conf->propal->dir_output . '/' . dol_sanitizeFileName($obj->ref); - $urlsource=$_SERVER['PHP_SELF'].'?id='.$obj->propalid; - print $formfile->getDocumentsLink($propalstatic->element, $filename, $filedir); + $filedir=$conf->askpricesupplier->dir_output . '/' . dol_sanitizeFileName($obj->ref); + $urlsource=$_SERVER['PHP_SELF'].'?id='.$obj->askpricesupplierid; + print $formfile->getDocumentsLink($askpricesupplierstatic->element, $filename, $filedir); print '
'; print "
'; print dol_print_date($db->jdate($obj->dp),'day').''.price($obj->total_ttc).''.$propalstatic->LibStatut($obj->fk_statut,3).''.$askpricesupplierstatic->LibStatut($obj->fk_statut,3).'
'; - $propalstatic->id=$obj->rowid; - $propalstatic->ref=$obj->ref; + $askpricesupplierstatic->id=$obj->rowid; + $askpricesupplierstatic->ref=$obj->ref; print ''; print ''; print '
'; - print $propalstatic->getNomUrl(1); + print $askpricesupplierstatic->getNomUrl(1); print ''; @@ -428,14 +428,14 @@ if (! empty($conf->propal->enabled)) $filename=dol_sanitizeFileName($obj->ref); $filedir=$conf->commande->dir_output . '/' . dol_sanitizeFileName($obj->ref); $urlsource=$_SERVER['PHP_SELF'].'?id='.$obj->rowid; - print $formfile->getDocumentsLink($propalstatic->element, $filename, $filedir); + print $formfile->getDocumentsLink($askpricesupplierstatic->element, $filename, $filedir); print '
'; print '
'.img_object($langs->trans("ShowCompany"),"company").' '.dol_trunc($obj->name,24).''.$propalstatic->LibStatut($obj->fk_statut,$obj->facture,5).''.$askpricesupplierstatic->LibStatut($obj->fk_statut,$obj->facture,5).'
'; - $propalstatic->id=$obj->rowid; - $propalstatic->ref=$obj->ref; + $askpricesupplierstatic->id=$obj->rowid; + $askpricesupplierstatic->ref=$obj->ref; print ''; print ''; print '
'; - print $propalstatic->getNomUrl(1); + print $askpricesupplierstatic->getNomUrl(1); print ''; @@ -500,14 +500,14 @@ if (! empty($conf->propal->enabled)) $filename=dol_sanitizeFileName($obj->ref); $filedir=$conf->commande->dir_output . '/' . dol_sanitizeFileName($obj->ref); $urlsource=$_SERVER['PHP_SELF'].'?id='.$obj->rowid; - print $formfile->getDocumentsLink($propalstatic->element, $filename, $filedir); + print $formfile->getDocumentsLink($askpricesupplierstatic->element, $filename, $filedir); print '
'; print '
'.img_object($langs->trans("ShowCompany"),"company").' '.$obj->name.''.$propalstatic->LibStatut($obj->fk_statut,$obj->facture,5).''.$askpricesupplierstatic->LibStatut($obj->fk_statut,$obj->facture,5).'
- trans("ShowPropal"),"propal").' '.$object->ref; ?> ref_client; ?> date,'day'); ?> rights->propale->lire) { + if ($user->rights->askpricesupplier->lire) { $total = $total + $object->total_ht; echo price($object->total_ht); } ?>
trans('TotalHT'); ?> rights->propale->lire) { + if ($user->rights->askpricesupplier->lire) { echo price($total); } ?>  
'; + + // List of directories area + $texte.= ''; + + $texte.= ''; + $texte.= ''; + + $texte.= '
'; + $texttitle=$langs->trans("ListOfDirectories"); + $listofdir=explode(',',preg_replace('/[\r\n]+/',',',trim($conf->global->PROPALE_ADDON_PDF_ODT_PATH))); + $listoffiles=array(); + foreach($listofdir as $key=>$tmpdir) + { + $tmpdir=trim($tmpdir); + $tmpdir=preg_replace('/DOL_DATA_ROOT/',DOL_DATA_ROOT,$tmpdir); + if (! $tmpdir) { + unset($listofdir[$key]); continue; + } + if (! is_dir($tmpdir)) $texttitle.=img_warning($langs->trans("ErrorDirNotFound",$tmpdir),0); + else + { + $tmpfiles=dol_dir_list($tmpdir,'files',0,'\.(ods|odt)'); + if (count($tmpfiles)) $listoffiles=array_merge($listoffiles,$tmpfiles); + } + } + $texthelp=$langs->trans("ListOfDirectoriesForModelGenODT"); + // Add list of substitution keys + $texthelp.='
'.$langs->trans("FollowingSubstitutionKeysCanBeUsed").'
'; + $texthelp.=$langs->transnoentitiesnoconv("FullListOnOnlineDocumentation"); // This contains an url, we don't modify it + + $texte.= $form->textwithpicto($texttitle,$texthelp,1,'help','',1); + $texte.= '
'; + $texte.= ''; + $texte.= '
'; + $texte.= ''; + $texte.= '
'; + + // Scan directories + if (count($listofdir)) + { + $texte.=$langs->trans("NumberOfModelFilesFound").': '.count($listoffiles).''; + + if ($conf->global->MAIN_PROPAL_CHOOSE_ODT_DOCUMENT > 0) + { + // Model for creation + $liste=ModelePDFPropales::liste_modeles($this->db); + $texte.= ''; + $texte.= ''; + $texte.= ''; + $texte.= '"; + + $texte.= ''; + $texte.= ''; + $texte.= '"; + $texte.= ''; + + $texte.= ''; + $texte.= '"; + $texte.= '
'.$langs->trans("DefaultModelPropalCreate").''; + $texte.= $form->selectarray('value2',$liste,$conf->global->PROPALE_ADDON_PDF_ODT_DEFAULT); + $texte.= "
'.$langs->trans("DefaultModelPropalToBill").''; + $texte.= $form->selectarray('value3',$liste,$conf->global->PROPALE_ADDON_PDF_ODT_TOBILL); + $texte.= "
'.$langs->trans("DefaultModelPropalClosed").''; + $texte.= $form->selectarray('value4',$liste,$conf->global->PROPALE_ADDON_PDF_ODT_CLOSED); + $texte.= "
'; + } + } + + $texte.= '
'; + $texte.= $langs->trans("ExampleOfDirectoriesForModelGen"); + $texte.= '
'; + $texte.= ''; + + return $texte; + } + + /** + * Function to build a document on disk using the generic odt module. + * + * @param Propale $object Object source to build document + * @param Translate $outputlangs Lang output object + * @param string $srctemplatepath Full path of source filename for generator using a template file + * @param int $hidedetails Do not show line details + * @param int $hidedesc Do not show desc + * @param int $hideref Do not show ref + * @return int 1 if OK, <=0 if KO + */ + function write_file($object,$outputlangs,$srctemplatepath,$hidedetails=0,$hidedesc=0,$hideref=0) + { + global $user,$langs,$conf,$mysoc,$hookmanager; + + if (empty($srctemplatepath)) + { + dol_syslog("doc_generic_odt::write_file parameter srctemplatepath empty", LOG_WARNING); + return -1; + } + + // Add odtgeneration hook + if (! is_object($hookmanager)) + { + include_once DOL_DOCUMENT_ROOT.'/core/class/hookmanager.class.php'; + $hookmanager=new HookManager($this->db); + } + $hookmanager->initHooks(array('odtgeneration')); + global $action; + + if (! is_object($outputlangs)) $outputlangs=$langs; + $sav_charset_output=$outputlangs->charset_output; + $outputlangs->charset_output='UTF-8'; + + $outputlangs->load("main"); + $outputlangs->load("dict"); + $outputlangs->load("companies"); + $outputlangs->load("bills"); + + if ($conf->propal->dir_output) + { + // If $object is id instead of object + if (! is_object($object)) + { + $id = $object; + $object = new Propale($this->db); + $result=$object->fetch($id); + if ($result < 0) + { + dol_print_error($this->db,$object->error); + return -1; + } + } + + $dir = $conf->propal->dir_output; + $objectref = dol_sanitizeFileName($object->ref); + if (! preg_match('/specimen/i',$objectref)) $dir.= "/" . $objectref; + $file = $dir . "/" . $objectref . ".odt"; + + if (! file_exists($dir)) + { + if (dol_mkdir($dir) < 0) + { + $this->error=$langs->transnoentities("ErrorCanNotCreateDir",$dir); + return -1; + } + } + + if (file_exists($dir)) + { + //print "srctemplatepath=".$srctemplatepath; // Src filename + $newfile=basename($srctemplatepath); + $newfiletmp=preg_replace('/\.od(t|s)/i','',$newfile); + $newfiletmp=preg_replace('/template_/i','',$newfiletmp); + $newfiletmp=preg_replace('/modele_/i','',$newfiletmp); + + $newfiletmp=$objectref.'_'.$newfiletmp; + + // Get extension (ods or odt) + $newfileformat=substr($newfile, strrpos($newfile, '.')+1); + if ( ! empty($conf->global->MAIN_DOC_USE_TIMING)) + { + $filename=$newfiletmp.'.'.dol_print_date(dol_now(),'%Y%m%d%H%M%S').'.'.$newfileformat; + } + else + { + $filename=$newfiletmp.'.'.$newfileformat; + } + $file=$dir.'/'.$filename; + //print "newdir=".$dir; + //print "newfile=".$newfile; + //print "file=".$file; + //print "conf->propal->dir_temp=".$conf->propal->dir_temp; + + dol_mkdir($conf->propal->dir_temp); + + + // If BILLING contact defined on invoice, we use it + $usecontact=false; + $arrayidcontact=$object->getIdContact('external','BILLING'); + if (count($arrayidcontact) > 0) + { + $usecontact=true; + $result=$object->fetch_contact($arrayidcontact[0]); + } + + // Recipient name + if (! empty($usecontact)) + { + // On peut utiliser le nom de la societe du contact + if (! empty($conf->global->MAIN_USE_COMPANY_NAME_OF_CONTACT)) $socobject = $object->contact; + else $socobject = $object->client; + } + else + { + $socobject=$object->client; + } + + // Make substitution + $substitutionarray=array( + '__FROM_NAME__' => $this->emetteur->name, + '__FROM_EMAIL__' => $this->emetteur->email, + '__TOTAL_TTC__' => $object->total_ttc, + '__TOTAL_HT__' => $object->total_ht, + '__TOTAL_VAT__' => $object->total_vat + ); + complete_substitutions_array($substitutionarray, $langs, $object); + // Call the ODTSubstitution hook + $parameters=array('file'=>$file,'object'=>$object,'outputlangs'=>$outputlangs,'substitutionarray'=>&$substitutionarray); + $reshook=$hookmanager->executeHooks('ODTSubstitution',$parameters,$this,$action); // Note that $action and $object may have been modified by some hooks + + // Line of free text + $newfreetext=''; + $paramfreetext='PROPALE_FREE_TEXT'; + if (! empty($conf->global->$paramfreetext)) + { + $newfreetext=make_substitutions($conf->global->$paramfreetext,$substitutionarray); + } + + // Open and load template + require_once ODTPHP_PATH.'odf.php'; + try { + $odfHandler = new odf( + $srctemplatepath, + array( + 'PATH_TO_TMP' => $conf->propal->dir_temp, + 'ZIP_PROXY' => 'PclZipProxy', // PhpZipProxy or PclZipProxy. Got "bad compression method" error when using PhpZipProxy. + 'DELIMITER_LEFT' => '{', + 'DELIMITER_RIGHT' => '}' + ) + ); + } + catch(Exception $e) + { + $this->error=$e->getMessage(); + return -1; + } + // After construction $odfHandler->contentXml contains content and + // [!-- BEGIN row.lines --]*[!-- END row.lines --] has been replaced by + // [!-- BEGIN lines --]*[!-- END lines --] + //print html_entity_decode($odfHandler->__toString()); + //print exit; + + + // Make substitutions into odt of freetext + try { + $odfHandler->setVars('free_text', $newfreetext, true, 'UTF-8'); + } + catch(OdfException $e) + { + } + + // Make substitutions into odt + $array_user=$this->get_substitutionarray_user($user,$outputlangs); + $array_soc=$this->get_substitutionarray_mysoc($mysoc,$outputlangs); + $array_thirdparty=$this->get_substitutionarray_thirdparty($socobject,$outputlangs); + $array_objet=$this->get_substitutionarray_object($object,$outputlangs); + $array_other=$this->get_substitutionarray_other($outputlangs); + + $tmparray = array_merge($array_user,$array_soc,$array_thirdparty,$array_objet,$array_other); + complete_substitutions_array($tmparray, $outputlangs, $object); + // Call the ODTSubstitution hook + $parameters=array('file'=>$file,'object'=>$object,'outputlangs'=>$outputlangs,'substitutionarray'=>&$tmparray); + $reshook=$hookmanager->executeHooks('ODTSubstitution',$parameters,$this,$action); // Note that $action and $object may have been modified by some hooks + foreach($tmparray as $key=>$value) + { + try { + if (preg_match('/logo$/',$key)) // Image + { + if (file_exists($value)) $odfHandler->setImage($key, $value); + else $odfHandler->setVars($key, 'ErrorFileNotFound', true, 'UTF-8'); + } + else // Text + { + $odfHandler->setVars($key, $value, true, 'UTF-8'); + } + } + catch(OdfException $e) + { + } + } + // Replace tags of lines + try + { + $listlines = $odfHandler->setSegment('lines'); + foreach ($object->lines as $line) + { + $tmparray=$this->get_substitutionarray_lines($line,$outputlangs); + complete_substitutions_array($tmparray, $outputlangs, $object, $line, "completesubstitutionarray_lines"); + // Call the ODTSubstitutionLine hook + $parameters=array('odfHandler'=>&$odfHandler,'file'=>$file,'object'=>$object,'outputlangs'=>$outputlangs,'substitutionarray'=>&$tmparray,'line'=>$line); + $reshook=$hookmanager->executeHooks('ODTSubstitutionLine',$parameters,$this,$action); // Note that $action and $object may have been modified by some hooks + foreach($tmparray as $key => $val) + { + try + { + $listlines->setVars($key, $val, true, 'UTF-8'); + } + catch(OdfException $e) + { + } + catch(SegmentException $e) + { + } + } + $listlines->merge(); + } + $odfHandler->mergeSegment($listlines); + } + catch(OdfException $e) + { + $this->error=$e->getMessage(); + dol_syslog($this->error, LOG_WARNING); + return -1; + } + + // Replace labels translated + $tmparray=$outputlangs->get_translations_for_substitutions(); + foreach($tmparray as $key=>$value) + { + try { + $odfHandler->setVars($key, $value, true, 'UTF-8'); + } + catch(OdfException $e) + { + } + } + + // Call the beforeODTSave hook + $parameters=array('odfHandler'=>&$odfHandler,'file'=>$file,'object'=>$object,'outputlangs'=>$outputlangs); + $reshook=$hookmanager->executeHooks('beforeODTSave',$parameters,$this,$action); // Note that $action and $object may have been modified by some hooks + + // Write new file + if (!empty($conf->global->MAIN_ODT_AS_PDF)) { + try { + $odfHandler->exportAsAttachedPDF($file); + }catch (Exception $e){ + $this->error=$e->getMessage(); + return -1; + } + } + else { + try { + $odfHandler->saveToDisk($file); + }catch (Exception $e){ + $this->error=$e->getMessage(); + return -1; + } + } + + $reshook=$hookmanager->executeHooks('afterODTCreation',$parameters,$this,$action); // Note that $action and $object may have been modified by some hooks + + if (! empty($conf->global->MAIN_UMASK)) + @chmod($file, octdec($conf->global->MAIN_UMASK)); + + $odfHandler=null; // Destroy object + + return 1; // Success + } + else + { + $this->error=$langs->transnoentities("ErrorCanNotCreateDir",$dir); + return -1; + } + } + + return -1; + } + +} + diff --git a/htdocs/core/modules/askpricesupplier/doc/index.html b/htdocs/core/modules/askpricesupplier/doc/index.html new file mode 100644 index 00000000000..e69de29bb2d diff --git a/htdocs/core/modules/askpricesupplier/doc/pdf_azur.modules.php b/htdocs/core/modules/askpricesupplier/doc/pdf_azur.modules.php new file mode 100644 index 00000000000..35953b8521f --- /dev/null +++ b/htdocs/core/modules/askpricesupplier/doc/pdf_azur.modules.php @@ -0,0 +1,1385 @@ + + * Copyright (C) 2005-2012 Regis Houssin + * Copyright (C) 2008 Raphael Bertrand + * Copyright (C) 2010-2014 Juanjo Menent + * Copyright (C) 2012 Christophe Battarel + * + * 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 3 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, see . + * or see http://www.gnu.org/ + */ + +/** + * \file htdocs/core/modules/propale/doc/pdf_azur.modules.php + * \ingroup propale + * \brief Fichier de la classe permettant de generer les propales au modele Azur + */ +require_once DOL_DOCUMENT_ROOT.'/core/modules/propale/modules_propale.php'; +require_once DOL_DOCUMENT_ROOT.'/product/class/product.class.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/pdf.lib.php'; + + +/** + * Class to generate PDF proposal Azur + */ +class pdf_azur extends ModelePDFPropales +{ + var $db; + var $name; + var $description; + var $type; + + var $phpmin = array(4,3,0); // Minimum version of PHP required by module + var $version = 'dolibarr'; + + var $page_largeur; + var $page_hauteur; + var $format; + var $marge_gauche; + var $marge_droite; + var $marge_haute; + var $marge_basse; + + var $emetteur; // Objet societe qui emet + + + /** + * Constructor + * + * @param DoliDB $db Database handler + */ + function __construct($db) + { + global $conf,$langs,$mysoc; + + $langs->load("main"); + $langs->load("bills"); + + $this->db = $db; + $this->name = "azur"; + $this->description = $langs->trans('DocModelAzurDescription'); + + // Dimension page pour format A4 + $this->type = 'pdf'; + $formatarray=pdf_getFormat(); + $this->page_largeur = $formatarray['width']; + $this->page_hauteur = $formatarray['height']; + $this->format = array($this->page_largeur,$this->page_hauteur); + $this->marge_gauche=isset($conf->global->MAIN_PDF_MARGIN_LEFT)?$conf->global->MAIN_PDF_MARGIN_LEFT:10; + $this->marge_droite=isset($conf->global->MAIN_PDF_MARGIN_RIGHT)?$conf->global->MAIN_PDF_MARGIN_RIGHT:10; + $this->marge_haute =isset($conf->global->MAIN_PDF_MARGIN_TOP)?$conf->global->MAIN_PDF_MARGIN_TOP:10; + $this->marge_basse =isset($conf->global->MAIN_PDF_MARGIN_BOTTOM)?$conf->global->MAIN_PDF_MARGIN_BOTTOM:10; + + $this->option_logo = 1; // Affiche logo + $this->option_tva = 1; // Gere option tva FACTURE_TVAOPTION + $this->option_modereg = 1; // Affiche mode reglement + $this->option_condreg = 1; // Affiche conditions reglement + $this->option_codeproduitservice = 1; // Affiche code produit-service + $this->option_multilang = 1; // Dispo en plusieurs langues + $this->option_escompte = 1; // Affiche si il y a eu escompte + $this->option_credit_note = 1; // Support credit notes + $this->option_freetext = 1; // Support add of a personalised text + $this->option_draft_watermark = 1; //Support add of a watermark on drafts + + $this->franchise=!$mysoc->tva_assuj; + + // Get source company + $this->emetteur=$mysoc; + if (empty($this->emetteur->country_code)) $this->emetteur->country_code=substr($langs->defaultlang,-2); // By default, if was not defined + + // Define position of columns + $this->posxdesc=$this->marge_gauche+1; + $this->posxtva=112; + $this->posxup=126; + $this->posxqty=145; + $this->posxdiscount=162; + $this->postotalht=174; + if (! empty($conf->global->MAIN_GENERATE_DOCUMENTS_WITHOUT_VAT)) $this->posxtva=$this->posxup; + $this->posxpicture=$this->posxtva - (empty($conf->global->MAIN_DOCUMENTS_WITH_PICTURE_WIDTH)?20:$conf->global->MAIN_DOCUMENTS_WITH_PICTURE_WIDTH); // width of images + if ($this->page_largeur < 210) // To work with US executive format + { + $this->posxpicture-=20; + $this->posxtva-=20; + $this->posxup-=20; + $this->posxqty-=20; + $this->posxdiscount-=20; + $this->postotalht-=20; + } + + $this->tva=array(); + $this->localtax1=array(); + $this->localtax2=array(); + $this->atleastoneratenotnull=0; + $this->atleastonediscount=0; + } + + /** + * Function to build pdf onto disk + * + * @param Object $object Object to generate + * @param Translate $outputlangs Lang output object + * @param string $srctemplatepath Full path of source filename for generator using a template file + * @param int $hidedetails Do not show line details + * @param int $hidedesc Do not show desc + * @param int $hideref Do not show ref + * @return int 1=OK, 0=KO + */ + function write_file($object,$outputlangs,$srctemplatepath='',$hidedetails=0,$hidedesc=0,$hideref=0) + { + global $user,$langs,$conf,$mysoc,$db,$hookmanager; + + if (! is_object($outputlangs)) $outputlangs=$langs; + // For backward compatibility with FPDF, force output charset to ISO, because FPDF expect text to be encoded in ISO + if (! empty($conf->global->MAIN_USE_FPDF)) $outputlangs->charset_output='ISO-8859-1'; + + $outputlangs->load("main"); + $outputlangs->load("dict"); + $outputlangs->load("companies"); + $outputlangs->load("bills"); + $outputlangs->load("propal"); + $outputlangs->load("products"); + + $nblignes = count($object->lines); + + // Loop on each lines to detect if there is at least one image to show + $realpatharray=array(); + if (! empty($conf->global->MAIN_GENERATE_PROPOSALS_WITH_PICTURE)) + { + for ($i = 0 ; $i < $nblignes ; $i++) + { + if (empty($object->lines[$i]->fk_product)) continue; + + $objphoto = new Product($this->db); + $objphoto->fetch($object->lines[$i]->fk_product); + + $pdir = get_exdir($object->lines[$i]->fk_product,2) . $object->lines[$i]->fk_product ."/photos/"; + $dir = $conf->product->dir_output.'/'.$pdir; + + $realpath=''; + foreach ($objphoto->liste_photos($dir,1) as $key => $obj) + { + $filename=$obj['photo']; + //if ($obj['photo_vignette']) $filename='thumbs/'.$obj['photo_vignette']; + $realpath = $dir.$filename; + break; + } + + if ($realpath) $realpatharray[$i]=$realpath; + } + } + if (count($realpatharray) == 0) $this->posxpicture=$this->posxtva; + + if ($conf->propal->dir_output) + { + $object->fetch_thirdparty(); + + // $deja_regle = 0; + + // Definition of $dir and $file + if ($object->specimen) + { + $dir = $conf->propal->dir_output; + $file = $dir . "/SPECIMEN.pdf"; + } + else + { + $objectref = dol_sanitizeFileName($object->ref); + $dir = $conf->propal->dir_output . "/" . $objectref; + $file = $dir . "/" . $objectref . ".pdf"; + } + + if (! file_exists($dir)) + { + if (dol_mkdir($dir) < 0) + { + $this->error=$langs->transnoentities("ErrorCanNotCreateDir",$dir); + return 0; + } + } + + if (file_exists($dir)) + { + // Add pdfgeneration hook + if (! is_object($hookmanager)) + { + include_once DOL_DOCUMENT_ROOT.'/core/class/hookmanager.class.php'; + $hookmanager=new HookManager($this->db); + } + $hookmanager->initHooks(array('pdfgeneration')); + $parameters=array('file'=>$file,'object'=>$object,'outputlangs'=>$outputlangs); + global $action; + $reshook=$hookmanager->executeHooks('beforePDFCreation',$parameters,$object,$action); // Note that $action and $object may have been modified by some hooks + + // Create pdf instance + $pdf=pdf_getInstance($this->format); + $default_font_size = pdf_getPDFFontSize($outputlangs); // Must be after pdf_getInstance + $heightforinfotot = 50; // Height reserved to output the info and total part + $heightforfreetext= (isset($conf->global->MAIN_PDF_FREETEXT_HEIGHT)?$conf->global->MAIN_PDF_FREETEXT_HEIGHT:5); // Height reserved to output the free text on last page + $heightforfooter = $this->marge_basse + 8; // Height reserved to output the footer (value include bottom margin) + $pdf->SetAutoPageBreak(1,0); + + if (class_exists('TCPDF')) + { + $pdf->setPrintHeader(false); + $pdf->setPrintFooter(false); + } + $pdf->SetFont(pdf_getPDFFont($outputlangs)); + // Set path to the background PDF File + if (empty($conf->global->MAIN_DISABLE_FPDI) && ! empty($conf->global->MAIN_ADD_PDF_BACKGROUND)) + { + $pagecount = $pdf->setSourceFile($conf->mycompany->dir_output.'/'.$conf->global->MAIN_ADD_PDF_BACKGROUND); + $tplidx = $pdf->importPage(1); + } + + $pdf->Open(); + $pagenb=0; + $pdf->SetDrawColor(128,128,128); + + $pdf->SetTitle($outputlangs->convToOutputCharset($object->ref)); + $pdf->SetSubject($outputlangs->transnoentities("CommercialProposal")); + $pdf->SetCreator("Dolibarr ".DOL_VERSION); + $pdf->SetAuthor($outputlangs->convToOutputCharset($user->getFullName($outputlangs))); + $pdf->SetKeyWords($outputlangs->convToOutputCharset($object->ref)." ".$outputlangs->transnoentities("CommercialProposal")); + if (! empty($conf->global->MAIN_DISABLE_PDF_COMPRESSION)) $pdf->SetCompression(false); + + $pdf->SetMargins($this->marge_gauche, $this->marge_haute, $this->marge_droite); // Left, Top, Right + + // Positionne $this->atleastonediscount si on a au moins une remise + for ($i = 0 ; $i < $nblignes ; $i++) + { + if ($object->lines[$i]->remise_percent) + { + $this->atleastonediscount++; + } + } + if (empty($this->atleastonediscount)) + { + $this->posxpicture+=($this->postotalht - $this->posxdiscount); + $this->posxtva+=($this->postotalht - $this->posxdiscount); + $this->posxup+=($this->postotalht - $this->posxdiscount); + $this->posxqty+=($this->postotalht - $this->posxdiscount); + $this->posxdiscount+=($this->postotalht - $this->posxdiscount); + //$this->postotalht; + } + + // New page + $pdf->AddPage(); + if (! empty($tplidx)) $pdf->useTemplate($tplidx); + $pagenb++; + $this->_pagehead($pdf, $object, 1, $outputlangs); + $pdf->SetFont('','', $default_font_size - 1); + $pdf->MultiCell(0, 3, ''); // Set interline to 3 + $pdf->SetTextColor(0,0,0); + + $tab_top = 90; + $tab_top_newpage = (empty($conf->global->MAIN_PDF_DONOTREPEAT_HEAD)?42:10); + $tab_height = 130; + $tab_height_newpage = 150; + + // Affiche notes + $notetoshow=empty($object->note_public)?'':$object->note_public; + if (! empty($conf->global->MAIN_ADD_SALE_REP_SIGNATURE_IN_NOTE)) + { + // Get first sale rep + if (is_object($object->thirdparty)) + { + $salereparray=$object->thirdparty->getSalesRepresentatives($user); + $salerepobj=new User($this->db); + $salerepobj->fetch($salereparray[0]['id']); + if (! empty($salerepobj->signature)) $notetoshow=dol_concatdesc($notetoshow, $salerepobj->signature); + } + } + if ($notetoshow) + { + $tab_top = 88; + + $pdf->SetFont('','', $default_font_size - 1); + $pdf->writeHTMLCell(190, 3, $this->posxdesc-1, $tab_top, dol_htmlentitiesbr($notetoshow), 0, 1); + $nexY = $pdf->GetY(); + $height_note=$nexY-$tab_top; + + // Rect prend une longueur en 3eme param + $pdf->SetDrawColor(192,192,192); + $pdf->Rect($this->marge_gauche, $tab_top-1, $this->page_largeur-$this->marge_gauche-$this->marge_droite, $height_note+1); + + $tab_height = $tab_height - $height_note; + $tab_top = $nexY+6; + } + else + { + $height_note=0; + } + + $iniY = $tab_top + 7; + $curY = $tab_top + 7; + $nexY = $tab_top + 7; + + // Loop on each lines + for ($i = 0 ; $i < $nblignes ; $i++) + { + $curY = $nexY; + $pdf->SetFont('','', $default_font_size - 1); // Into loop to work with multipage + $pdf->SetTextColor(0,0,0); + + // Define size of image if we need it + $imglinesize=array(); + if (! empty($realpatharray[$i])) $imglinesize=pdf_getSizeForImage($realpatharray[$i]); + + $pdf->setTopMargin($tab_top_newpage); + $pdf->setPageOrientation('', 1, $heightforfooter+$heightforfreetext+$heightforinfotot); // The only function to edit the bottom margin of current page to set it. + $pageposbefore=$pdf->getPage(); + + $showpricebeforepagebreak=1; + $posYAfterImage=0; + $posYAfterDescription=0; + + // We start with Photo of product line + if (isset($imglinesize['width']) && isset($imglinesize['height']) && ($curY + $imglinesize['height']) > ($this->page_hauteur-($heightforfooter+$heightforfreetext+$heightforinfotot))) // If photo too high, we moved completely on new page + { + $pdf->AddPage('','',true); + if (! empty($tplidx)) $pdf->useTemplate($tplidx); + if (empty($conf->global->MAIN_PDF_DONOTREPEAT_HEAD)) $this->_pagehead($pdf, $object, 0, $outputlangs); + $pdf->setPage($pageposbefore+1); + + $curY = $tab_top_newpage; + $showpricebeforepagebreak=0; + } + + if (isset($imglinesize['width']) && isset($imglinesize['height'])) + { + $curX = $this->posxpicture-1; + $pdf->Image($realpatharray[$i], $curX + (($this->posxtva-$this->posxpicture-$imglinesize['width'])/2), $curY, $imglinesize['width'], $imglinesize['height'], '', '', '', 2, 300); // Use 300 dpi + // $pdf->Image does not increase value return by getY, so we save it manually + $posYAfterImage=$curY+$imglinesize['height']; + } + + // Description of product line + $curX = $this->posxdesc-1; + + $pdf->startTransaction(); + pdf_writelinedesc($pdf,$object,$i,$outputlangs,$this->posxpicture-$curX,3,$curX,$curY,$hideref,$hidedesc); + + $pageposafter=$pdf->getPage(); + if ($pageposafter > $pageposbefore) // There is a pagebreak + { + $pdf->rollbackTransaction(true); + $pageposafter=$pageposbefore; + //print $pageposafter.'-'.$pageposbefore;exit; + $pdf->setPageOrientation('', 1, $heightforfooter); // The only function to edit the bottom margin of current page to set it. + pdf_writelinedesc($pdf,$object,$i,$outputlangs,$this->posxpicture-$curX,3,$curX,$curY,$hideref,$hidedesc); + + $pageposafter=$pdf->getPage(); + $posyafter=$pdf->GetY(); + //var_dump($posyafter); var_dump(($this->page_hauteur - ($heightforfooter+$heightforfreetext+$heightforinfotot))); exit; + if ($posyafter > ($this->page_hauteur - ($heightforfooter+$heightforfreetext+$heightforinfotot))) // There is no space left for total+free text + { + if ($i == ($nblignes-1)) // No more lines, and no space left to show total, so we create a new page + { + $pdf->AddPage('','',true); + if (! empty($tplidx)) $pdf->useTemplate($tplidx); + if (empty($conf->global->MAIN_PDF_DONOTREPEAT_HEAD)) $this->_pagehead($pdf, $object, 0, $outputlangs); + $pdf->setPage($pageposafter+1); + } + } + else + { + // We found a page break + $showpricebeforepagebreak=0; + } + } + else // No pagebreak + { + $pdf->commitTransaction(); + } + $posYAfterDescription=$pdf->GetY(); + + $nexY = $pdf->GetY(); + $pageposafter=$pdf->getPage(); + + $pdf->setPage($pageposbefore); + $pdf->setTopMargin($this->marge_haute); + $pdf->setPageOrientation('', 1, 0); // The only function to edit the bottom margin of current page to set it. + + // We suppose that a too long description or photo were moved completely on next page + if ($pageposafter > $pageposbefore && empty($showpricebeforepagebreak)) { + $pdf->setPage($pageposafter); $curY = $tab_top_newpage; + } + + $pdf->SetFont('','', $default_font_size - 1); // On repositionne la police par defaut + + // VAT Rate + if (empty($conf->global->MAIN_GENERATE_DOCUMENTS_WITHOUT_VAT)) + { + $vat_rate = pdf_getlinevatrate($object, $i, $outputlangs, $hidedetails); + $pdf->SetXY($this->posxtva, $curY); + $pdf->MultiCell($this->posxup-$this->posxtva-0.8, 3, $vat_rate, 0, 'R'); + } + + // Unit price before discount + $up_excl_tax = pdf_getlineupexcltax($object, $i, $outputlangs, $hidedetails); + $pdf->SetXY($this->posxup, $curY); + $pdf->MultiCell($this->posxqty-$this->posxup-0.8, 3, $up_excl_tax, 0, 'R', 0); + + // Quantity + $qty = pdf_getlineqty($object, $i, $outputlangs, $hidedetails); + $pdf->SetXY($this->posxqty, $curY); + $pdf->MultiCell($this->posxdiscount-$this->posxqty-0.8, 3, $qty, 0, 'R'); // Enough for 6 chars + + // Discount on line + if ($object->lines[$i]->remise_percent) + { + $pdf->SetXY($this->posxdiscount-2, $curY); + $remise_percent = pdf_getlineremisepercent($object, $i, $outputlangs, $hidedetails); + $pdf->MultiCell($this->postotalht-$this->posxdiscount+2, 3, $remise_percent, 0, 'R'); + } + + // Total HT line + $total_excl_tax = pdf_getlinetotalexcltax($object, $i, $outputlangs, $hidedetails); + $pdf->SetXY($this->postotalht, $curY); + $pdf->MultiCell($this->page_largeur-$this->marge_droite-$this->postotalht, 3, $total_excl_tax, 0, 'R', 0); + + // Collecte des totaux par valeur de tva dans $this->tva["taux"]=total_tva + $tvaligne=$object->lines[$i]->total_tva; + $localtax1ligne=$object->lines[$i]->total_localtax1; + $localtax2ligne=$object->lines[$i]->total_localtax2; + $localtax1_rate=$object->lines[$i]->localtax1_tx; + $localtax2_rate=$object->lines[$i]->localtax2_tx; + $localtax1_type=$object->lines[$i]->localtax1_type; + $localtax2_type=$object->lines[$i]->localtax2_type; + + if ($object->remise_percent) $tvaligne-=($tvaligne*$object->remise_percent)/100; + if ($object->remise_percent) $localtax1ligne-=($localtax1ligne*$object->remise_percent)/100; + if ($object->remise_percent) $localtax2ligne-=($localtax2ligne*$object->remise_percent)/100; + + $vatrate=(string) $object->lines[$i]->tva_tx; + + // Retrieve type from database for backward compatibility with old records + if ((! isset($localtax1_type) || $localtax1_type=='' || ! isset($localtax2_type) || $localtax2_type=='') // if tax type not defined + && (! empty($localtax1_rate) || ! empty($localtax2_rate))) // and there is local tax + { + $localtaxtmp_array=getLocalTaxesFromRate($vatrate,0,$object->thirdparty,$mysoc); + $localtax1_type = $localtaxtmp_array[0]; + $localtax2_type = $localtaxtmp_array[2]; + } + + // retrieve global local tax + if ($localtax1_type && $localtax1ligne != 0) + $this->localtax1[$localtax1_type][$localtax1_rate]+=$localtax1ligne; + if ($localtax2_type && $localtax2ligne != 0) + $this->localtax2[$localtax2_type][$localtax2_rate]+=$localtax2ligne; + + if (($object->lines[$i]->info_bits & 0x01) == 0x01) $vatrate.='*'; + if (! isset($this->tva[$vatrate])) $this->tva[$vatrate]=''; + $this->tva[$vatrate] += $tvaligne; + + if ($posYAfterImage > $posYAfterDescription) $nexY=$posYAfterImage; + + // Add line + if (! empty($conf->global->MAIN_PDF_DASH_BETWEEN_LINES) && $i < ($nblignes - 1)) + { + $pdf->setPage($pageposafter); + $pdf->SetLineStyle(array('dash'=>'1,1','color'=>array(210,210,210))); + //$pdf->SetDrawColor(190,190,200); + $pdf->line($this->marge_gauche, $nexY+1, $this->page_largeur - $this->marge_droite, $nexY+1); + $pdf->SetLineStyle(array('dash'=>0)); + } + + $nexY+=2; // Passe espace entre les lignes + + // Detect if some page were added automatically and output _tableau for past pages + while ($pagenb < $pageposafter) + { + $pdf->setPage($pagenb); + if ($pagenb == 1) + { + $this->_tableau($pdf, $tab_top, $this->page_hauteur - $tab_top - $heightforfooter, 0, $outputlangs, 0, 1); + } + else + { + $this->_tableau($pdf, $tab_top_newpage, $this->page_hauteur - $tab_top_newpage - $heightforfooter, 0, $outputlangs, 1, 1); + } + $this->_pagefoot($pdf,$object,$outputlangs,1); + $pagenb++; + $pdf->setPage($pagenb); + $pdf->setPageOrientation('', 1, 0); // The only function to edit the bottom margin of current page to set it. + if (empty($conf->global->MAIN_PDF_DONOTREPEAT_HEAD)) $this->_pagehead($pdf, $object, 0, $outputlangs); + } + if (isset($object->lines[$i+1]->pagebreak) && $object->lines[$i+1]->pagebreak) + { + if ($pagenb == 1) + { + $this->_tableau($pdf, $tab_top, $this->page_hauteur - $tab_top - $heightforfooter, 0, $outputlangs, 0, 1); + } + else + { + $this->_tableau($pdf, $tab_top_newpage, $this->page_hauteur - $tab_top_newpage - $heightforfooter, 0, $outputlangs, 1, 1); + } + $this->_pagefoot($pdf,$object,$outputlangs,1); + // New page + $pdf->AddPage(); + if (! empty($tplidx)) $pdf->useTemplate($tplidx); + $pagenb++; + if (empty($conf->global->MAIN_PDF_DONOTREPEAT_HEAD)) $this->_pagehead($pdf, $object, 0, $outputlangs); + } + } + + // Show square + if ($pagenb == 1) + { + $this->_tableau($pdf, $tab_top, $this->page_hauteur - $tab_top - $heightforinfotot - $heightforfreetext - $heightforfooter, 0, $outputlangs, 0, 0); + $bottomlasttab=$this->page_hauteur - $heightforinfotot - $heightforfreetext - $heightforfooter + 1; + } + else + { + $this->_tableau($pdf, $tab_top_newpage, $this->page_hauteur - $tab_top_newpage - $heightforinfotot - $heightforfreetext - $heightforfooter, 0, $outputlangs, 1, 0); + $bottomlasttab=$this->page_hauteur - $heightforinfotot - $heightforfreetext - $heightforfooter + 1; + } + + // Affiche zone infos + $posy=$this->_tableau_info($pdf, $object, $bottomlasttab, $outputlangs); + + // Affiche zone totaux + $posy=$this->_tableau_tot($pdf, $object, 0, $bottomlasttab, $outputlangs); + + // Affiche zone versements + /* + if ($deja_regle || $amount_credit_notes_included || $amount_deposits_included) + { + $posy=$this->_tableau_versements($pdf, $object, $posy, $outputlangs); + } + */ + + // Pied de page + $this->_pagefoot($pdf,$object,$outputlangs); + if (method_exists($pdf,'AliasNbPages')) $pdf->AliasNbPages(); + + $pdf->Close(); + + $pdf->Output($file,'F'); + + //Add pdfgeneration hook + $hookmanager->initHooks(array('pdfgeneration')); + $parameters=array('file'=>$file,'object'=>$object,'outputlangs'=>$outputlangs); + global $action; + $reshook=$hookmanager->executeHooks('afterPDFCreation',$parameters,$this,$action); // Note that $action and $object may have been modified by some hooks + + if (! empty($conf->global->MAIN_UMASK)) + @chmod($file, octdec($conf->global->MAIN_UMASK)); + + return 1; // Pas d'erreur + } + else + { + $this->error=$langs->trans("ErrorCanNotCreateDir",$dir); + return 0; + } + } + else + { + $this->error=$langs->trans("ErrorConstantNotDefined","PROP_OUTPUTDIR"); + return 0; + } + + $this->error=$langs->trans("ErrorUnknown"); + return 0; // Erreur par defaut + } + + /** + * Show payments table + * + * @param PDF $pdf Object PDF + * @param Object $object Object proposal + * @param int $posy Position y in PDF + * @param Translate $outputlangs Object langs for output + * @return int <0 if KO, >0 if OK + */ + function _tableau_versements(&$pdf, $object, $posy, $outputlangs) + { + + } + + + /** + * Show miscellaneous information (payment mode, payment term, ...) + * + * @param PDF $pdf Object PDF + * @param Object $object Object to show + * @param int $posy Y + * @param Translate $outputlangs Langs object + * @return void + */ + function _tableau_info(&$pdf, $object, $posy, $outputlangs) + { + global $conf; + $default_font_size = pdf_getPDFFontSize($outputlangs); + + $pdf->SetFont('','', $default_font_size - 1); + + // If France, show VAT mention if not applicable + if ($this->emetteur->country_code == 'FR' && $this->franchise == 1) + { + $pdf->SetFont('','B', $default_font_size - 2); + $pdf->SetXY($this->marge_gauche, $posy); + $pdf->MultiCell(100, 3, $outputlangs->transnoentities("VATIsNotUsedForInvoice"), 0, 'L', 0); + + $posy=$pdf->GetY()+4; + } + + $posxval=52; + + // Show shipping date + if (! empty($object->date_livraison)) + { + $outputlangs->load("sendings"); + $pdf->SetFont('','B', $default_font_size - 2); + $pdf->SetXY($this->marge_gauche, $posy); + $titre = $outputlangs->transnoentities("DateDeliveryPlanned").':'; + $pdf->MultiCell(80, 4, $titre, 0, 'L'); + $pdf->SetFont('','', $default_font_size - 2); + $pdf->SetXY($posxval, $posy); + $dlp=dol_print_date($object->date_livraison,"daytext",false,$outputlangs,true); + $pdf->MultiCell(80, 4, $dlp, 0, 'L'); + + $posy=$pdf->GetY()+1; + } + elseif ($object->availability_code || $object->availability) // Show availability conditions + { + $pdf->SetFont('','B', $default_font_size - 2); + $pdf->SetXY($this->marge_gauche, $posy); + $titre = $outputlangs->transnoentities("AvailabilityPeriod").':'; + $pdf->MultiCell(80, 4, $titre, 0, 'L'); + $pdf->SetTextColor(0,0,0); + $pdf->SetFont('','', $default_font_size - 2); + $pdf->SetXY($posxval, $posy); + $lib_availability=$outputlangs->transnoentities("AvailabilityType".$object->availability_code)!=('AvailabilityType'.$object->availability_code)?$outputlangs->transnoentities("AvailabilityType".$object->availability_code):$outputlangs->convToOutputCharset($object->availability); + $lib_availability=str_replace('\n',"\n",$lib_availability); + $pdf->MultiCell(80, 4, $lib_availability, 0, 'L'); + + $posy=$pdf->GetY()+1; + } + + // Show payments conditions + if (empty($conf->global->PROPALE_PDF_HIDE_PAYMENTTERMCOND) && ($object->cond_reglement_code || $object->cond_reglement)) + { + $pdf->SetFont('','B', $default_font_size - 2); + $pdf->SetXY($this->marge_gauche, $posy); + $titre = $outputlangs->transnoentities("PaymentConditions").':'; + $pdf->MultiCell(80, 4, $titre, 0, 'L'); + + $pdf->SetFont('','', $default_font_size - 2); + $pdf->SetXY($posxval, $posy); + $lib_condition_paiement=$outputlangs->transnoentities("PaymentCondition".$object->cond_reglement_code)!=('PaymentCondition'.$object->cond_reglement_code)?$outputlangs->transnoentities("PaymentCondition".$object->cond_reglement_code):$outputlangs->convToOutputCharset($object->cond_reglement_doc); + $lib_condition_paiement=str_replace('\n',"\n",$lib_condition_paiement); + $pdf->MultiCell(80, 4, $lib_condition_paiement,0,'L'); + + $posy=$pdf->GetY()+3; + } + + if (empty($conf->global->PROPALE_PDF_HIDE_PAYMENTTERMCOND)) + { + // Check a payment mode is defined + /* Not required on a proposal + if (empty($object->mode_reglement_code) + && ! $conf->global->FACTURE_CHQ_NUMBER + && ! $conf->global->FACTURE_RIB_NUMBER) + { + $pdf->SetXY($this->marge_gauche, $posy); + $pdf->SetTextColor(200,0,0); + $pdf->SetFont('','B', $default_font_size - 2); + $pdf->MultiCell(90, 3, $outputlangs->transnoentities("ErrorNoPaiementModeConfigured"),0,'L',0); + $pdf->SetTextColor(0,0,0); + + $posy=$pdf->GetY()+1; + } + */ + + // Show payment mode + if ($object->mode_reglement_code + && $object->mode_reglement_code != 'CHQ' + && $object->mode_reglement_code != 'VIR') + { + $pdf->SetFont('','B', $default_font_size - 2); + $pdf->SetXY($this->marge_gauche, $posy); + $titre = $outputlangs->transnoentities("PaymentMode").':'; + $pdf->MultiCell(80, 5, $titre, 0, 'L'); + $pdf->SetFont('','', $default_font_size - 2); + $pdf->SetXY($posxval, $posy); + $lib_mode_reg=$outputlangs->transnoentities("PaymentType".$object->mode_reglement_code)!=('PaymentType'.$object->mode_reglement_code)?$outputlangs->transnoentities("PaymentType".$object->mode_reglement_code):$outputlangs->convToOutputCharset($object->mode_reglement); + $pdf->MultiCell(80, 5, $lib_mode_reg,0,'L'); + + $posy=$pdf->GetY()+2; + } + + // Show payment mode CHQ + if (empty($object->mode_reglement_code) || $object->mode_reglement_code == 'CHQ') + { + // Si mode reglement non force ou si force a CHQ + if (! empty($conf->global->FACTURE_CHQ_NUMBER)) + { + $diffsizetitle=(empty($conf->global->PDF_DIFFSIZE_TITLE)?3:$conf->global->PDF_DIFFSIZE_TITLE); + + if ($conf->global->FACTURE_CHQ_NUMBER > 0) + { + $account = new Account($this->db); + $account->fetch($conf->global->FACTURE_CHQ_NUMBER); + + $pdf->SetXY($this->marge_gauche, $posy); + $pdf->SetFont('','B', $default_font_size - $diffsizetitle); + $pdf->MultiCell(100, 3, $outputlangs->transnoentities('PaymentByChequeOrderedTo',$account->proprio),0,'L',0); + $posy=$pdf->GetY()+1; + + if (empty($conf->global->MAIN_PDF_HIDE_CHQ_ADDRESS)) + { + $pdf->SetXY($this->marge_gauche, $posy); + $pdf->SetFont('','', $default_font_size - $diffsizetitle); + $pdf->MultiCell(100, 3, $outputlangs->convToOutputCharset($account->owner_address), 0, 'L', 0); + $posy=$pdf->GetY()+2; + } + } + if ($conf->global->FACTURE_CHQ_NUMBER == -1) + { + $pdf->SetXY($this->marge_gauche, $posy); + $pdf->SetFont('','B', $default_font_size - $diffsizetitle); + $pdf->MultiCell(100, 3, $outputlangs->transnoentities('PaymentByChequeOrderedTo',$this->emetteur->name),0,'L',0); + $posy=$pdf->GetY()+1; + + if (empty($conf->global->MAIN_PDF_HIDE_CHQ_ADDRESS)) + { + $pdf->SetXY($this->marge_gauche, $posy); + $pdf->SetFont('','', $default_font_size - $diffsizetitle); + $pdf->MultiCell(100, 3, $outputlangs->convToOutputCharset($this->emetteur->getFullAddress()), 0, 'L', 0); + $posy=$pdf->GetY()+2; + } + } + } + } + + // If payment mode not forced or forced to VIR, show payment with BAN + if (empty($object->mode_reglement_code) || $object->mode_reglement_code == 'VIR') + { + if (! empty($object->fk_bank) || ! empty($conf->global->FACTURE_RIB_NUMBER)) + { + $bankid=(empty($object->fk_bank)?$conf->global->FACTURE_RIB_NUMBER:$object->fk_bank); + $account = new Account($this->db); + $account->fetch($bankid); + + $curx=$this->marge_gauche; + $cury=$posy; + + $posy=pdf_bank($pdf,$outputlangs,$curx,$cury,$account,0,$default_font_size); + + $posy+=2; + } + } + } + + return $posy; + } + + + /** + * Show total to pay + * + * @param PDF $pdf Object PDF + * @param Facture $object Object invoice + * @param int $deja_regle Montant deja regle + * @param int $posy Position depart + * @param Translate $outputlangs Objet langs + * @return int Position pour suite + */ + function _tableau_tot(&$pdf, $object, $deja_regle, $posy, $outputlangs) + { + global $conf,$mysoc; + $default_font_size = pdf_getPDFFontSize($outputlangs); + + $tab2_top = $posy; + $tab2_hl = 4; + $pdf->SetFont('','', $default_font_size - 1); + + // Tableau total + $col1x = 120; $col2x = 170; + if ($this->page_largeur < 210) // To work with US executive format + { + $col2x-=20; + } + $largcol2 = ($this->page_largeur - $this->marge_droite - $col2x); + + $useborder=0; + $index = 0; + + // Total HT + $pdf->SetFillColor(255,255,255); + $pdf->SetXY($col1x, $tab2_top + 0); + $pdf->MultiCell($col2x-$col1x, $tab2_hl, $outputlangs->transnoentities("TotalHT"), 0, 'L', 1); + + $pdf->SetXY($col2x, $tab2_top + 0); + $pdf->MultiCell($largcol2, $tab2_hl, price($object->total_ht + (! empty($object->remise)?$object->remise:0), 0, $outputlangs), 0, 'R', 1); + + // Show VAT by rates and total + $pdf->SetFillColor(248,248,248); + + $this->atleastoneratenotnull=0; + if (empty($conf->global->MAIN_GENERATE_DOCUMENTS_WITHOUT_VAT)) + { + $tvaisnull=((! empty($this->tva) && count($this->tva) == 1 && isset($this->tva['0.000']) && is_float($this->tva['0.000'])) ? true : false); + if (! empty($conf->global->MAIN_GENERATE_DOCUMENTS_WITHOUT_VAT_ISNULL) && $tvaisnull) + { + // Nothing to do + } + else + { + //Local tax 1 before VAT + //if (! empty($conf->global->FACTURE_LOCAL_TAX1_OPTION) && $conf->global->FACTURE_LOCAL_TAX1_OPTION=='localtax1on') + //{ + foreach( $this->localtax1 as $localtax_type => $localtax_rate ) + { + if (in_array((string) $localtax_type, array('1','3','5'))) continue; + + foreach( $localtax_rate as $tvakey => $tvaval ) + { + if ($tvakey!=0) // On affiche pas taux 0 + { + //$this->atleastoneratenotnull++; + + $index++; + $pdf->SetXY($col1x, $tab2_top + $tab2_hl * $index); + + $tvacompl=''; + if (preg_match('/\*/',$tvakey)) + { + $tvakey=str_replace('*','',$tvakey); + $tvacompl = " (".$outputlangs->transnoentities("NonPercuRecuperable").")"; + } + $totalvat = $outputlangs->transcountrynoentities("TotalLT1",$mysoc->country_code).' '; + $totalvat.=vatrate(abs($tvakey),1).$tvacompl; + $pdf->MultiCell($col2x-$col1x, $tab2_hl, $totalvat, 0, 'L', 1); + + $pdf->SetXY($col2x, $tab2_top + $tab2_hl * $index); + $pdf->MultiCell($largcol2, $tab2_hl, price($tvaval, 0, $outputlangs), 0, 'R', 1); + } + } + } + //} + //Local tax 2 before VAT + //if (! empty($conf->global->FACTURE_LOCAL_TAX2_OPTION) && $conf->global->FACTURE_LOCAL_TAX2_OPTION=='localtax2on') + //{ + foreach( $this->localtax2 as $localtax_type => $localtax_rate ) + { + if (in_array((string) $localtax_type, array('1','3','5'))) continue; + + foreach( $localtax_rate as $tvakey => $tvaval ) + { + if ($tvakey!=0) // On affiche pas taux 0 + { + //$this->atleastoneratenotnull++; + + + + $index++; + $pdf->SetXY($col1x, $tab2_top + $tab2_hl * $index); + + $tvacompl=''; + if (preg_match('/\*/',$tvakey)) + { + $tvakey=str_replace('*','',$tvakey); + $tvacompl = " (".$outputlangs->transnoentities("NonPercuRecuperable").")"; + } + $totalvat = $outputlangs->transcountrynoentities("TotalLT2", $mysoc->country_code).' '; + $totalvat.=vatrate(abs($tvakey),1).$tvacompl; + $pdf->MultiCell($col2x-$col1x, $tab2_hl, $totalvat, 0, 'L', 1); + + $pdf->SetXY($col2x, $tab2_top + $tab2_hl * $index); + $pdf->MultiCell($largcol2, $tab2_hl, price($tvaval, 0, $outputlangs), 0, 'R', 1); + + } + } + } + //} + // VAT + foreach($this->tva as $tvakey => $tvaval) + { + if ($tvakey > 0) // On affiche pas taux 0 + { + $this->atleastoneratenotnull++; + + $index++; + $pdf->SetXY($col1x, $tab2_top + $tab2_hl * $index); + + $tvacompl=''; + if (preg_match('/\*/',$tvakey)) + { + $tvakey=str_replace('*','',$tvakey); + $tvacompl = " (".$outputlangs->transnoentities("NonPercuRecuperable").")"; + } + $totalvat =$outputlangs->transnoentities("TotalVAT").' '; + $totalvat.=vatrate($tvakey,1).$tvacompl; + $pdf->MultiCell($col2x-$col1x, $tab2_hl, $totalvat, 0, 'L', 1); + + $pdf->SetXY($col2x, $tab2_top + $tab2_hl * $index); + $pdf->MultiCell($largcol2, $tab2_hl, price($tvaval, 0, $outputlangs), 0, 'R', 1); + } + } + + //Local tax 1 after VAT + //if (! empty($conf->global->FACTURE_LOCAL_TAX1_OPTION) && $conf->global->FACTURE_LOCAL_TAX1_OPTION=='localtax1on') + //{ + foreach( $this->localtax1 as $localtax_type => $localtax_rate ) + { + if (in_array((string) $localtax_type, array('2','4','6'))) continue; + + foreach( $localtax_rate as $tvakey => $tvaval ) + { + if ($tvakey != 0) // On affiche pas taux 0 + { + //$this->atleastoneratenotnull++; + + $index++; + $pdf->SetXY($col1x, $tab2_top + $tab2_hl * $index); + + $tvacompl=''; + if (preg_match('/\*/',$tvakey)) + { + $tvakey=str_replace('*','',$tvakey); + $tvacompl = " (".$outputlangs->transnoentities("NonPercuRecuperable").")"; + } + $totalvat = $outputlangs->transcountrynoentities("TotalLT1",$mysoc->country_code).' '; + + $totalvat.=vatrate(abs($tvakey),1).$tvacompl; + $pdf->MultiCell($col2x-$col1x, $tab2_hl, $totalvat, 0, 'L', 1); + $pdf->SetXY($col2x, $tab2_top + $tab2_hl * $index); + $pdf->MultiCell($largcol2, $tab2_hl, price($tvaval, 0, $outputlangs), 0, 'R', 1); + } + } + } + //} + //Local tax 2 after VAT + //if (! empty($conf->global->FACTURE_LOCAL_TAX2_OPTION) && $conf->global->FACTURE_LOCAL_TAX2_OPTION=='localtax2on') + //{ + foreach( $this->localtax2 as $localtax_type => $localtax_rate ) + { + if (in_array((string) $localtax_type, array('2','4','6'))) continue; + + foreach( $localtax_rate as $tvakey => $tvaval ) + { + // retrieve global local tax + if ($tvakey != 0) // On affiche pas taux 0 + { + //$this->atleastoneratenotnull++; + + $index++; + $pdf->SetXY($col1x, $tab2_top + $tab2_hl * $index); + + $tvacompl=''; + if (preg_match('/\*/',$tvakey)) + { + $tvakey=str_replace('*','',$tvakey); + $tvacompl = " (".$outputlangs->transnoentities("NonPercuRecuperable").")"; + } + $totalvat = $outputlangs->transcountrynoentities("TotalLT2",$mysoc->country_code).' '; + + $totalvat.=vatrate(abs($tvakey),1).$tvacompl; + $pdf->MultiCell($col2x-$col1x, $tab2_hl, $totalvat, 0, 'L', 1); + + $pdf->SetXY($col2x, $tab2_top + $tab2_hl * $index); + $pdf->MultiCell($largcol2, $tab2_hl, price($tvaval, 0, $outputlangs), 0, 'R', 1); + } + } + } + //} + + // Total TTC + $index++; + $pdf->SetXY($col1x, $tab2_top + $tab2_hl * $index); + $pdf->SetTextColor(0,0,60); + $pdf->SetFillColor(224,224,224); + $pdf->MultiCell($col2x-$col1x, $tab2_hl, $outputlangs->transnoentities("TotalTTC"), $useborder, 'L', 1); + + $pdf->SetXY($col2x, $tab2_top + $tab2_hl * $index); + $pdf->MultiCell($largcol2, $tab2_hl, price($object->total_ttc, 0, $outputlangs), $useborder, 'R', 1); + } + } + + $pdf->SetTextColor(0,0,0); + + /* + $resteapayer = $object->total_ttc - $deja_regle; + if (! empty($object->paye)) $resteapayer=0; + */ + + if ($deja_regle > 0) + { + $index++; + + $pdf->SetXY($col1x, $tab2_top + $tab2_hl * $index); + $pdf->MultiCell($col2x-$col1x, $tab2_hl, $outputlangs->transnoentities("AlreadyPaid"), 0, 'L', 0); + + $pdf->SetXY($col2x, $tab2_top + $tab2_hl * $index); + $pdf->MultiCell($largcol2, $tab2_hl, price($deja_regle, 0, $outputlangs), 0, 'R', 0); + + /* + if ($object->close_code == 'discount_vat') + { + $index++; + $pdf->SetFillColor(255,255,255); + + $pdf->SetXY($col1x, $tab2_top + $tab2_hl * $index); + $pdf->MultiCell($col2x-$col1x, $tab2_hl, $outputlangs->transnoentities("EscompteOffered"), $useborder, 'L', 1); + + $pdf->SetXY($col2x, $tab2_top + $tab2_hl * $index); + $pdf->MultiCell($largcol2, $tab2_hl, price($object->total_ttc - $deja_regle, 0, $outputlangs), $useborder, 'R', 1); + + $resteapayer=0; + } + */ + + $index++; + $pdf->SetTextColor(0,0,60); + $pdf->SetFillColor(224,224,224); + $pdf->SetXY($col1x, $tab2_top + $tab2_hl * $index); + $pdf->MultiCell($col2x-$col1x, $tab2_hl, $outputlangs->transnoentities("RemainderToPay"), $useborder, 'L', 1); + + $pdf->SetXY($col2x, $tab2_top + $tab2_hl * $index); + $pdf->MultiCell($largcol2, $tab2_hl, price($resteapayer, 0, $outputlangs), $useborder, 'R', 1); + + $pdf->SetFont('','', $default_font_size - 1); + $pdf->SetTextColor(0,0,0); + } + + $index++; + return ($tab2_top + ($tab2_hl * $index)); + } + + /** + * Show table for lines + * + * @param PDF $pdf Object PDF + * @param string $tab_top Top position of table + * @param string $tab_height Height of table (rectangle) + * @param int $nexY Y (not used) + * @param Translate $outputlangs Langs object + * @param int $hidetop 1=Hide top bar of array and title, 0=Hide nothing, -1=Hide only title + * @param int $hidebottom Hide bottom bar of array + * @return void + */ + function _tableau(&$pdf, $tab_top, $tab_height, $nexY, $outputlangs, $hidetop=0, $hidebottom=0) + { + global $conf; + + // Force to disable hidetop and hidebottom + $hidebottom=0; + if ($hidetop) $hidetop=-1; + + $default_font_size = pdf_getPDFFontSize($outputlangs); + + // Amount in (at tab_top - 1) + $pdf->SetTextColor(0,0,0); + $pdf->SetFont('','',$default_font_size - 2); + + if (empty($hidetop)) + { + $titre = $outputlangs->transnoentities("AmountInCurrency",$outputlangs->transnoentitiesnoconv("Currency".$conf->currency)); + $pdf->SetXY($this->page_largeur - $this->marge_droite - ($pdf->GetStringWidth($titre) + 3), $tab_top-4); + $pdf->MultiCell(($pdf->GetStringWidth($titre) + 3), 2, $titre); + + //$conf->global->MAIN_PDF_TITLE_BACKGROUND_COLOR='230,230,230'; + if (! empty($conf->global->MAIN_PDF_TITLE_BACKGROUND_COLOR)) $pdf->Rect($this->marge_gauche, $tab_top, $this->page_largeur-$this->marge_droite-$this->marge_gauche, 5, 'F', null, explode(',',$conf->global->MAIN_PDF_TITLE_BACKGROUND_COLOR)); + } + + $pdf->SetDrawColor(128,128,128); + $pdf->SetFont('','',$default_font_size - 1); + + // Output Rect + $this->printRect($pdf,$this->marge_gauche, $tab_top, $this->page_largeur-$this->marge_gauche-$this->marge_droite, $tab_height, $hidetop, $hidebottom); // Rect prend une longueur en 3eme param et 4eme param + + if (empty($hidetop)) + { + $pdf->line($this->marge_gauche, $tab_top+5, $this->page_largeur-$this->marge_droite, $tab_top+5); // line prend une position y en 2eme param et 4eme param + + $pdf->SetXY($this->posxdesc-1, $tab_top+1); + $pdf->MultiCell(108,2, $outputlangs->transnoentities("Designation"),'','L'); + } + + if (! empty($conf->global->MAIN_GENERATE_PROPOSALS_WITH_PICTURE)) + { + $pdf->line($this->posxpicture-1, $tab_top, $this->posxpicture-1, $tab_top + $tab_height); + if (empty($hidetop)) + { + //$pdf->SetXY($this->posxpicture-1, $tab_top+1); + //$pdf->MultiCell($this->posxtva-$this->posxpicture-1,2, $outputlangs->transnoentities("Photo"),'','C'); + } + } + + if (empty($conf->global->MAIN_GENERATE_DOCUMENTS_WITHOUT_VAT)) + { + $pdf->line($this->posxtva-1, $tab_top, $this->posxtva-1, $tab_top + $tab_height); + if (empty($hidetop)) + { + $pdf->SetXY($this->posxtva-3, $tab_top+1); + $pdf->MultiCell($this->posxup-$this->posxtva+3,2, $outputlangs->transnoentities("VAT"),'','C'); + } + } + + $pdf->line($this->posxup-1, $tab_top, $this->posxup-1, $tab_top + $tab_height); + if (empty($hidetop)) + { + $pdf->SetXY($this->posxup-1, $tab_top+1); + $pdf->MultiCell($this->posxqty-$this->posxup-1,2, $outputlangs->transnoentities("PriceUHT"),'','C'); + } + + $pdf->line($this->posxqty-1, $tab_top, $this->posxqty-1, $tab_top + $tab_height); + if (empty($hidetop)) + { + $pdf->SetXY($this->posxqty-1, $tab_top+1); + $pdf->MultiCell($this->posxdiscount-$this->posxqty-1,2, $outputlangs->transnoentities("Qty"),'','C'); + } + + $pdf->line($this->posxdiscount-1, $tab_top, $this->posxdiscount-1, $tab_top + $tab_height); + if (empty($hidetop)) + { + if ($this->atleastonediscount) + { + $pdf->SetXY($this->posxdiscount-1, $tab_top+1); + $pdf->MultiCell($this->postotalht-$this->posxdiscount+1,2, $outputlangs->transnoentities("ReductionShort"),'','C'); + } + } + if ($this->atleastonediscount) + { + $pdf->line($this->postotalht, $tab_top, $this->postotalht, $tab_top + $tab_height); + } + if (empty($hidetop)) + { + $pdf->SetXY($this->postotalht-1, $tab_top+1); + $pdf->MultiCell(30,2, $outputlangs->transnoentities("TotalHT"),'','C'); + } + } + + /** + * Show top header of page. + * + * @param PDF $pdf Object PDF + * @param Object $object Object to show + * @param int $showaddress 0=no, 1=yes + * @param Translate $outputlangs Object lang for output + * @return void + */ + function _pagehead(&$pdf, $object, $showaddress, $outputlangs) + { + global $conf,$langs; + + $outputlangs->load("main"); + $outputlangs->load("bills"); + $outputlangs->load("propal"); + $outputlangs->load("companies"); + + $default_font_size = pdf_getPDFFontSize($outputlangs); + + pdf_pagehead($pdf,$outputlangs,$this->page_hauteur); + + // Show Draft Watermark + if($object->statut==0 && (! empty($conf->global->PROPALE_DRAFT_WATERMARK)) ) + { + pdf_watermark($pdf,$outputlangs,$this->page_hauteur,$this->page_largeur,'mm',$conf->global->PROPALE_DRAFT_WATERMARK); + } + + $pdf->SetTextColor(0,0,60); + $pdf->SetFont('','B', $default_font_size + 3); + + $posy=$this->marge_haute; + $posx=$this->page_largeur-$this->marge_droite-100; + + $pdf->SetXY($this->marge_gauche,$posy); + + // Logo + $logo=$conf->mycompany->dir_output.'/logos/'.$this->emetteur->logo; + if ($this->emetteur->logo) + { + if (is_readable($logo)) + { + $height=pdf_getHeightForLogo($logo); + $pdf->Image($logo, $this->marge_gauche, $posy, 0, $height); // width=0 (auto) + } + else + { + $pdf->SetTextColor(200,0,0); + $pdf->SetFont('','B',$default_font_size - 2); + $pdf->MultiCell(100, 3, $outputlangs->transnoentities("ErrorLogoFileNotFound",$logo), 0, 'L'); + $pdf->MultiCell(100, 3, $outputlangs->transnoentities("ErrorGoToGlobalSetup"), 0, 'L'); + } + } + else + { + $text=$this->emetteur->name; + $pdf->MultiCell(100, 4, $outputlangs->convToOutputCharset($text), 0, 'L'); + } + + $pdf->SetFont('','B',$default_font_size + 3); + $pdf->SetXY($posx,$posy); + $pdf->SetTextColor(0,0,60); + $title=$outputlangs->transnoentities("CommercialProposal"); + $pdf->MultiCell(100, 4, $title, '', 'R'); + + $pdf->SetFont('','B',$default_font_size); + + $posy+=5; + $pdf->SetXY($posx,$posy); + $pdf->SetTextColor(0,0,60); + $pdf->MultiCell(100, 4, $outputlangs->transnoentities("Ref")." : " . $outputlangs->convToOutputCharset($object->ref), '', 'R'); + + $posy+=1; + $pdf->SetFont('','', $default_font_size - 2); + + if ($object->ref_client) + { + $posy+=4; + $pdf->SetXY($posx,$posy); + $pdf->SetTextColor(0,0,60); + $pdf->MultiCell(100, 3, $outputlangs->transnoentities("RefCustomer")." : " . $outputlangs->convToOutputCharset($object->ref_client), '', 'R'); + } + + $posy+=4; + $pdf->SetXY($posx,$posy); + $pdf->SetTextColor(0,0,60); + $pdf->MultiCell(100, 3, $outputlangs->transnoentities("Date")." : " . dol_print_date($object->date,"day",false,$outputlangs,true), '', 'R'); + + $posy+=4; + $pdf->SetXY($posx,$posy); + $pdf->SetTextColor(0,0,60); + $pdf->MultiCell(100, 3, $outputlangs->transnoentities("DateEndPropal")." : " . dol_print_date($object->fin_validite,"day",false,$outputlangs,true), '', 'R'); + + if ($object->client->code_client) + { + $posy+=4; + $pdf->SetXY($posx,$posy); + $pdf->SetTextColor(0,0,60); + $pdf->MultiCell(100, 3, $outputlangs->transnoentities("CustomerCode")." : " . $outputlangs->transnoentities($object->client->code_client), '', 'R'); + } + + $posy+=2; + + // Show list of linked objects + $posy = pdf_writeLinkedObjects($pdf, $object, $outputlangs, $posx, $posy, 100, 3, 'R', $default_font_size); + + if ($showaddress) + { + // Sender properties + $carac_emetteur=''; + // Add internal contact of proposal if defined + $arrayidcontact=$object->getIdContact('internal','SALESREPFOLL'); + if (count($arrayidcontact) > 0) + { + $object->fetch_user($arrayidcontact[0]); + $carac_emetteur .= ($carac_emetteur ? "\n" : '' ).$outputlangs->transnoentities("Name").": ".$outputlangs->convToOutputCharset($object->user->getFullName($outputlangs))."\n"; + } + + $carac_emetteur .= pdf_build_address($outputlangs, $this->emetteur, $object->client); + + // Show sender + $posy=42; + $posx=$this->marge_gauche; + if (! empty($conf->global->MAIN_INVERT_SENDER_RECIPIENT)) $posx=$this->page_largeur-$this->marge_droite-80; + $hautcadre=40; + + // Show sender frame + $pdf->SetTextColor(0,0,0); + $pdf->SetFont('','', $default_font_size - 2); + $pdf->SetXY($posx,$posy-5); + $pdf->MultiCell(66,5, $outputlangs->transnoentities("BillFrom").":", 0, 'L'); + $pdf->SetXY($posx,$posy); + $pdf->SetFillColor(230,230,230); + $pdf->MultiCell(82, $hautcadre, "", 0, 'R', 1); + $pdf->SetTextColor(0,0,60); + + // Show sender name + $pdf->SetXY($posx+2,$posy+3); + $pdf->SetFont('','B', $default_font_size); + $pdf->MultiCell(80, 4, $outputlangs->convToOutputCharset($this->emetteur->name), 0, 'L'); + $posy=$pdf->getY(); + + // Show sender information + $pdf->SetXY($posx+2,$posy); + $pdf->SetFont('','', $default_font_size - 1); + $pdf->MultiCell(80, 4, $carac_emetteur, 0, 'L'); + + + // If CUSTOMER contact defined, we use it + $usecontact=false; + $arrayidcontact=$object->getIdContact('external','CUSTOMER'); + if (count($arrayidcontact) > 0) + { + $usecontact=true; + $result=$object->fetch_contact($arrayidcontact[0]); + } + + // Recipient name + if (! empty($usecontact)) + { + // On peut utiliser le nom de la societe du contact + if (! empty($conf->global->MAIN_USE_COMPANY_NAME_OF_CONTACT)) $socname = $object->contact->socname; + else $socname = $object->client->name; + $carac_client_name=$outputlangs->convToOutputCharset($socname); + } + else + { + $carac_client_name=$outputlangs->convToOutputCharset($object->client->name); + } + + $carac_client=pdf_build_address($outputlangs,$this->emetteur,$object->client,($usecontact?$object->contact:''),$usecontact,'target'); + + // Show recipient + $widthrecbox=100; + if ($this->page_largeur < 210) $widthrecbox=84; // To work with US executive format + $posy=42; + $posx=$this->page_largeur-$this->marge_droite-$widthrecbox; + if (! empty($conf->global->MAIN_INVERT_SENDER_RECIPIENT)) $posx=$this->marge_gauche; + + // Show recipient frame + $pdf->SetTextColor(0,0,0); + $pdf->SetFont('','', $default_font_size - 2); + $pdf->SetXY($posx+2,$posy-5); + $pdf->MultiCell($widthrecbox, 5, $outputlangs->transnoentities("BillTo").":", 0, 'L'); + $pdf->Rect($posx, $posy, $widthrecbox, $hautcadre); + + // Show recipient name + $pdf->SetXY($posx+2,$posy+3); + $pdf->SetFont('','B', $default_font_size); + $pdf->MultiCell($widthrecbox, 4, $carac_client_name, 0, 'L'); + + // Show recipient information + $pdf->SetFont('','', $default_font_size - 1); + $pdf->SetXY($posx+2,$posy+4+(dol_nboflines_bis($carac_client_name,50)*4)); + $pdf->MultiCell($widthrecbox, 4, $carac_client, 0, 'L'); + } + + $pdf->SetTextColor(0,0,0); + } + + /** + * Show footer of page. Need this->emetteur object + * + * @param PDF $pdf PDF + * @param Object $object Object to show + * @param Translate $outputlangs Object lang for output + * @param int $hidefreetext 1=Hide free text + * @return int Return height of bottom margin including footer text + */ + function _pagefoot(&$pdf,$object,$outputlangs,$hidefreetext=0) + { + $showdetails=0; + return pdf_pagefoot($pdf,$outputlangs,'PROPALE_FREE_TEXT',$this->emetteur,$this->marge_basse,$this->marge_gauche,$this->page_hauteur,$object,$showdetails,$hidefreetext); + } + +} + diff --git a/htdocs/core/modules/askpricesupplier/index.html b/htdocs/core/modules/askpricesupplier/index.html new file mode 100644 index 00000000000..e69de29bb2d diff --git a/htdocs/core/modules/askpricesupplier/mod_propale_marbre.php b/htdocs/core/modules/askpricesupplier/mod_propale_marbre.php new file mode 100644 index 00000000000..28260de97d8 --- /dev/null +++ b/htdocs/core/modules/askpricesupplier/mod_propale_marbre.php @@ -0,0 +1,153 @@ + + * Copyright (C) 2005-2012 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 3 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, see . + * or see http://www.gnu.org/ + */ + +/** + * \file htdocs/core/modules/propale/mod_propale_marbre.php + * \ingroup propale + * \brief File of class to manage commercial proposal numbering rules Marbre + */ + +require_once DOL_DOCUMENT_ROOT .'/core/modules/propale/modules_propale.php'; + + +/** + * Class to manage customer order numbering rules Marbre + */ +class mod_propale_marbre extends ModeleNumRefPropales +{ + var $version='dolibarr'; // 'development', 'experimental', 'dolibarr' + var $prefix='PR'; + var $error=''; + var $nom = "Marbre"; + + + /** + * Return description of numbering module + * + * @return string Text with description + */ + function info() + { + global $langs; + return $langs->trans("SimpleNumRefModelDesc",$this->prefix); + } + + + /** + * Return an example of numbering module values + * + * @return string Example + */ + function getExample() + { + return $this->prefix."0501-0001"; + } + + + /** + * Test si les numeros deje en vigueur dans la base ne provoquent pas de + * de conflits qui empechera cette numerotation de fonctionner. + * + * @return boolean false si conflit, true si ok + */ + function canBeActivated() + { + global $conf,$langs,$db; + + $pryymm=''; $max=''; + + $posindice=8; + $sql = "SELECT MAX(CAST(SUBSTRING(ref FROM ".$posindice.") AS SIGNED)) as max"; + $sql.= " FROM ".MAIN_DB_PREFIX."propal"; + $sql.= " WHERE ref LIKE '".$this->prefix."____-%'"; + $sql.= " AND entity = ".$conf->entity; + + $resql=$db->query($sql); + if ($resql) + { + $row = $db->fetch_row($resql); + if ($row) { $pryymm = substr($row[0],0,6); $max=$row[0]; } + } + + if (! $pryymm || preg_match('/'.$this->prefix.'[0-9][0-9][0-9][0-9]/i',$pryymm)) + { + return true; + } + else + { + $langs->load("errors"); + $this->error=$langs->trans('ErrorNumRefModel',$max); + return false; + } + } + + /** + * Return next value + * + * @param Societe $objsoc Object third party + * @param Propal $propal Object commercial proposal + * @return string Next value + */ + function getNextValue($objsoc,$propal) + { + global $db,$conf; + + // D'abord on recupere la valeur max + $posindice=8; + $sql = "SELECT MAX(CAST(SUBSTRING(ref FROM ".$posindice.") AS SIGNED)) as max"; // This is standard SQL + $sql.= " FROM ".MAIN_DB_PREFIX."propal"; + $sql.= " WHERE ref LIKE '".$this->prefix."____-%'"; + $sql.= " AND entity = ".$conf->entity; + + $resql=$db->query($sql); + if ($resql) + { + $obj = $db->fetch_object($resql); + if ($obj) $max = intval($obj->max); + else $max=0; + } + else + { + dol_syslog(get_class($this)."::getNextValue", LOG_DEBUG); + return -1; + } + + $date = time(); + $yymm = strftime("%y%m",$date); + + if ($max >= (pow(10, 4) - 1)) $num=$max+1; // If counter > 9999, we do not format on 4 chars, we take number as it is + else $num = sprintf("%04s",$max+1); + + dol_syslog(get_class($this)."::getNextValue return ".$this->prefix.$yymm."-".$num); + return $this->prefix.$yymm."-".$num; + } + + /** + * Return next free value + * + * @param Societe $objsoc Object third party + * @param Object $objforref Object for number to search + * @return string Next free value + */ + function getNumRef($objsoc,$objforref) + { + return $this->getNextValue($objsoc,$objforref); + } + +} diff --git a/htdocs/core/modules/askpricesupplier/mod_propale_saphir.php b/htdocs/core/modules/askpricesupplier/mod_propale_saphir.php new file mode 100644 index 00000000000..503d8754684 --- /dev/null +++ b/htdocs/core/modules/askpricesupplier/mod_propale_saphir.php @@ -0,0 +1,131 @@ + + * Copyright (C) 2004-2010 Laurent Destailleur + * Copyright (C) 2005-2007 Regis Houssin + * Copyright (C) 2008 Raphael Bertrand (Resultic) + * + * 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 3 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, see . + * or see http://www.gnu.org/ + */ + +/** + * \file htdocs/core/modules/propale/mod_propale_saphir.php + * \ingroup propale + * \brief File that contains the numbering module rules Saphir + */ + +require_once DOL_DOCUMENT_ROOT .'/core/modules/propale/modules_propale.php'; + + +/** + * Class of file that contains the numbering module rules Saphir + */ +class mod_propale_saphir extends ModeleNumRefPropales +{ + var $version='dolibarr'; // 'development', 'experimental', 'dolibarr' + var $error = ''; + var $nom = 'Saphir'; + + + /** + * Return description of module + * + * @return string Texte descripif + */ + function info() + { + global $conf,$langs; + + $langs->load("bills"); + + $form = new Form($this->db); + + $texte = $langs->trans('GenericNumRefModelDesc')."
\n"; + $texte.= '
'; + $texte.= ''; + $texte.= ''; + $texte.= ''; + $texte.= ''; + + $tooltip=$langs->trans("GenericMaskCodes",$langs->transnoentities("Proposal"),$langs->transnoentities("Proposal")); + $tooltip.=$langs->trans("GenericMaskCodes2"); + $tooltip.=$langs->trans("GenericMaskCodes3"); + $tooltip.=$langs->trans("GenericMaskCodes4a",$langs->transnoentities("Proposal"),$langs->transnoentities("Proposal")); + $tooltip.=$langs->trans("GenericMaskCodes5"); + + // Parametrage du prefix + $texte.= ''; + $texte.= ''; + + $texte.= ''; + + $texte.= ''; + + $texte.= '
'.$langs->trans("Mask").':'.$form->textwithpicto('',$tooltip,1,1).' 
'; + $texte.= '
'; + + return $texte; + } + + /** + * Renvoi un exemple de numerotation + * + * @return string Example + */ + function getExample() + { + global $conf,$langs,$mysoc; + + $old_code_client=$mysoc->code_client; + $mysoc->code_client='CCCCCCCCCC'; + $numExample = $this->getNextValue($mysoc,''); + $mysoc->code_client=$old_code_client; + + if (! $numExample) + { + $numExample = 'NotConfigured'; + } + return $numExample; + } + + /** + * Return next value + * + * @param Societe $objsoc Object third party + * @param Propal $propal Object commercial proposal + * @return string Value if OK, 0 if KO + */ + function getNextValue($objsoc,$propal) + { + global $db,$conf; + + require_once DOL_DOCUMENT_ROOT .'/core/lib/functions2.lib.php'; + + // On defini critere recherche compteur + $mask=$conf->global->PROPALE_SAPHIR_MASK; + + if (! $mask) + { + $this->error='NotConfigured'; + return 0; + } + + $date=$propal->datep; + $customercode=$objsoc->code_client; + $numFinal=get_next_value($db,$mask,'propal','ref','',$customercode,$date); + + return $numFinal; + } + +} diff --git a/htdocs/core/modules/askpricesupplier/modules_askpricesupplier.php b/htdocs/core/modules/askpricesupplier/modules_askpricesupplier.php new file mode 100644 index 00000000000..68465c20512 --- /dev/null +++ b/htdocs/core/modules/askpricesupplier/modules_askpricesupplier.php @@ -0,0 +1,165 @@ + + * Copyright (C) 2004-2012 Laurent Destailleur + * Copyright (C) 2005-2012 Regis Houssin + * Copyright (C) 2012 Juanjo Menent + * Copyright (C) 2014 Marcos García + * + * 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 3 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, see . + * or see http://www.gnu.org/ + */ + +/** + * \file htdocs/core/modules/propale/modules_propale.php + * \ingroup propale + * \brief Fichier contenant la classe mere de generation des propales en PDF + * et la classe mere de numerotation des propales + */ + +require_once DOL_DOCUMENT_ROOT.'/core/class/commondocgenerator.class.php'; +require_once DOL_DOCUMENT_ROOT.'/compta/bank/class/account.class.php'; // Requis car utilise dans les classes qui heritent + + +/** + * Classe mere des modeles de propale + */ +abstract class ModelePDFAskPriceSupplier extends CommonDocGenerator +{ + var $error=''; + + + /** + * Return list of active generation modules + * + * @param DoliDB $db Database handler + * @param string $maxfilenamelength Max length of value to show + * @return array List of templates + */ + static function liste_modeles($db,$maxfilenamelength=0) + { + global $conf; + + $type='askpricesupplier'; + $liste=array(); + + include_once DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php'; + $liste=getListOfModels($db,$type,$maxfilenamelength); + + return $liste; + } +} + + +/** + * Classe mere des modeles de numerotation des references de propales + */ +abstract class ModeleNumRefPropales +{ + var $error=''; + + /** + * Return if a module can be used or not + * + * @return boolean true if module can be used + */ + function isEnabled() + { + return true; + } + + /** + * Renvoi la description par defaut du modele de numerotation + * + * @return string Texte descripif + */ + function info() + { + global $langs; + $langs->load("propale"); + return $langs->trans("NoDescription"); + } + + /** + * Renvoi un exemple de numerotation + * + * @return string Example + */ + function getExample() + { + global $langs; + $langs->load("propale"); + return $langs->trans("NoExample"); + } + + /** + * Test si les numeros deja en vigueur dans la base ne provoquent pas de + * de conflits qui empechera cette numerotation de fonctionner. + * + * @return boolean false si conflit, true si ok + */ + function canBeActivated() + { + return true; + } + + /** + * Renvoi prochaine valeur attribuee + * + * @param Societe $objsoc Object third party + * @param Propal $propal Object commercial proposal + * @return string Valeur + */ + function getNextValue($objsoc,$propal) + { + global $langs; + return $langs->trans("NotAvailable"); + } + + /** + * Renvoi version du module numerotation + * + * @return string Valeur + */ + function getVersion() + { + global $langs; + $langs->load("admin"); + + if ($this->version == 'development') return $langs->trans("VersionDevelopment"); + if ($this->version == 'experimental') return $langs->trans("VersionExperimental"); + if ($this->version == 'dolibarr') return DOL_VERSION; + if ($this->version) return $this->version; + return $langs->trans("NotAvailable"); + } +} + + +/** + * Create a document onto disk according to template module. + * + * @param DoliDB $db Database handler + * @param object $object Object proposal + * @param string $modele Force model to use ('' to not force) + * @param Translate $outputlangs Object langs to use for output + * @param int $hidedetails Hide details of lines + * @param int $hidedesc Hide description + * @param int $hideref Hide ref + * @return int 0 if KO, 1 if OK + * @deprecated Use the new function generateDocument of Propal class + */ +function propale_pdf_create(DoliDB $db, Propal $object, $modele, $outputlangs, $hidedetails=0, $hidedesc=0, $hideref=0) +{ + return $object->generateDocument($modele, $outputlangs, $hidedetails, $hidedesc, $hideref); +} + diff --git a/htdocs/core/modules/modAskPriceSupplier.class.php b/htdocs/core/modules/modAskPriceSupplier.class.php index 1c108c572d1..92906ba7ae7 100644 --- a/htdocs/core/modules/modAskPriceSupplier.class.php +++ b/htdocs/core/modules/modAskPriceSupplier.class.php @@ -73,12 +73,32 @@ class modAskPriceSupplier extends DolibarrModules $this->const = array(); $r=0; - /*$this->const[$r][0] = "PROPALE_ADDON_PDF"; + $this->const[$r][0] = "ASKPRICESUPPLIER_ADDON_PDF"; $this->const[$r][1] = "chaine"; $this->const[$r][2] = "azur"; - $this->const[$r][3] = 'Nom du gestionnaire de generation des propales en PDF'; + $this->const[$r][3] = 'Nom du gestionnaire de generation des demandes de prix fournisseurs en PDF'; + $this->const[$r][4] = 0; + $r++; + + $this->const[$r][0] = "ASKPRICESUPPLIER_ADDON"; + $this->const[$r][1] = "chaine"; + $this->const[$r][2] = "mod_propale_marbre"; + $this->const[$r][3] = 'Nom du gestionnaire de numerotation des demandes de prix fournisseurs'; + $this->const[$r][4] = 0; + $r++; + + $this->const[$r][0] = "ASKPRICESUPPLIER_VALIDITY_DURATION"; + $this->const[$r][1] = "chaine"; + $this->const[$r][2] = "15"; + $this->const[$r][3] = 'Durée de validitée des demandes de prix fournisseurs'; + $this->const[$r][4] = 0; + $r++; + + $this->const[$r][0] = "ASKPRICESUPPLIER_ADDON_PDF_ODT_PATH"; + $this->const[$r][1] = "chaine"; + $this->const[$r][2] = "DOL_DATA_ROOT/doctemplates/askpricesupplier"; + $this->const[$r][3] = ""; $this->const[$r][4] = 0; - $r++;*/ // Boxes $this->boxes = array(); @@ -90,35 +110,36 @@ class modAskPriceSupplier extends DolibarrModules $r++; $this->rights[$r][0] = $this->numero + $r; // id de la permission - $this->rights[$r][1] = 'Créer/modifier les demandes fournisseurs'; // libelle de la permission + $this->rights[$r][1] = 'Lire les demandes fournisseurs'; // libelle de la permission $this->rights[$r][3] = 1; // La permission est-elle une permission par defaut - $this->rights[$r][4] = 'create'; + $this->rights[$r][4] = 'lire'; $r++; $this->rights[$r][0] = $this->numero + $r; // id de la permission - $this->rights[$r][1] = 'Lire les demandes fournisseurs'; // libelle de la permission + $this->rights[$r][1] = 'Créer/modifier les demandes fournisseurs'; // libelle de la permission $this->rights[$r][3] = 1; // La permission est-elle une permission par defaut - $this->rights[$r][4] = 'read'; + $this->rights[$r][4] = 'creer'; + $r++; $this->rights[$r][0] = $this->numero + $r; // id de la permission $this->rights[$r][1] = 'Valider les demandes fournisseurs'; // libelle de la permission $this->rights[$r][3] = 0; // La permission est-elle une permission par defaut - $this->rights[$r][4] = 'read'; + $this->rights[$r][4] = ''; $this->rights[$r][5] = 'validate'; $r++; $this->rights[$r][0] = $this->numero + $r; // id de la permission $this->rights[$r][1] = 'Envoyer les demandes fournisseurs'; // libelle de la permission $this->rights[$r][3] = 0; // La permission est-elle une permission par defaut - $this->rights[$r][4] = 'read'; + $this->rights[$r][4] = ''; $this->rights[$r][5] = 'send'; $r++; $this->rights[$r][0] = $this->numero + $r; // id de la permission $this->rights[$r][1] = 'Supprimer les demandes fournisseurs'; // libelle de la permission $this->rights[$r][3] = 0; // La permission est-elle une permission par defaut - $this->rights[$r][4] = 'delete'; + $this->rights[$r][4] = 'supprimer'; // Exports //-------- @@ -155,10 +176,10 @@ class modAskPriceSupplier extends DolibarrModules 'type'=>'left', // This is a Left menu entry 'titre'=>'askpricesupplierMENU_LEFT_TITLE', 'leftmenu'=>'askpricesuppliersubmenu', - 'url'=>'/askpricesupplier/index.php', + 'url'=>'/comm/askpricesupplier/index.php', 'langs'=>'askpricesupplier', // Lang file to use (without .lang) by module. File must be in langs/code_CODE/ directory. 'enabled'=>'$conf->askpricesupplier->enabled', // Define condition to show or hide menu entry. Use '$conf->mymodule->enabled' if entry must be visible if module is enabled. Use '$leftmenu==\'system\'' to show if leftmenu system is selected. - 'perms'=>'$user->rights->askpricesupplier->read', // Use 'perms'=>'$user->rights->mymodule->level1->level2' if you want your menu with a permission rules + 'perms'=>'$user->rights->askpricesupplier->lire', // Use 'perms'=>'$user->rights->mymodule->level1->level2' if you want your menu with a permission rules 'user'=>2 // 0=Menu for internal users, 1=external users, 2=both ); $r++; @@ -167,10 +188,10 @@ class modAskPriceSupplier extends DolibarrModules 'fk_menu'=>'fk_mainmenu=commercial,fk_leftmenu=askpricesuppliersubmenu', 'type'=>'left', 'titre'=>'askpricesupplierMENU_LEFT_TITLE_NEW', - 'url'=>'/askpricesupplier/card.php?action=create', + 'url'=>'/comm/askpricesupplier.php?action=create', 'langs'=>'askpricesupplier', 'enabled'=>'$conf->askpricesupplier->enabled', - 'perms'=>'$user->rights->askpricesupplier->create', + 'perms'=>'$user->rights->askpricesupplier->creer', 'user'=>2 ); $r++; @@ -179,10 +200,10 @@ class modAskPriceSupplier extends DolibarrModules 'fk_menu'=>'fk_mainmenu=commercial,fk_leftmenu=askpricesuppliersubmenu', 'type'=>'left', 'titre'=>'askpricesupplierMENU_LEFT_TITLE_LIST', - 'url'=>'/askpricesupplier/list.php', + 'url'=>'/comm/askpricesupplier/list.php', 'langs'=>'askpricesupplier', 'enabled'=>'$conf->askpricesupplier->enabled', - 'perms'=>'$user->rights->askpricesupplier->read', + 'perms'=>'$user->rights->askpricesupplier->lire', 'user'=>2 ); $r++; @@ -205,8 +226,7 @@ class modAskPriceSupplier extends DolibarrModules $sql = array(); - //$result=$this->_load_tables('/mymodule/sql/'); - + $result=$this->_load_tables('/comm/askpricesupplier/sql/'); return $this->_init($sql, $options); } @@ -226,3 +246,22 @@ class modAskPriceSupplier extends DolibarrModules } } + + +/* + * + * CREATE TABLE IF NOT EXISTS llx_askpricesupplier ( + rowid INT AUTO_INCREMENT, + fk_statut INT NOT NULL, + fk_soc INT NOT NULL, + price DOUBLE(24,8), + date_create TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + date_send TIMESTAMP, + PRIMARY KEY pk_rowid (rowid), + CONSTRAINT fk_soc FOREIGN KEY (fk_soc) REFERENCES llx_societe (rowid) +); + * + * + * + * + */ diff --git a/htdocs/core/triggers/interface_90_all_Demo.class.php-NORUN b/htdocs/core/triggers/interface_90_all_Demo.class.php-NORUN index d3abf17501d..c50a4afcc01 100644 --- a/htdocs/core/triggers/interface_90_all_Demo.class.php-NORUN +++ b/htdocs/core/triggers/interface_90_all_Demo.class.php-NORUN @@ -151,6 +151,19 @@ class InterfaceDemo extends DolibarrTriggers case 'LINEPROPAL_UPDATE': case 'LINEPROPAL_DELETE': + // Askpricesupplier + case 'ASKPRICESUPPLIER_CREATE': + case 'ASKPRICESUPPLIER_CLONE': + case 'ASKPRICESUPPLIER_MODIFY': + case 'ASKPRICESUPPLIER_VALIDATE': + case 'ASKPRICESUPPLIER_SENTBYMAIL': + case 'ASKPRICESUPPLIER_CLOSE_SIGNED': + case 'ASKPRICESUPPLIER_CLOSE_REFUSED': + case 'ASKPRICESUPPLIER_DELETE': + case 'LINEASKPRICESUPPLIER_INSERT': + case 'LINEASKPRICESUPPLIER_UPDATE': + case 'LINEASKPRICESUPPLIER_DELETE': + // Contracts case 'CONTRACT_CREATE': case 'CONTRACT_ACTIVATE': diff --git a/htdocs/langs/fr_FR/askpricesupplier.lang b/htdocs/langs/fr_FR/askpricesupplier.lang index 784082f42c4..6daa44ce0ce 100644 --- a/htdocs/langs/fr_FR/askpricesupplier.lang +++ b/htdocs/langs/fr_FR/askpricesupplier.lang @@ -3,4 +3,127 @@ AskPriceSupplier=Demande de prix fournisseur askpricesupplierDESC=Gestion des demandes de prix aux fournisseurs askpricesupplierMENU_LEFT_TITLE=Demandes de prix fourn. askpricesupplierMENU_LEFT_TITLE_NEW=Nouvelle demande -askpricesupplierMENU_LEFT_TITLE_LIST=Liste \ No newline at end of file +askpricesupplierMENU_LEFT_TITLE_LIST=Liste + +# Dolibarr language file - Source file is en_US - propal +Proposals=Propositions commerciales +Proposal=Proposition commerciale +ProposalShort=Proposition +ProposalsDraft=Propositions commerciales brouillons +ProposalDraft=Proposition commerciale brouillon +ProposalsOpened=Propositions commerciales ouvertes +Prop=Propositions commerciales +CommercialProposal=Proposition commerciale +CommercialProposals=Propositions commerciales +ProposalCard=Fiche proposition +NewProp=Nouvelle proposition commerciale +NewProposal=Nouvelle proposition commerciale +NewPropal=Nouvelle proposition +Prospect=Prospect +ProspectList=Liste des prospects +ConfirmDeleteProp=Êtes-vous sûr de vouloir effacer cette proposition commerciale ? +ConfirmValidateProp=Êtes-vous sûr de vouloir valider cette proposition commerciale sous la référence %s ? +LastPropals=Les %s dernières propales +LastClosedProposals=Les %s dernières propositions commerciales fermées +LastModifiedProposals=Les %s dernières propositions commerciales modifiées +AllPropals=Toutes les propales +LastProposals=Dernières propositions +SearchAProposal=Rechercher une proposition commerciale +ProposalsStatistics=Statistiques des propositions commerciales +NumberOfProposalsByMonth=Nombre par mois +AmountOfProposalsByMonthHT=Montant par mois (HT) +NbOfProposals=Nombre de propositions commerciales + + +# # Ajout +ShowAskpricesupplier=Afficher demande +CommRequest=Demande de prix +CommRequests=Demandes de prix +SearchRequest=Rechercher une demande +DraftRequests=Demandes brouillons +LastModifiedRequests=Les %s dernières demandes de prix modifiées +RequestsOpened=Demandes de prix ouvertes +AskPriceSupplierArea=Espace des demandes de prix fournisseurs +NewAskPrice=Nouvelle demande de prix +NewAsk=Nouvelle demande +# # Modifié +DateAsk=Date de demande +DateEndAsk=Date de fin de validité +DateEndAskShort=Date de fin +DeleteAsk=Supprimer demande +ValidateAsk=Valider demande +AddAsk=Créer une demande +AskpricesupplierDraft=Brouillons +AskpricesupplierOpened=Ouvertes +AskpricesupplierNotBilled=Non facturées +AskpricesupplierStatusDraft=Brouillon (à valider) +AskpricesupplierStatusValidated=Validée (demande ouverte) +AskpricesupplierStatusOpened=Validée (demande ouverte) +AskpricesupplierStatusClosed=Fermée +AskpricesupplierStatusSigned=Signée (à facturer) +AskpricesupplierStatusNotSigned=Non signée (fermée) +AskpricesupplierStatusBilled=Facturée +AskpricesupplierStatusDraftShort=Brouillon +AskpricesupplierStatusValidatedShort=Validée +AskpricesupplierStatusOpenedShort=Ouverte +AskpricesupplierStatusClosedShort=Fermée +AskpricesupplierStatusSignedShort=Signée +AskpricesupplierStatusNotSignedShort=Non signée +AskpricesupplierStatusBilledShort=Facturée +AskpricesupplierToClose=Demandes de prix à fermer +AskpricesupplierToBill=Demandes de prix signées à facturer +CopyAskFrom=Créer demande/devis par recopie d'une demande existante +CreateEmptyAsk=Créer demande/devis vierge +CloneAsk=Cloner demande de prix +ConfirmCloneAsk=Êtes-vous sûr de vouloir cloner la demande de prix %s ? +ConfirmReOpenAsk=Êtes-vous sûr de vouloir réouvrir la demande de prix %s ? +SendAskByMail=Envoyer demande de prix par email +SendAskRef=Envoi de la demande de prix %s + + +##### Types de contacts ##### +TypeContact_askpricesupplier_internal_SALESREPFOLL=Commercial suivi demande +TypeContact_askpricesupplier_external_BILLING=Contact client facturation demande +TypeContact_askpricesupplier_external_CUSTOMER=Contact client suivi demande + +# # + + +ListOfProposals=Liste des devis/propositions commerciales +ActionsOnPropal=Événements sur la proposition +NoOpenedPropals=Pas de proposition ouverte +NoOtherOpenedPropals=Pas d'autre proposition brouillon +RefProposal=Réf. proposition commerciale +AssociatedDocuments=Documents associés à la proposition : +ErrorCantOpenDir=Impossible d'ouvrir le répertoire + +ValidityDuration=Durée de validité +CloseAs=Clôturer au statut +ClassifyBilled=Classer facturée +BuildBill=Créer facture +ErrorPropalNotFound=Propale %s inexistante +Estimate=Devis : +EstimateShort=Devis +OtherPropals=Autres propositions +AddToDraftProposals=Ajouter à proposition brouillon +NoDraftProposals=Pas de propositions brouillons +DefaultProposalDurationValidity=Délai de validité par défaut (en jours) +UseCustomerContactAsPropalRecipientIfExist=Utiliser l'adresse de contact suivi client si définie plutôt que l'adresse du tiers comme destinataire des propositions + +ProposalsAndProposalsLines=Propositions commerciales clients et lignes de propositions +ProposalLine=Ligne de proposition +AvailabilityPeriod=Délai de livraison +SetAvailability=Définir le délai de livraison +AfterOrder=après commande +##### Availability ##### +AvailabilityTypeAV_NOW=Immédiate +AvailabilityTypeAV_1W=1 semaine +AvailabilityTypeAV_2W=2 semaines +AvailabilityTypeAV_3W=3 semaines +AvailabilityTypeAV_1M=1 mois +# Document models +DocModelAzurDescription=Modèle de proposition commerciale complet (logo…) +DocModelJauneDescription=Modèle de proposition Jaune +DefaultModelPropalCreate=Modèle par défaut à la création +DefaultModelPropalToBill=Modèle par défaut lors de la clôture d'une proposition commerciale (à facturer) +DefaultModelPropalClosed=Modèle par défaut lors de la clôture d'une proposition commerciale (non facturée) From 49fa0056c87572b220b101b250b4cbed16dec80c Mon Sep 17 00:00:00 2001 From: phf Date: Tue, 27 Jan 2015 17:43:07 +0100 Subject: [PATCH 004/287] [CORE] Avancement des replace (#new_ask_price). --- htdocs/comm/askpricesupplier/list.php | 30 ++--- .../class/html.formaskpricesupplier.class.php | 104 ++++++++++++++++++ .../modules_askpricesupplier.php | 4 +- .../modules/modAskPriceSupplier.class.php | 5 + htdocs/langs/fr_FR/askpricesupplier.lang | 2 +- 5 files changed, 127 insertions(+), 18 deletions(-) create mode 100644 htdocs/core/class/html.formaskpricesupplier.class.php diff --git a/htdocs/comm/askpricesupplier/list.php b/htdocs/comm/askpricesupplier/list.php index c28128e81c5..948482fe4cd 100644 --- a/htdocs/comm/askpricesupplier/list.php +++ b/htdocs/comm/askpricesupplier/list.php @@ -33,14 +33,14 @@ require '../../main.inc.php'; require_once DOL_DOCUMENT_ROOT.'/core/class/html.formother.class.php'; require_once DOL_DOCUMENT_ROOT.'/core/class/html.formfile.class.php'; -require_once DOL_DOCUMENT_ROOT.'/core/class/html.formpropal.class.php'; +require_once DOL_DOCUMENT_ROOT.'/core/class/html.formaskpricesupplier.class.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php'; -require_once DOL_DOCUMENT_ROOT.'/comm/propal/class/propal.class.php'; +require_once DOL_DOCUMENT_ROOT.'/comm/askpricesupplier/class/askpricesupplier.class.php'; if (! empty($conf->projet->enabled)) require_once DOL_DOCUMENT_ROOT.'/projet/class/project.class.php'; $langs->load('companies'); -$langs->load('propal'); +$langs->load('askpricesupplier'); $langs->load('compta'); $langs->load('bills'); $langs->load('orders'); @@ -57,7 +57,7 @@ $search_montant_ht=GETPOST('search_montant_ht','alpha'); $search_author=GETPOST('search_author','alpha'); $search_town=GETPOST('search_town','alpha'); $viewstatut=$db->escape(GETPOST('viewstatut')); -$object_statut=$db->escape(GETPOST('propal_statut')); +$object_statut=$db->escape(GETPOST('askpricesupplier_statut')); $sall=GETPOST("sall"); $mesg=(GETPOST("msg") ? GETPOST("msg") : GETPOST("mesg")); @@ -68,7 +68,7 @@ $month=GETPOST("month"); $NBLINES=4; // Security check -$module='propal'; +$module='askpricesupplier'; $dbtable=''; $objectid=''; if (! empty($user->societe_id)) $socid=$user->societe_id; @@ -121,12 +121,12 @@ if ($reshook < 0) setEventMessages($hookmanager->error, $hookmanager->errors, 'e * View */ -llxHeader('',$langs->trans('Proposal'),'EN:Commercial_Proposals|FR:Proposition_commerciale|ES:Presupuestos'); +llxHeader('',$langs->trans('CommRequest'),'EN:Commercial_Proposals|FR:Proposition_commerciale|ES:Presupuestos'); $form = new Form($db); $formother = new FormOther($db); $formfile = new FormFile($db); -$formpropal = new FormPropal($db); +$formpropal = new FormAskPriceSupplier($db); $companystatic=new Societe($db); $now=dol_now(); @@ -148,8 +148,8 @@ $sql = 'SELECT s.rowid, s.nom as name, s.town, s.client, s.code_client,'; $sql.= ' p.rowid as propalid, p.note_private, p.total_ht, p.ref, p.ref_client, p.fk_statut, p.fk_user_author, p.datep as dp, p.fin_validite as dfv,'; if (! $user->rights->societe->client->voir && ! $socid) $sql .= " sc.fk_soc, sc.fk_user,"; $sql.= ' u.login'; -$sql.= ' FROM '.MAIN_DB_PREFIX.'societe as s, '.MAIN_DB_PREFIX.'propal as p'; -if ($sall) $sql.= ' LEFT JOIN '.MAIN_DB_PREFIX.'propaldet as pd ON p.rowid=pd.fk_propal'; +$sql.= ' FROM '.MAIN_DB_PREFIX.'societe as s, '.MAIN_DB_PREFIX.'askpricesupplier as p'; +if ($sall) $sql.= ' LEFT JOIN '.MAIN_DB_PREFIX.'askpricesupplierdet as pd ON p.rowid=pd.fk_askpricesupplier'; $sql.= ' LEFT JOIN '.MAIN_DB_PREFIX.'user as u ON p.fk_user_author = u.rowid'; // 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"; @@ -208,7 +208,7 @@ else if ($year > 0) if ($search_sale > 0) $sql.= " AND s.rowid = sc.fk_soc AND sc.fk_user = " .$search_sale; if ($search_user > 0) { - $sql.= " AND c.fk_c_type_contact = tc.rowid AND tc.element='propal' AND tc.source='internal' AND c.element_id = p.rowid AND c.fk_socpeople = ".$search_user; + $sql.= " AND c.fk_c_type_contact = tc.rowid AND tc.element='askpricesupplier' AND tc.source='internal' AND c.element_id = p.rowid AND c.fk_socpeople = ".$search_user; } @@ -227,7 +227,7 @@ $result=$db->query($sql); if ($result) { - $objectstatic=new Propal($db); + $objectstatic=new AskPriceSupplier($db); $userstatic=new User($db); $num = $db->num_rows($result); @@ -248,7 +248,7 @@ if ($result) if ($search_montant_ht) $param.='&search_montant_ht='.$search_montant_ht; if ($search_author) $param.='&search_author='.$search_author; if ($search_town) $param.='&search_town='.$search_town; - print_barre_liste($langs->trans('ListOfProposals').' '.($socid?'- '.$soc->name:''), $page, $_SERVER["PHP_SELF"],$param,$sortfield,$sortorder,'',$num,$nbtotalofrecords); + print_barre_liste($langs->trans('ListOfAskPriceSupplier').' '.($socid?'- '.$soc->name:''), $page, $_SERVER["PHP_SELF"],$param,$sortfield,$sortorder,'',$num,$nbtotalofrecords); // Lignes des champs de filtre print '
'; @@ -344,7 +344,7 @@ if ($result) print '
'; - $objectstatic->id=$objp->propalid; + $objectstatic->id=$objp->askpricesupplierid; $objectstatic->ref=$objp->ref; print ''; @@ -353,11 +353,11 @@ if ($result) print ''; print ''; diff --git a/htdocs/core/class/html.formaskpricesupplier.class.php b/htdocs/core/class/html.formaskpricesupplier.class.php new file mode 100644 index 00000000000..ba7a6d8fee4 --- /dev/null +++ b/htdocs/core/class/html.formaskpricesupplier.class.php @@ -0,0 +1,104 @@ + + * + * 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 3 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, see . + */ + +/** + * \file htdocs/core/class/html.formpropal.class.php + * \ingroup core + * \brief File of class with all html predefined components + */ + + +/** + * Class to manage generation of HTML components for proposal management + */ +class FormAskPriceSupplier +{ + var $db; + var $error; + + + /** + * Constructor + * + * @param DoliDB $db Database handler + */ + public function __construct($db) + { + $this->db = $db; + } + + /** + * Return combo list of differents status of a proposal + * Values are id of table c_propalst + * + * @param string $selected Preselected value + * @param int $short Use short labels + * @return void + */ + function selectAskPriceSupplierStatus($selected='',$short=0) + { + global $langs; + + $sql = "SELECT id, code, label, active FROM ".MAIN_DB_PREFIX."c_propalst"; + $sql .= " WHERE active = 1"; + + dol_syslog(get_class($this)."::selectAskPriceSupplierStatus", LOG_DEBUG); + $resql=$this->db->query($sql); + if ($resql) + { + print ''; + } + else + { + dol_print_error($this->db); + } + } + +} + diff --git a/htdocs/core/modules/askpricesupplier/modules_askpricesupplier.php b/htdocs/core/modules/askpricesupplier/modules_askpricesupplier.php index 68465c20512..1662e9a45bf 100644 --- a/htdocs/core/modules/askpricesupplier/modules_askpricesupplier.php +++ b/htdocs/core/modules/askpricesupplier/modules_askpricesupplier.php @@ -64,7 +64,7 @@ abstract class ModelePDFAskPriceSupplier extends CommonDocGenerator /** * Classe mere des modeles de numerotation des references de propales */ -abstract class ModeleNumRefPropales +abstract class ModeleNumRefAskPriceSupplier { var $error=''; @@ -158,7 +158,7 @@ abstract class ModeleNumRefPropales * @return int 0 if KO, 1 if OK * @deprecated Use the new function generateDocument of Propal class */ -function propale_pdf_create(DoliDB $db, Propal $object, $modele, $outputlangs, $hidedetails=0, $hidedesc=0, $hideref=0) +function askpricesupplier_pdf_create(DoliDB $db, Propal $object, $modele, $outputlangs, $hidedetails=0, $hidedesc=0, $hideref=0) { return $object->generateDocument($modele, $outputlangs, $hidedetails, $hidedesc, $hideref); } diff --git a/htdocs/core/modules/modAskPriceSupplier.class.php b/htdocs/core/modules/modAskPriceSupplier.class.php index 92906ba7ae7..e9b4359ee85 100644 --- a/htdocs/core/modules/modAskPriceSupplier.class.php +++ b/htdocs/core/modules/modAskPriceSupplier.class.php @@ -250,6 +250,11 @@ class modAskPriceSupplier extends DolibarrModules /* * +DROP TABLE llx_askpricesupplier_extrafields; +DROP TABLE llx_askpricesupplierdet_extrafields; +DROP TABLE llx_askpricesupplierdet; +DROP TABLE llx_askpricesupplier; + * * CREATE TABLE IF NOT EXISTS llx_askpricesupplier ( rowid INT AUTO_INCREMENT, fk_statut INT NOT NULL, diff --git a/htdocs/langs/fr_FR/askpricesupplier.lang b/htdocs/langs/fr_FR/askpricesupplier.lang index 6daa44ce0ce..c67e37dc7c5 100644 --- a/htdocs/langs/fr_FR/askpricesupplier.lang +++ b/htdocs/langs/fr_FR/askpricesupplier.lang @@ -80,6 +80,7 @@ ConfirmReOpenAsk=Êtes-vous sûr de vouloir réouvrir la demande de prix %s Date: Wed, 28 Jan 2015 10:33:15 +0100 Subject: [PATCH 005/287] [CORE] avancement du mercredi matin (#new_ask_price). --- .../admin/askpricesupplier_extrafields.php | 157 +++++++++++++++++ .../admin/askpricesupplierdet_extrafields.php | 159 ++++++++++++++++++ htdocs/comm/askpricesupplier.php | 2 +- htdocs/comm/askpricesupplier/apercu.php | 12 +- htdocs/comm/askpricesupplier/contact.php | 26 +-- htdocs/comm/askpricesupplier/document.php | 20 +-- htdocs/comm/askpricesupplier/info.php | 14 +- htdocs/comm/askpricesupplier/list.php | 8 +- htdocs/comm/askpricesupplier/note.php | 16 +- htdocs/comm/propal.php | 2 +- htdocs/core/lib/askpricesupplier.lib.php | 30 ++-- .../tpl/document_actions_post_headers.tpl.php | 2 +- htdocs/core/tpl/notes.tpl.php | 1 + htdocs/societe/class/societe.class.php | 2 +- 14 files changed, 384 insertions(+), 67 deletions(-) create mode 100644 htdocs/comm/admin/askpricesupplier_extrafields.php create mode 100644 htdocs/comm/admin/askpricesupplierdet_extrafields.php diff --git a/htdocs/comm/admin/askpricesupplier_extrafields.php b/htdocs/comm/admin/askpricesupplier_extrafields.php new file mode 100644 index 00000000000..fa0bd058f0f --- /dev/null +++ b/htdocs/comm/admin/askpricesupplier_extrafields.php @@ -0,0 +1,157 @@ + + * Copyright (C) 2003 Jean-Louis Bergamo + * Copyright (C) 2004-2011 Laurent Destailleur + * Copyright (C) 2012 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 3 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, see . + */ + +/** + * \file htdocs/comm/admin/propal_extrafields.php + * \ingroup propal + * \brief Page to setup extra fields of third party + */ + +require '../../main.inc.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/askpricesupplier.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/core/class/extrafields.class.php'; + +$langs->load("companies"); +$langs->load("admin"); +$langs->load('askpricesupplier'); + +$extrafields = new ExtraFields($db); +$form = new Form($db); + +// List of supported format +$tmptype2label=ExtraFields::$type2label; +$type2label=array(''); +foreach ($tmptype2label as $key => $val) $type2label[$key]=$langs->trans($val); + +$action=GETPOST('action', 'alpha'); +$attrname=GETPOST('attrname', 'alpha'); +$elementtype='askpricesupplier'; //Must be the $table_element of the class that manage extrafield + +if (!$user->admin) accessforbidden(); + + +/* + * Actions + */ + +require DOL_DOCUMENT_ROOT.'/core/actions_extrafields.inc.php'; + + + +/* + * View + */ + +$textobject=$langs->transnoentitiesnoconv("Proposals"); + + +llxHeader('',$langs->trans("AskPriceSupplierSetup")); + + +$linkback=''.$langs->trans("BackToModuleList").''; +print_fiche_titre($langs->trans("AskPriceSupplierSetup"),$linkback,'setup'); + + +$head = propal_admin_prepare_head(); + +dol_fiche_head($head, 'attributes', $langs->trans("CommRequests"), 0, 'askpricesupplier'); + + +print $langs->trans("DefineHereComplementaryAttributes",$textobject).'
'."\n"; +print '
'; + +// Load attribute_label +$extrafields->fetch_name_optionals_label($elementtype); + +print "
'; - if ($objp->fk_statut == 1 && $db->jdate($objp->dfv) < ($now - $conf->propal->cloture->warning_delay)) print img_warning($langs->trans("Late")); + if ($objp->fk_statut == 1 && $db->jdate($objp->dfv) < ($now - $conf->askpricesupplier->cloture->warning_delay)) print img_warning($langs->trans("Late")); if (! empty($objp->note_private)) { print ' '; - print ''.img_picto($langs->trans("ViewPrivateNote"),'object_generic').''; + print ''.img_picto($langs->trans("ViewPrivateNote"),'object_generic').''; print ''; } print '
"; + +print ''; +print ''; +print ''; +print ''; +print ''; +print ''; +print ''; +print ''; +print ''; +print "\n"; + +$var=True; +foreach($extrafields->attribute_type as $key => $value) +{ + $var=!$var; + print ""; + print "\n"; + print "\n"; + print "\n"; + print "\n"; + print '\n"; + print '\n"; + print '\n"; + print '\n"; + print ""; + // $i++; +} + +print "
'.$langs->trans("Position").''.$langs->trans("Label").''.$langs->trans("AttributeCode").''.$langs->trans("Type").''.$langs->trans("Size").''.$langs->trans("Unique").''.$langs->trans("Required").' 
".$extrafields->attribute_pos[$key]."".$extrafields->attribute_label[$key]."".$key."".$type2label[$extrafields->attribute_type[$key]]."'.$extrafields->attribute_size[$key]."'.yn($extrafields->attribute_unique[$key])."'.yn($extrafields->attribute_required[$key])."'.img_edit().''; + print "  ".img_delete()."
"; + +dol_fiche_end(); + + +// Buttons +if ($action != 'create' && $action != 'edit') +{ + print '
'; + print ''; + print "
"; +} + + +/* ************************************************************************** */ +/* */ +/* Creation d'un champ optionnel + /* */ +/* ************************************************************************** */ + +if ($action == 'create') +{ + print "
"; + print_titre($langs->trans('NewAttribute')); + + require DOL_DOCUMENT_ROOT.'/core/tpl/admin_extrafields_add.tpl.php'; +} + +/* ************************************************************************** */ +/* */ +/* Edition d'un champ optionnel */ +/* */ +/* ************************************************************************** */ +if ($action == 'edit' && ! empty($attrname)) +{ + print "
"; + print_titre($langs->trans("FieldEdition", $attrname)); + + require DOL_DOCUMENT_ROOT.'/core/tpl/admin_extrafields_edit.tpl.php'; +} + +llxFooter(); + +$db->close(); diff --git a/htdocs/comm/admin/askpricesupplierdet_extrafields.php b/htdocs/comm/admin/askpricesupplierdet_extrafields.php new file mode 100644 index 00000000000..85647950276 --- /dev/null +++ b/htdocs/comm/admin/askpricesupplierdet_extrafields.php @@ -0,0 +1,159 @@ + + * Copyright (C) 2003 Jean-Louis Bergamo + * Copyright (C) 2004-2013 Laurent Destailleur + * Copyright (C) 2012 Regis Houssin + * Copyright (C) 2012 Florian Henry + * Copyright (C) 2013 Philippe Grand + * Copyright (C) 2013 Florian Henry + * + * 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 3 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, see . + */ + +/** + * \file htdocs/comm/admin/propaldet_extrafields.php + * \ingroup order + * \brief Page to setup extra fields of order + */ + +require '../../main.inc.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/askpricesupplier.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/core/class/extrafields.class.php'; + + +if (!$user->admin) + accessforbidden(); + +$langs->load("admin"); +$langs->load("other"); +$langs->load("askpricesupplier"); + +$extrafields = new ExtraFields($db); +$form = new Form($db); + +// List of supported format +$tmptype2label=ExtraFields::$type2label; +$type2label=array(''); +foreach ($tmptype2label as $key => $val) $type2label[$key]=$langs->trans($val); + +$action=GETPOST('action', 'alpha'); +$attrname=GETPOST('attrname', 'alpha'); + +$elementtype='askpricesupplierdet'; //Must be the $table_element of the class that manage extrafield + +if (!$user->admin) accessforbidden(); + + +/* + * Actions + */ + +require DOL_DOCUMENT_ROOT.'/core/actions_extrafields.inc.php'; + + + +/* + * View + */ + +$textobject=$langs->transnoentitiesnoconv("CommRequests"); + +llxHeader('',$langs->trans("AskPriceSupplierSetup")); + +$linkback=''.$langs->trans("BackToModuleList").''; +print_fiche_titre($langs->trans("AskPriceSupplierSetup"),$linkback,'setup'); + +$head = propal_admin_prepare_head(); + +dol_fiche_head($head, 'attributeslines', $langs->trans("CommRequests"), 0, 'askpricesupplier'); + + +print $langs->trans("DefineHereComplementaryAttributes",$textobject).'
'."\n"; +print '
'; + +// Load attribute_label +$extrafields->fetch_name_optionals_label($elementtype); + +print ""; + +print ''; +print ''; +print ''; +print ''; +print ''; +print ''; +print ''; +print ''; +print "\n"; + +$var=True; +foreach($extrafields->attribute_type as $key => $value) +{ + $var=!$var; + print ""; + print "\n"; + print "\n"; + print "\n"; + print '\n"; + print '\n"; + print '\n"; + print '\n"; + print ""; +} + +print "
'.$langs->trans("Label").''.$langs->trans("AttributeCode").''.$langs->trans("Type").''.$langs->trans("Size").''.$langs->trans("Unique").''.$langs->trans("Required").' 
".$extrafields->attribute_label[$key]."".$key."".$type2label[$extrafields->attribute_type[$key]]."'.$extrafields->attribute_size[$key]."'.yn($extrafields->attribute_unique[$key])."'.yn($extrafields->attribute_required[$key])."'.img_edit().''; + print "  ".img_delete()."
"; + +dol_fiche_end(); + + +// Buttons +if ($action != 'create' && $action != 'edit') +{ + print '
'; + print "".$langs->trans("NewAttribute").""; + print "
"; +} + + +/* ************************************************************************** */ +/* */ +/* Creation d'un champ optionnel */ +/* */ +/* ************************************************************************** */ + +if ($action == 'create') +{ + print "
"; + print_titre($langs->trans('NewAttribute')); + + require DOL_DOCUMENT_ROOT.'/core/tpl/admin_extrafields_add.tpl.php'; +} + +/* ************************************************************************** */ +/* */ +/* Edition d'un champ optionnel */ +/* */ +/* ************************************************************************** */ +if ($action == 'edit' && ! empty($attrname)) +{ + print "
"; + print_titre($langs->trans("FieldEdition", $attrname)); + + require DOL_DOCUMENT_ROOT.'/core/tpl/admin_extrafields_edit.tpl.php'; +} + +llxFooter(); + +$db->close(); diff --git a/htdocs/comm/askpricesupplier.php b/htdocs/comm/askpricesupplier.php index bd694f4a925..1cdd560bb49 100644 --- a/htdocs/comm/askpricesupplier.php +++ b/htdocs/comm/askpricesupplier.php @@ -1190,7 +1190,7 @@ llxHeader('', $langs->trans('CommRequests'), 'EN:Commercial_Proposals|FR:Proposi $form = new Form($db); $formother = new FormOther($db); $formfile = new FormFile($db); -$formpropal = new FormPropal($db); +$formaskpricesupplier = new FormAskPriceSupplier($db); $companystatic = new Societe($db); $now = dol_now(); diff --git a/htdocs/comm/askpricesupplier/apercu.php b/htdocs/comm/askpricesupplier/apercu.php index 87281e7ea63..a434bca9354 100644 --- a/htdocs/comm/askpricesupplier/apercu.php +++ b/htdocs/comm/askpricesupplier/apercu.php @@ -27,11 +27,11 @@ */ require '../../main.inc.php'; -require_once DOL_DOCUMENT_ROOT.'/comm/propal/class/propal.class.php'; -require_once DOL_DOCUMENT_ROOT.'/core/lib/propal.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/comm/askpricesupplier/class/askpricesupplier.class.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/askpricesupplier.lib.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php'; -$langs->load('propal'); +$langs->load('askpricesupplier'); $langs->load("bills"); $langs->load('compta'); @@ -40,7 +40,7 @@ $socid=0; $id = GETPOST('id','int'); $ref = GETPOST("ref"); if ($user->societe_id) $socid=$user->societe_id; -$result = restrictedArea($user, 'propal', $id); +$result = restrictedArea($user, 'askpricesupplier', $id); /* @@ -52,7 +52,7 @@ llxHeader(); if ($id > 0 || ! empty($ref)) { - $object = new Propal($db); + $object = new AskPriceSupplier($db); if ($object->fetch($id,$ref) > 0) { @@ -60,7 +60,7 @@ if ($id > 0 || ! empty($ref)) $soc->fetch($object->socid); $head = propal_prepare_head($object); - dol_fiche_head($head, 'preview', $langs->trans('Proposal'), 0, 'propal'); + dol_fiche_head($head, 'preview', $langs->trans('CommRequest'), 0, 'askpricesupplier'); /* diff --git a/htdocs/comm/askpricesupplier/contact.php b/htdocs/comm/askpricesupplier/contact.php index 6a0a1076e62..7ebb852d9bb 100644 --- a/htdocs/comm/askpricesupplier/contact.php +++ b/htdocs/comm/askpricesupplier/contact.php @@ -25,9 +25,9 @@ */ require '../../main.inc.php'; -require_once DOL_DOCUMENT_ROOT.'/comm/propal/class/propal.class.php'; +require_once DOL_DOCUMENT_ROOT.'/comm/askpricesupplier/class/askpricesupplier.class.php'; require_once DOL_DOCUMENT_ROOT.'/contact/class/contact.class.php'; -require_once DOL_DOCUMENT_ROOT.'/core/lib/propal.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/askpricesupplier.lib.php'; require_once DOL_DOCUMENT_ROOT.'/core/class/html.formother.class.php'; require_once DOL_DOCUMENT_ROOT.'/core/class/html.formcompany.class.php'; @@ -43,9 +43,9 @@ $action=GETPOST('action','alpha'); // Security check if ($user->societe_id) $socid=$user->societe_id; -$result = restrictedArea($user, 'propal', $id); +$result = restrictedArea($user, 'askpricesupplier', $id); -$object = new Propal($db); +$object = new AskPriceSupplier($db); // Load object if ($id > 0 || ! empty($ref)) @@ -69,7 +69,7 @@ if (! $error) } else { - header('Location: '.DOL_URL_ROOT.'/comm/propal/list.php'); + header('Location: '.DOL_URL_ROOT.'/comm/askpricesupplier/list.php'); exit; } @@ -78,7 +78,7 @@ else * Ajout d'un nouveau contact */ -if ($action == 'addcontact' && $user->rights->propale->creer) +if ($action == 'addcontact' && $user->rights->askpricesupplier->creer) { if ($object->id > 0) { @@ -106,7 +106,7 @@ if ($action == 'addcontact' && $user->rights->propale->creer) } // Bascule du statut d'un contact -else if ($action == 'swapstatut' && $user->rights->propale->creer) +else if ($action == 'swapstatut' && $user->rights->askpricesupplier->creer) { if ($object->id > 0) { @@ -115,7 +115,7 @@ else if ($action == 'swapstatut' && $user->rights->propale->creer) } // Efface un contact -else if ($action == 'deletecontact' && $user->rights->propale->creer) +else if ($action == 'deletecontact' && $user->rights->askpricesupplier->creer) { $result = $object->delete_contact($lineid); @@ -130,7 +130,7 @@ else if ($action == 'deletecontact' && $user->rights->propale->creer) } } -else if ($action == 'setaddress' && $user->rights->propale->creer) +else if ($action == 'setaddress' && $user->rights->askpricesupplier->creer) { $result=$object->setDeliveryAddress($_POST['fk_address']); if ($result < 0) dol_print_error($db,$object->error); @@ -141,7 +141,7 @@ else if ($action == 'setaddress' && $user->rights->propale->creer) * View */ -llxHeader('',$langs->trans('Proposal'),'EN:Commercial_Proposals|FR:Proposition_commerciale|ES:Presupuestos'); +llxHeader('',$langs->trans('CommRequest'),'EN:Commercial_Proposals|FR:Proposition_commerciale|ES:Presupuestos'); $form = new Form($db); $formcompany= new FormCompany($db); @@ -150,14 +150,14 @@ $formother = new FormOther($db); if ($object->id > 0) { $head = propal_prepare_head($object); - dol_fiche_head($head, 'contact', $langs->trans("Proposal"), 0, 'propal'); + dol_fiche_head($head, 'contact', $langs->trans("CommRequest"), 0, 'askpricesupplier'); /* * Propal synthese pour rappel */ print ''; - $linkback=''.$langs->trans("BackToList").''; + $linkback=''.$langs->trans("BackToList").''; // Ref print ''; print ''; print ''; } From 74f15680e1056548f4c97b19481b1d48fc1424ea Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 24 Feb 2015 15:40:50 +0100 Subject: [PATCH 155/287] Fix missing fields into import of thirdparties. Fix import failed to find type of companny from source file. Fix import date of creation has wrong check rule. --- htdocs/core/class/ctypent.class.php | 5 ++-- .../modules/import/import_csv.modules.php | 23 +++++++++++++------ htdocs/core/modules/modSociete.class.php | 8 +++---- htdocs/langs/en_US/errors.lang | 2 +- 4 files changed, 24 insertions(+), 14 deletions(-) diff --git a/htdocs/core/class/ctypent.class.php b/htdocs/core/class/ctypent.class.php index 027dda53dd3..c7894c7c848 100644 --- a/htdocs/core/class/ctypent.class.php +++ b/htdocs/core/class/ctypent.class.php @@ -148,9 +148,10 @@ class Ctypent // extends CommonObject * * @param int $id Id object * @param string $code Code + * @param string $label Label * @return int <0 if KO, >0 if OK */ - function fetch($id,$code='') + function fetch($id,$code='',$label='') { global $langs; $sql = "SELECT"; @@ -163,8 +164,8 @@ class Ctypent // extends CommonObject $sql.= " FROM ".MAIN_DB_PREFIX."c_typent as t"; if ($id) $sql.= " WHERE t.id = ".$id; elseif ($code) $sql.= " WHERE t.code = '".$this->db->escape($code)."'"; + elseif ($label) $sql.= " WHERE t.libelle = '".$this->db->escape($label)."'"; - dol_syslog(get_class($this)."::fetch", LOG_DEBUG); $resql=$this->db->query($sql); if ($resql) { diff --git a/htdocs/core/modules/import/import_csv.modules.php b/htdocs/core/modules/import/import_csv.modules.php index 14de889d9ce..2fd213c3774 100644 --- a/htdocs/core/modules/import/import_csv.modules.php +++ b/htdocs/core/modules/import/import_csv.modules.php @@ -414,21 +414,34 @@ class ImportCsv extends ModeleImports if (! empty($objimport->array_import_convertvalue[0][$val])) { //print 'Must convert '.$newval.' with rule '.join(',',$objimport->array_import_convertvalue[0][$val]).'. '; - if ($objimport->array_import_convertvalue[0][$val]['rule']=='fetchidfromcodeid' || $objimport->array_import_convertvalue[0][$val]['rule']=='fetchidfromref') + if ($objimport->array_import_convertvalue[0][$val]['rule']=='fetchidfromcodeid' + || $objimport->array_import_convertvalue[0][$val]['rule']=='fetchidfromref' + || $objimport->array_import_convertvalue[0][$val]['rule']=='fetchidfromcodeorlabel' + ) { if (! is_numeric($newval) && $newval != '') // If value into input import file is not a numeric, we apply the function defined into descriptor { $file=$objimport->array_import_convertvalue[0][$val]['classfile']; $class=$objimport->array_import_convertvalue[0][$val]['class']; $method=$objimport->array_import_convertvalue[0][$val]['method']; - if (empty($this->cacheconvert[$file.'_'.$class.'_'.$method.'_'][$newval])) + if ($this->cacheconvert[$file.'_'.$class.'_'.$method.'_'][$newval] != '') { + $newval=$this->cacheconvert[$file.'_'.$class.'_'.$method.'_'][$newval]; + } + else + { dol_include_once($file); $classinstance=new $class($this->db); + // Try the fetch from code or ref call_user_func_array(array($classinstance, $method),array('', $newval)); + // If not found, try the fetch from label + if (! ($classinstance->id != '') && $objimport->array_import_convertvalue[0][$val]['rule']=='fetchidfromcodeorlabel') + { + call_user_func_array(array($classinstance, $method),array('', '', $newval)); + } $this->cacheconvert[$file.'_'.$class.'_'.$method.'_'][$newval]=$classinstance->id; //print 'We have made a '.$class.'->'.$method.' to get id from code '.$newval.'. '; - if (! empty($classinstance->id)) + if ($classinstance->id != '') // id may be 0, it is a found value { $newval=$classinstance->id; } @@ -442,10 +455,6 @@ class ImportCsv extends ModeleImports $error++; } } - else - { - $newval=$this->cacheconvert[$file.'_'.$class.'_'.$method.'_'][$newval]; - } } } diff --git a/htdocs/core/modules/modSociete.class.php b/htdocs/core/modules/modSociete.class.php index af538845061..3a2bcefe8b2 100644 --- a/htdocs/core/modules/modSociete.class.php +++ b/htdocs/core/modules/modSociete.class.php @@ -398,7 +398,7 @@ class modSociete extends DolibarrModules // End add extra fields $this->import_fieldshidden_array[$r]=array('s.fk_user_creat'=>'user->id','extra.fk_object'=>'lastrowid-'.MAIN_DB_PREFIX.'societe'); // aliastable.field => ('user->id' or 'lastrowid-'.tableparent) $this->import_convertvalue_array[$r]=array( - 's.fk_typent'=>array('rule'=>'fetchidfromcodeid','classfile'=>'/core/class/ctypent.class.php','class'=>'Ctypent','method'=>'fetch','dict'=>'DictionaryCompanyType'), + 's.fk_typent'=>array('rule'=>'fetchidfromcodeorlabel','classfile'=>'/core/class/ctypent.class.php','class'=>'Ctypent','method'=>'fetch','dict'=>'DictionaryCompanyType'), 's.fk_pays'=>array('rule'=>'fetchidfromcodeid','classfile'=>'/core/class/ccountry.class.php','class'=>'Ccountry','method'=>'fetch','dict'=>'DictionaryCountry'), 's.fk_stcomm'=>array('rule'=>'zeroifnull'), 's.code_client'=>array('rule'=>'getcustomercodeifauto'), @@ -407,8 +407,8 @@ class modSociete extends DolibarrModules 's.code_compta_fournisseur'=>array('rule'=>'getsupplieraccountancycodeifauto') ); //$this->import_convertvalue_array[$r]=array('s.fk_soc'=>array('rule'=>'lastrowid',table='t'); - $this->import_regex_array[$r]=array('s.status'=>'^[0|1]','s.client'=>'^[0|1|2|3]','s.fournisseur'=>'^[0|1]','s.fk_typent'=>'id@'.MAIN_DB_PREFIX.'c_typent','s.datec'=>'^[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]$'); - $this->import_examplevalues_array[$r]=array('s.nom'=>"MyBigCompany",'s.status'=>"0 (closed) or 1 (active)",'s.client'=>'0 (no customer no prospect)/1 (customer)/2 (prospect)/3 (customer and prospect)','s.fournisseur'=>'0 or 1','s.datec'=>dol_print_date(dol_now(),'%Y-%m-%d'),'s.code_client'=>"CU01-0001 or empty or 'auto'",'s.code_fournisseur'=>"SU01-0001 or empty or 'auto'",'s.address'=>"61 jump street",'s.zip'=>"123456",'s.town'=>"Big town",'s.fk_pays'=>'US, FR, DE...','s.phone'=>"0101010101",'s.fax'=>"0101010102",'s.url'=>"http://mycompany.com",'s.email'=>"test@mycompany.com",'s.siret'=>"",'s.siren'=>"",'s.ape'=>"",'s.idprof4'=>"",'s.idprof5'=>"",'s.idprof6'=>"",'s.tva_intra'=>"FR0123456789",'s.capital'=>"10000",'s.note_private'=>"This is an example of private note for record",'s.note_public'=>"This is an example of public note for record",'s.fk_typent'=>"2",'s.fk_effectif'=>"3","s.fk_forme_juridique"=>"1",'s.fk_prospectlevel'=>'PL_MEDIUM','s.fk_stcomm'=>'0','s.default_lang'=>'en_US','s.barcode'=>'123456789'); + $this->import_regex_array[$r]=array('s.status'=>'^[0|1]','s.client'=>'^[0|1|2|3]','s.fournisseur'=>'^[0|1]','s.fk_typent'=>'id@'.MAIN_DB_PREFIX.'c_typent','s.datec'=>'^[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]( [0-9][0-9]:[0-9][0-9]:[0-9][0-9])?$'); + $this->import_examplevalues_array[$r]=array('s.nom'=>"MyBigCompany",'s.status'=>"0 (closed) or 1 (active)",'s.client'=>'0 (no customer no prospect)/1 (customer)/2 (prospect)/3 (customer and prospect)','s.fournisseur'=>'0 or 1','s.datec'=>dol_print_date(dol_now(),'%Y-%m-%d'),'s.code_client'=>"CU01-0001 or empty or 'auto'",'s.code_fournisseur'=>"SU01-0001 or empty or 'auto'",'s.address'=>"61 jump street",'s.zip'=>"123456",'s.town'=>"Big town",'s.fk_pays'=>'US, FR, DE...','s.phone'=>"0101010101",'s.fax'=>"0101010102",'s.url'=>"http://mycompany.com",'s.email'=>"test@mycompany.com",'s.siret'=>"",'s.siren'=>"",'s.ape'=>"",'s.idprof4'=>"",'s.idprof5'=>"",'s.idprof6'=>"",'s.tva_intra'=>"FR0123456789",'s.capital'=>"10000",'s.note_private'=>"This is an example of private note for record",'s.note_public'=>"This is an example of public note for record",'s.fk_typent'=>"2",'s.fk_effectif'=>"3","s.fk_forme_juridique"=>"1",'s.fk_prospectlevel'=>'PL_MEDIUM','s.fk_stcomm'=>'0','s.default_lang'=>'en_US','s.barcode'=>'123456789','s.datec'=>"2015-01-01 or 2015-01-01 12:30:00"); // Import list of contact and attributes $r++; @@ -437,7 +437,7 @@ class modSociete extends DolibarrModules 's.fk_pays'=>array('rule'=>'fetchidfromcodeid','classfile'=>'/core/class/ccountry.class.php','class'=>'Ccountry','method'=>'fetch','dict'=>'DictionaryCountry'), ); //$this->import_convertvalue_array[$r]=array('s.fk_soc'=>array('rule'=>'lastrowid',table='t'); - $this->import_regex_array[$r]=array('s.birthday'=>'^[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]$','s.datec'=>'^[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]$'); + $this->import_regex_array[$r]=array('s.birthday'=>'^[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]$','s.datec'=>'^[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]( [0-9][0-9]:[0-9][0-9]:[0-9][0-9])?$'); $this->import_examplevalues_array[$r]=array('s.fk_soc'=>'MyBigCompany','s.civility'=>"MR",'s.lastname'=>"Smith",'s.firstname'=>'John','s.address'=>'61 jump street','s.zip'=>'75000','s.town'=>'Bigtown','s.fk_pays'=>'US, FR, DE...','s.datec'=>'1972-10-10','s.poste'=>"Director",'s.phone'=>"5551122",'s.phone_perso'=>"5551133",'s.phone_mobile'=>"5551144",'s.fax'=>"5551155",'s.email'=>"johnsmith@email.com",'s.note_private'=>"My private note",'s.note_public'=>"My public note"); // Import Bank Accounts diff --git a/htdocs/langs/en_US/errors.lang b/htdocs/langs/en_US/errors.lang index a2d73817bf1..fbfd55b9a9a 100644 --- a/htdocs/langs/en_US/errors.lang +++ b/htdocs/langs/en_US/errors.lang @@ -79,7 +79,7 @@ ErrorModuleRequireJavascript=Javascript must not be disabled to have this featur ErrorPasswordsMustMatch=Both typed passwords must match each other ErrorContactEMail=A technical error occured. Please, contact administrator to following email %s en provide the error code %s in your message, or even better by adding a screen copy of this page. ErrorWrongValueForField=Wrong value for field number %s (value '%s' does not match regex rule %s) -ErrorFieldValueNotIn=Wrong value for field number %s (value '%s' is not a value available into field %s of table %s) +ErrorFieldValueNotIn=Wrong value for field number %s (value '%s' is not a value available into field %s of table %s = %s) ErrorFieldRefNotIn=Wrong value for field number %s (value '%s' is not a %s existing ref) ErrorsOnXLines=Errors on %s source record(s) ErrorFileIsInfectedWithAVirus=The antivirus program was not able to validate the file (file might be infected by a virus) From 70c778c728100e9f9339d3e3cde87d2f158b52a7 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 24 Feb 2015 15:49:39 +0100 Subject: [PATCH 156/287] I keep this feature hidden, because according to package target, dolibarr does not contains same files. We must first find a solution before making this feature public. --- htdocs/core/menus/init_menu_auguria.sql | 2 +- htdocs/core/menus/standard/eldy.lib.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/core/menus/init_menu_auguria.sql b/htdocs/core/menus/init_menu_auguria.sql index 236669273a1..1ce84ec928c 100644 --- a/htdocs/core/menus/init_menu_auguria.sql +++ b/htdocs/core/menus/init_menu_auguria.sql @@ -39,7 +39,7 @@ insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, left insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$leftmenu=="admintools"', __HANDLER__, 'left', 201__+MAX_llx_menu__, 'home', '', 300__+MAX_llx_menu__, '/admin/system/dolibarr.php?leftmenu=admintools', 'InfoDolibarr', 1, 'admin', '', '', 2, 0, __ENTITY__); insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$leftmenu=="admintools"', __HANDLER__, 'left', 202__+MAX_llx_menu__, 'home', '', 201__+MAX_llx_menu__, '/admin/system/modules.php?leftmenu=admintools', 'Modules', 2, 'admin', '', '', 2, 2, __ENTITY__); insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$leftmenu=="admintools"', __HANDLER__, 'left', 203__+MAX_llx_menu__, 'home', '', 201__+MAX_llx_menu__, '/admin/triggers.php?leftmenu=admintools', 'Triggers', 2, 'admin', '', '', 2, 3, __ENTITY__); -insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$leftmenu=="admintools"', __HANDLER__, 'left', 204__+MAX_llx_menu__, 'home', '', 201__+MAX_llx_menu__, '/admin/system/filecheck.php?leftmenu=admintools', 'FileCheck', 2, 'admin', '', '', 2, 4, __ENTITY__); +--insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$leftmenu=="admintools"', __HANDLER__, 'left', 204__+MAX_llx_menu__, 'home', '', 201__+MAX_llx_menu__, '/admin/system/filecheck.php?leftmenu=admintools', 'FileCheck', 2, 'admin', '', '', 2, 4, __ENTITY__); insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$leftmenu=="admintools"', __HANDLER__, 'left', 205__+MAX_llx_menu__, 'home', '', 300__+MAX_llx_menu__, '/admin/system/browser.php?leftmenu=admintools', 'InfoBrowser', 1, 'admin', '', '', 2, 1, __ENTITY__); insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$leftmenu=="admintools"', __HANDLER__, 'left', 206__+MAX_llx_menu__, 'home', '', 300__+MAX_llx_menu__, '/admin/system/os.php?leftmenu=admintools', 'InfoOS', 1, 'admin', '', '', 2, 2, __ENTITY__); insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$leftmenu=="admintools"', __HANDLER__, 'left', 207__+MAX_llx_menu__, 'home', '', 300__+MAX_llx_menu__, '/admin/system/web.php?leftmenu=admintools', 'InfoWebServer', 1, 'admin', '', '', 2, 3, __ENTITY__); diff --git a/htdocs/core/menus/standard/eldy.lib.php b/htdocs/core/menus/standard/eldy.lib.php index 5e6ce3cc63b..a2ab7d0d96e 100644 --- a/htdocs/core/menus/standard/eldy.lib.php +++ b/htdocs/core/menus/standard/eldy.lib.php @@ -503,7 +503,7 @@ function print_left_eldy_menu($db,$menu_array_before,$menu_array_after,&$tabMenu $newmenu->add('/admin/system/dolibarr.php?mainmenu=home&leftmenu=admintools_info', $langs->trans('InfoDolibarr'), 1); if (empty($leftmenu) || $leftmenu=='admintools_info') $newmenu->add('/admin/system/modules.php?mainmenu=home&leftmenu=admintools_info', $langs->trans('Modules'), 2); if (empty($leftmenu) || $leftmenu=='admintools_info') $newmenu->add('/admin/triggers.php?mainmenu=home&leftmenu=admintools_info', $langs->trans('Triggers'), 2); - if (empty($leftmenu) || $leftmenu=='admintools_info') $newmenu->add('/admin/system/filecheck.php?mainmenu=home&leftmenu=admintools_info', $langs->trans('FileCheck'), 2); + //if (empty($leftmenu) || $leftmenu=='admintools_info') $newmenu->add('/admin/system/filecheck.php?mainmenu=home&leftmenu=admintools_info', $langs->trans('FileCheck'), 2); $newmenu->add('/admin/system/browser.php?mainmenu=home&leftmenu=admintools', $langs->trans('InfoBrowser'), 1); $newmenu->add('/admin/system/os.php?mainmenu=home&leftmenu=admintools', $langs->trans('InfoOS'), 1); $newmenu->add('/admin/system/web.php?mainmenu=home&leftmenu=admintools', $langs->trans('InfoWebServer'), 1); From 3e853b4129155735256969a68f6d8a0289d73737 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 24 Feb 2015 16:17:52 +0100 Subject: [PATCH 157/287] Bad comment char --- build/generate_filecheck_xml.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/generate_filecheck_xml.php b/build/generate_filecheck_xml.php index 9d5aa6f289e..04970b667f5 100644 --- a/build/generate_filecheck_xml.php +++ b/build/generate_filecheck_xml.php @@ -35,7 +35,7 @@ if (substr($sapi_type, 0, 3) == 'cgi') { // Main parse_str($argv[1]); -#$outputfile=dirname(__FILE__).'/../htdocs/install/filelist-'.$release.'.xml'; +//$outputfile=dirname(__FILE__).'/../htdocs/install/filelist-'.$release.'.xml'; $outputfile=dirname(__FILE__).'/../htdocs/install/filelist.xml'; $fp = fopen($outputfile,'w'); fputs($fp, ''."\n"); From 474a4125a4a86a03b8b97088a7441cc700a55e7a Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 24 Feb 2015 16:51:20 +0100 Subject: [PATCH 158/287] It is better to point to portal home page instead of sub page. --- README-FR.md | 5 +++-- README.md | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/README-FR.md b/README-FR.md index 8d3d7f36aa9..3f1819f6370 100644 --- a/README-FR.md +++ b/README-FR.md @@ -21,8 +21,9 @@ vous devez vous réorienter vers DoliWamp (la version tout-en-un de Dolibarr pour Windows), DoliDeb (la version tout-en-un pour Debian ou Ubuntu) ou DoliRpm (la version tout-en-un de Dolibarr pour Fedora, Redhat, OpenSuse, Mandriva ou Mageia). -Vous pouvez les télécharger à l'adresse: -http://www.dolibarr.org/downloads/ + +Vous pouvez les télécharger depuis la rubrique *download* du portail officiel: +http://www.dolibarr.org/ Si vous avez déjà installé un serveur Web avec PHP et une base de donnée (Mysql), vous pouvez installer Dolibarr avec cette version de la manière suivante: diff --git a/README.md b/README.md index 93b9d275beb..b97c14501ab 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ Dolibarr is released under the terms of the GNU General Public License as publis If you have no technical knowledge, and you are looking for an autoinstaller to install Dolibarr ERP/CRM in few clicks, you must download DoliWamp (the all-in-one package of Dolibarr for Windows), DoliDeb (the all-in-one package of Dolibarr for Debian or Ubuntu) or DoliRpm (the all-in-one package of Dolibarr for Fedora, Redhat, Opensuse, Mandriva or Mageia). -You can download this at: [Official website] () +You can download this from the download area of [Official website] () If you already have installed a Web server and a Mysql database, you can install the standard version like this: From b4f30681413d82eb629b1bde927ce2cfdb4364aa Mon Sep 17 00:00:00 2001 From: Alexis Algoud Date: Tue, 24 Feb 2015 18:20:19 +0100 Subject: [PATCH 159/287] NEW add PDF icon on linked element into project --- htdocs/core/class/html.formfile.class.php | 5 ++--- htdocs/projet/element.php | 20 +++++++++++++++++++- 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/htdocs/core/class/html.formfile.class.php b/htdocs/core/class/html.formfile.class.php index 8a47e8a0eb1..e341a992b6b 100644 --- a/htdocs/core/class/html.formfile.class.php +++ b/htdocs/core/class/html.formfile.class.php @@ -670,10 +670,9 @@ class FormFile if (! function_exists('dol_dir_list')) include_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php'; $out=''; - $this->numoffiles=0; - - $file_list=dol_dir_list($filedir, 'files', 0, preg_quote($modulesubdir.'.pdf','/'), '\.meta$|\.png$'); + + $file_list=dol_dir_list($filedir, 'files', 0, preg_quote(basename($modulesubdir).'.pdf','/'), '\.meta$|\.png$'); // For ajax treatment $out.= '
'.img_picto('', 'refresh').'
'."\n"; diff --git a/htdocs/projet/element.php b/htdocs/projet/element.php index 9569b44aceb..51db2202d2c 100644 --- a/htdocs/projet/element.php +++ b/htdocs/projet/element.php @@ -29,6 +29,7 @@ require_once DOL_DOCUMENT_ROOT.'/projet/class/project.class.php'; require_once DOL_DOCUMENT_ROOT.'/core/class/html.formprojet.class.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/project.lib.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/core/class/html.formfile.class.php'; if (! empty($conf->propal->enabled)) require_once DOL_DOCUMENT_ROOT.'/comm/propal/class/propal.class.php'; if (! empty($conf->facture->enabled)) require_once DOL_DOCUMENT_ROOT.'/compta/facture/class/facture.class.php'; if (! empty($conf->facture->enabled)) require_once DOL_DOCUMENT_ROOT.'/compta/facture/class/facture-rec.class.php'; @@ -106,6 +107,7 @@ llxHeader("",$langs->trans("Referers"),$help_url); $form = new Form($db); $formproject=new FormProjets($db); +$formfile = new FormFile($db); $userstatic=new User($db); @@ -412,7 +414,23 @@ foreach ($listofreferent as $key => $value) { print $expensereport->getNomUrl(1); } - else print $element->getNomUrl(1); + else { + print $element->getNomUrl(1); + + $element_doc = $element->element; + $filename=dol_sanitizeFileName($element->ref); + $filedir=$conf->{$element_doc}->dir_output . '/' . dol_sanitizeFileName($element->ref); + + if($element_doc === 'invoice_supplier') { + $element_doc='facture_fournisseur'; + $filename = get_exdir($element->id,2).dol_sanitizeFileName($element->ref); + $filedir = $conf->fournisseur->facture->dir_output.'/'.get_exdir($element->id,2).dol_sanitizeFileName($element->ref); + } + + print $formfile->getDocumentsLink($element_doc, $filename, $filedir); + + } + print "\n"; // Date From 5bc376394585166f5d6feeeb9fe3fac15f19914e Mon Sep 17 00:00:00 2001 From: Alexis Algoud Date: Tue, 24 Feb 2015 18:23:40 +0100 Subject: [PATCH 160/287] fix supplier order element --- htdocs/projet/element.php | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/htdocs/projet/element.php b/htdocs/projet/element.php index 51db2202d2c..f47b6cbeac6 100644 --- a/htdocs/projet/element.php +++ b/htdocs/projet/element.php @@ -421,7 +421,11 @@ foreach ($listofreferent as $key => $value) $filename=dol_sanitizeFileName($element->ref); $filedir=$conf->{$element_doc}->dir_output . '/' . dol_sanitizeFileName($element->ref); - if($element_doc === 'invoice_supplier') { + if($element_doc === 'order_supplier') { + $element_doc='commande_fournisseur'; + $filedir = $conf->fournisseur->commande->dir_output.'/'.dol_sanitizeFileName($element->ref); + } + else if($element_doc === 'invoice_supplier') { $element_doc='facture_fournisseur'; $filename = get_exdir($element->id,2).dol_sanitizeFileName($element->ref); $filedir = $conf->fournisseur->facture->dir_output.'/'.get_exdir($element->id,2).dol_sanitizeFileName($element->ref); From 89684748c586cf2484ea8e1511874b7befdbbab6 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 24 Feb 2015 19:55:59 +0100 Subject: [PATCH 161/287] Debug incdec option. --- htdocs/langs/en_US/products.lang | 2 +- htdocs/product/class/product.class.php | 35 ++-- htdocs/product/composition/card.php | 212 +++++++++++++++---------- 3 files changed, 152 insertions(+), 97 deletions(-) diff --git a/htdocs/langs/en_US/products.lang b/htdocs/langs/en_US/products.lang index 3d52da2cd03..841f497b674 100755 --- a/htdocs/langs/en_US/products.lang +++ b/htdocs/langs/en_US/products.lang @@ -251,6 +251,6 @@ PriceExpressionEditorHelp4=In product/service price only: #supplier_min_price PriceMode=Price mode PriceNumeric=Number DefaultPrice=Default price -ComposedProductDecreaseStock=Decrease Stock for sub-product +ComposedProductDIncDecStock=Increase/Decrease stock on parent change ComposedProduct=Sub-product MinSupplierPrice=Minimun supplier price diff --git a/htdocs/product/class/product.class.php b/htdocs/product/class/product.class.php index fe67938766d..43da5af3cea 100755 --- a/htdocs/product/class/product.class.php +++ b/htdocs/product/class/product.class.php @@ -2253,18 +2253,20 @@ class Product extends CommonObject } /** - * Lie un produit associe au produit/service + * Link a product/service to a parent product/service * - * @param int $id_pere Id du produit auquel sera lie le produit a lier - * @param int $id_fils Id du produit a lier + * @param int $id_pere Id of parent product/service + * @param int $id_fils Id of child product/service * @param int $qty Quantity + * @param int $incdec 1=Increase/decrease stock of child when parent stock increase/decrease * @return int < 0 if KO, > 0 if OK */ - function add_sousproduit($id_pere, $id_fils,$qty) + function add_sousproduit($id_pere, $id_fils, $qty, $incdec=1) { // Clean parameters if (! is_numeric($id_pere)) $id_pere=0; if (! is_numeric($id_fils)) $id_fils=0; + if (! is_numeric($incdec)) $incdec=0; $result=$this->del_sousproduit($id_pere, $id_fils); if ($result < 0) return $result; @@ -2290,8 +2292,8 @@ class Product extends CommonObject } else { - $sql = 'INSERT INTO '.MAIN_DB_PREFIX.'product_association(fk_product_pere,fk_product_fils,qty)'; - $sql .= ' VALUES ('.$id_pere.', '.$id_fils.', '.$qty.')'; + $sql = 'INSERT INTO '.MAIN_DB_PREFIX.'product_association(fk_product_pere,fk_product_fils,qty,incdec)'; + $sql .= ' VALUES ('.$id_pere.', '.$id_fils.', '.$qty.', '.$incdec.')'; if (! $this->db->query($sql)) { dol_print_error($this->db); @@ -2309,25 +2311,25 @@ class Product extends CommonObject /** * Modify composed product * - * @param int $id_pere Id of master product - * @param int $id_fils Id of linked product + * @param int $id_pere Id of parent product/service + * @param int $id_fils Id of child product/service * @param int $qty Quantity - * @param int $incdec increase/descrease stock or not - * * @return int < 0 if KO, > 0 if OK + * @param int $incdec 1=Increase/decrease stock of child when parent stock increase/decrease + * @return int < 0 if KO, > 0 if OK */ - function update_sousproduit($id_pere, $id_fils,$qty, $incdec=1) + function update_sousproduit($id_pere, $id_fils, $qty, $incdec=1) { // Clean parameters if (! is_numeric($id_pere)) $id_pere=0; if (! is_numeric($id_fils)) $id_fils=0; if (! is_numeric($incdec)) $incdec=1; if (! is_numeric($qty)) $qty=1; - + $sql = 'UPDATE '.MAIN_DB_PREFIX.'product_association SET '; $sql.= 'qty='.$qty; $sql.= ',incdec='.$incdec; $sql .= ' WHERE fk_product_pere='.$id_pere.' AND fk_product_fils='.$id_fils; - + if (!$this->db->query($sql)) { dol_print_error($this->db); @@ -2337,7 +2339,7 @@ class Product extends CommonObject { return 1; } - + } /** @@ -2375,7 +2377,7 @@ class Product extends CommonObject */ function is_sousproduit($fk_parent, $fk_child) { - $sql = "SELECT fk_product_pere, qty"; + $sql = "SELECT fk_product_pere, qty, incdec"; $sql.= " FROM ".MAIN_DB_PREFIX."product_association"; $sql.= " WHERE fk_product_pere = '".$fk_parent."'"; $sql.= " AND fk_product_fils = '".$fk_child."'"; @@ -2389,6 +2391,7 @@ class Product extends CommonObject { $obj = $this->db->fetch_object($result); $this->is_sousproduit_qty = $obj->qty; + $this->is_sousproduit_incdec = $obj->incdec; return true; } @@ -2668,7 +2671,7 @@ class Product extends CommonObject $type=(! empty($desc_pere[2]) ? $desc_pere[2] :''); $label=(! empty($desc_pere[3]) ? $desc_pere[3] :''); $incdec=!empty($desc_pere[4]) ? $desc_pere[4] : 0; - + if ($multiply < 1) $multiply=1; //print "XXX We add id=".$id." - label=".$label." - nb=".$nb." - multiply=".$multiply." fullpath=".$compl_path.$label."\n"; diff --git a/htdocs/product/composition/card.php b/htdocs/product/composition/card.php index 9efa7772cb0..1d551dd9ab1 100644 --- a/htdocs/product/composition/card.php +++ b/htdocs/product/composition/card.php @@ -64,18 +64,19 @@ if ($id > 0 || ! empty($ref)) * Actions */ +if ($cancel) $action =''; + // Action association d'un sousproduit -if ($action == 'add_prod' && -$cancel <> $langs->trans("Cancel") && -($user->rights->produit->creer || $user->rights->service->creer)) +if ($action == 'add_prod' && ($user->rights->produit->creer || $user->rights->service->creer)) { $error=0; for ($i=0; $i<$_POST["max_prod"]; $i++) { - if ($_POST["prod_id_chk".$i] > 0) + if ($_POST["prod_qty_".$i] > 0) { - if($product->add_sousproduit($id, $_POST["prod_id_".$i],$_POST["prod_qty_".$i]) > 0) + if ($product->add_sousproduit($id, $_POST["prod_id_".$i], $_POST["prod_qty_".$i], $_POST["prod_incdec_".$i]) > 0) { + //var_dump($id.' - '.$_POST["prod_id_".$i].' - '.$_POST["prod_qty_".$i]);exit; $action = 'edit'; } else @@ -109,25 +110,17 @@ $cancel <> $langs->trans("Cancel") && exit; } } -else if($action==='save_composed_product') { - +else if($action==='save_composed_product') +{ $TProduct = GETPOST('TProduct', 'array'); - if(!empty($TProduct)) { - - foreach ($TProduct as $id_product => $row) { + if(!empty($TProduct)) + { + foreach ($TProduct as $id_product => $row) + { $product->update_sousproduit($id, $id_product,$row['qty'], isset($row['incdec']) ? 1 : 0 ); } - } - - -} - -if ($cancel == $langs->trans("Cancel")) -{ - $action = ''; - header("Location: card.php?id=".$_POST["id"]); - exit; + $action=''; } @@ -255,94 +248,134 @@ if ($id > 0 || ! empty($ref)) $atleastonenotdefined=0; print '
'; } // Number of parent virtual products print ''; + print ''; if (count($prodsfather) > 0) { @@ -409,10 +442,11 @@ if ($id > 0 || ! empty($ref)) print ''; print '
'.$langs->trans('Ref').''; @@ -194,7 +194,7 @@ if ($object->id > 0) if ($action == 'editdelivery_address') { - $formother->form_address($_SERVER['PHP_SELF'].'?id='.$object->id,$object->fk_delivery_address,$object->socid,'fk_address','propal',$object->id); + $formother->form_address($_SERVER['PHP_SELF'].'?id='.$object->id,$object->fk_delivery_address,$object->socid,'fk_address','askpricesupplier',$object->id); } else { diff --git a/htdocs/comm/askpricesupplier/document.php b/htdocs/comm/askpricesupplier/document.php index d224c20bc97..5dd239e1cfa 100644 --- a/htdocs/comm/askpricesupplier/document.php +++ b/htdocs/comm/askpricesupplier/document.php @@ -26,8 +26,8 @@ */ require '../../main.inc.php'; -require_once DOL_DOCUMENT_ROOT.'/comm/propal/class/propal.class.php'; -require_once DOL_DOCUMENT_ROOT.'/core/lib/propal.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/comm/askpricesupplier/class/askpricesupplier.class.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/askpricesupplier.lib.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/images.lib.php'; require_once DOL_DOCUMENT_ROOT.'/core/class/html.formfile.class.php'; @@ -47,7 +47,7 @@ if (! empty($user->societe_id)) $action=''; $socid = $user->societe_id; } -$result = restrictedArea($user, 'propal', $id); +$result = restrictedArea($user, 'askpricesupplier', $id); // Get parameters $sortfield = GETPOST("sortfield",'alpha'); @@ -60,12 +60,12 @@ $pagenext = $page + 1; if (! $sortorder) $sortorder="ASC"; if (! $sortfield) $sortfield="name"; -$object = new Propal($db); +$object = new AskPriceSupplier($db); $object->fetch($id,$ref); if ($object->id > 0) { $object->fetch_thirdparty(); - $upload_dir = $conf->propal->dir_output.'/'.dol_sanitizeFileName($object->ref); + $upload_dir = $conf->askpricesupplier->dir_output.'/'.dol_sanitizeFileName($object->ref); include_once DOL_DOCUMENT_ROOT . '/core/tpl/document_actions_pre_headers.tpl.php'; } @@ -79,7 +79,7 @@ if ($object->id > 0) * View */ -llxHeader('',$langs->trans('Proposal'),'EN:Commercial_Proposals|FR:Proposition_commerciale|ES:Presupuestos'); +llxHeader('',$langs->trans('CommRequest'),'EN:Commercial_Proposals|FR:Proposition_commerciale|ES:Presupuestos'); $form = new Form($db); @@ -88,7 +88,7 @@ if ($object->id > 0) $upload_dir = $conf->propal->dir_output.'/'.dol_sanitizeFileName($object->ref); $head = propal_prepare_head($object); - dol_fiche_head($head, 'document', $langs->trans('Proposal'), 0, 'propal'); + dol_fiche_head($head, 'document', $langs->trans('CommRequest'), 0, 'askpricesupplier'); // Construit liste des fichiers $filearray=dol_dir_list($upload_dir,"files",0,'','(\.meta|_preview\.png)$',$sortfield,(strtolower($sortorder)=='desc'?SORT_DESC:SORT_ASC),1); @@ -101,7 +101,7 @@ if ($object->id > 0) print ''; - $linkback=''.$langs->trans("BackToList").''; + $linkback=''.$langs->trans("BackToList").''; // Ref print ''; print ''; print '
'.$langs->trans('Ref').''; @@ -130,8 +130,8 @@ if ($object->id > 0) print ''; - $modulepart = 'propal'; - $permission = $user->rights->propal->creer; + $modulepart = 'askpricesupplier'; + $permission = $user->rights->askpricesupplier->creer; $param = '&id=' . $object->id; include_once DOL_DOCUMENT_ROOT . '/core/tpl/document_actions_post_headers.tpl.php'; } diff --git a/htdocs/comm/askpricesupplier/info.php b/htdocs/comm/askpricesupplier/info.php index d3a3899537b..caa9f21dd1e 100644 --- a/htdocs/comm/askpricesupplier/info.php +++ b/htdocs/comm/askpricesupplier/info.php @@ -25,10 +25,10 @@ require '../../main.inc.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php'; -require_once DOL_DOCUMENT_ROOT.'/comm/propal/class/propal.class.php'; -require_once DOL_DOCUMENT_ROOT.'/core/lib/propal.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/comm/askpricesupplier/class/askpricesupplier.class.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/askpricesupplier.lib.php'; -$langs->load('propal'); +$langs->load('askpricesupplier'); $langs->load('compta'); $id=GETPOST('id','int'); @@ -36,21 +36,21 @@ $socid=GETPOST('socid','int'); // Security check if (! empty($user->societe_id)) $socid=$user->societe_id; -$result = restrictedArea($user, 'propal', $id); +$result = restrictedArea($user, 'askpricesupplier', $id); /* * View */ -llxHeader('',$langs->trans('Proposal'),'EN:Commercial_Proposals|FR:Proposition_commerciale|ES:Presupuestos'); +llxHeader('',$langs->trans('CommRequest'),'EN:Commercial_Proposals|FR:Proposition_commerciale|ES:Presupuestos'); -$object = new Propal($db); +$object = new AskPriceSupplier($db); $object->fetch($id); $object->fetch_thirdparty(); $head = propal_prepare_head($object); -dol_fiche_head($head, 'info', $langs->trans('Proposal'), 0, 'propal'); +dol_fiche_head($head, 'info', $langs->trans('CommRequest'), 0, 'askpricesupplier'); $object->info($object->id); diff --git a/htdocs/comm/askpricesupplier/list.php b/htdocs/comm/askpricesupplier/list.php index 948482fe4cd..47eb078d401 100644 --- a/htdocs/comm/askpricesupplier/list.php +++ b/htdocs/comm/askpricesupplier/list.php @@ -126,7 +126,7 @@ llxHeader('',$langs->trans('CommRequest'),'EN:Commercial_Proposals|FR:Propositio $form = new Form($db); $formother = new FormOther($db); $formfile = new FormFile($db); -$formpropal = new FormAskPriceSupplier($db); +$formaskpricesupplier = new FormAskPriceSupplier($db); $companystatic=new Societe($db); $now=dol_now(); @@ -145,7 +145,7 @@ $limit = $conf->liste_limit; $sql = 'SELECT s.rowid, s.nom as name, s.town, s.client, s.code_client,'; -$sql.= ' p.rowid as propalid, p.note_private, p.total_ht, p.ref, p.ref_client, p.fk_statut, p.fk_user_author, p.datep as dp, p.fin_validite as dfv,'; +$sql.= ' p.rowid as askpricesupplierid, p.note_private, p.total_ht, p.ref, p.ref_client, p.fk_statut, p.fk_user_author, p.datep as dp, p.fin_validite as dfv,'; if (! $user->rights->societe->client->voir && ! $socid) $sql .= " sc.fk_soc, sc.fk_user,"; $sql.= ' u.login'; $sql.= ' FROM '.MAIN_DB_PREFIX.'societe as s, '.MAIN_DB_PREFIX.'askpricesupplier as p'; @@ -322,7 +322,7 @@ if ($result) print ''; print ''; - $formpropal->selectProposalStatus($viewstatut,1); + $formaskpricesupplier->selectAskPriceSupplierStatus($viewstatut,1); print ''; @@ -366,7 +366,7 @@ if ($result) print ''; $filename=dol_sanitizeFileName($objp->ref); $filedir=$conf->propal->dir_output . '/' . dol_sanitizeFileName($objp->ref); - $urlsource=$_SERVER['PHP_SELF'].'?id='.$objp->propalid; + $urlsource=$_SERVER['PHP_SELF'].'?id='.$objp->askpricesupplierid; print $formfile->getDocumentsLink($objectstatic->element, $filename, $filedir); print '
'; diff --git a/htdocs/comm/askpricesupplier/note.php b/htdocs/comm/askpricesupplier/note.php index 9292684d06f..c7b430dff8e 100644 --- a/htdocs/comm/askpricesupplier/note.php +++ b/htdocs/comm/askpricesupplier/note.php @@ -26,10 +26,10 @@ */ require '../../main.inc.php'; -require_once DOL_DOCUMENT_ROOT.'/comm/propal/class/propal.class.php'; -require_once DOL_DOCUMENT_ROOT.'/core/lib/propal.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/comm/askpricesupplier/class/askpricesupplier.class.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/askpricesupplier.lib.php'; -$langs->load('propal'); +$langs->load('askpricesupplier'); $langs->load('compta'); $langs->load('bills'); @@ -39,7 +39,7 @@ $action=GETPOST('action','alpha'); // Security check if ($user->societe_id) $socid=$user->societe_id; -$result = restrictedArea($user, 'propale', $id, 'propal'); +$result = restrictedArea($user, 'askpricesupplier', $id, 'askpricesupplier'); $object = new Propal($db); @@ -59,7 +59,7 @@ include DOL_DOCUMENT_ROOT.'/core/actions_setnotes.inc.php'; // Must be include, /* Affichage fiche */ /******************************************************************************/ -llxHeader('',$langs->trans('Proposal'),'EN:Commercial_Proposals|FR:Proposition_commerciale|ES:Presupuestos'); +llxHeader('',$langs->trans('CommRequest'),'EN:Commercial_Proposals|FR:Proposition_commerciale|ES:Presupuestos'); $form = new Form($db); @@ -75,11 +75,11 @@ if ($id > 0 || ! empty($ref)) if ( $societe->fetch($object->socid) ) { $head = propal_prepare_head($object); - dol_fiche_head($head, 'note', $langs->trans('Proposal'), 0, 'propal'); + dol_fiche_head($head, 'note', $langs->trans('CommRequest'), 0, 'askpricesupplier'); print ''; - $linkback = ''.$langs->trans('BackToList').''; + $linkback = ''.$langs->trans('BackToList').''; // Ref print ''; - print ''; - print ''; + print ''; print ''; @@ -505,7 +505,7 @@ if (! empty($conf->propal->enabled)) print ''; - print ''; + print ''; print ''; diff --git a/htdocs/core/modules/askpricesupplier/mod_propale_marbre.php b/htdocs/core/modules/askpricesupplier/mod_askpricesupplier_marbre.php similarity index 95% rename from htdocs/core/modules/askpricesupplier/mod_propale_marbre.php rename to htdocs/core/modules/askpricesupplier/mod_askpricesupplier_marbre.php index 28260de97d8..ec5164b679c 100644 --- a/htdocs/core/modules/askpricesupplier/mod_propale_marbre.php +++ b/htdocs/core/modules/askpricesupplier/mod_askpricesupplier_marbre.php @@ -29,7 +29,7 @@ require_once DOL_DOCUMENT_ROOT .'/core/modules/propale/modules_propale.php'; /** * Class to manage customer order numbering rules Marbre */ -class mod_propale_marbre extends ModeleNumRefPropales +class mod_askpricesupplier_marbre extends ModeleNumRefAskPriceSupplier { var $version='dolibarr'; // 'development', 'experimental', 'dolibarr' var $prefix='PR'; @@ -74,7 +74,7 @@ class mod_propale_marbre extends ModeleNumRefPropales $posindice=8; $sql = "SELECT MAX(CAST(SUBSTRING(ref FROM ".$posindice.") AS SIGNED)) as max"; - $sql.= " FROM ".MAIN_DB_PREFIX."propal"; + $sql.= " FROM ".MAIN_DB_PREFIX."askpricesupplier"; $sql.= " WHERE ref LIKE '".$this->prefix."____-%'"; $sql.= " AND entity = ".$conf->entity; @@ -111,7 +111,7 @@ class mod_propale_marbre extends ModeleNumRefPropales // D'abord on recupere la valeur max $posindice=8; $sql = "SELECT MAX(CAST(SUBSTRING(ref FROM ".$posindice.") AS SIGNED)) as max"; // This is standard SQL - $sql.= " FROM ".MAIN_DB_PREFIX."propal"; + $sql.= " FROM ".MAIN_DB_PREFIX."askpricesupplier"; $sql.= " WHERE ref LIKE '".$this->prefix."____-%'"; $sql.= " AND entity = ".$conf->entity; diff --git a/htdocs/core/modules/askpricesupplier/mod_propale_saphir.php b/htdocs/core/modules/askpricesupplier/mod_askpricesupplier_saphir.php similarity index 84% rename from htdocs/core/modules/askpricesupplier/mod_propale_saphir.php rename to htdocs/core/modules/askpricesupplier/mod_askpricesupplier_saphir.php index 503d8754684..9bfffcee262 100644 --- a/htdocs/core/modules/askpricesupplier/mod_propale_saphir.php +++ b/htdocs/core/modules/askpricesupplier/mod_askpricesupplier_saphir.php @@ -25,13 +25,13 @@ * \brief File that contains the numbering module rules Saphir */ -require_once DOL_DOCUMENT_ROOT .'/core/modules/propale/modules_propale.php'; +require_once DOL_DOCUMENT_ROOT .'/core/modules/askpricesupplier/modules_propale.php'; /** * Class of file that contains the numbering module rules Saphir */ -class mod_propale_saphir extends ModeleNumRefPropales +class mod_propale_saphir extends ModeleNumRefAskPriceSupplier { var $version='dolibarr'; // 'development', 'experimental', 'dolibarr' var $error = ''; @@ -55,18 +55,18 @@ class mod_propale_saphir extends ModeleNumRefPropales $texte.= ''; $texte.= ''; $texte.= ''; - $texte.= ''; + $texte.= ''; $texte.= '
'.$langs->trans('Ref').''; @@ -122,7 +122,7 @@ if ($id > 0 || ! empty($ref)) // Date fin propal print '
'.$langs->trans('DateEndPropal').''; + print ''.$langs->trans('DateEndAsk').''; if ($object->fin_validite) { print dol_print_date($object->fin_validite,'daytext'); diff --git a/htdocs/comm/propal.php b/htdocs/comm/propal.php index 35807912c0a..a3fcfa22bc8 100644 --- a/htdocs/comm/propal.php +++ b/htdocs/comm/propal.php @@ -488,7 +488,7 @@ if (empty($reshook)) setEventMessage($langs->trans("ErrorFailedToAddContact"), 'errors'); } } - + if (! $error) { $db->commit(); diff --git a/htdocs/core/lib/askpricesupplier.lib.php b/htdocs/core/lib/askpricesupplier.lib.php index fd227d512b7..b0b9369f6ee 100644 --- a/htdocs/core/lib/askpricesupplier.lib.php +++ b/htdocs/core/lib/askpricesupplier.lib.php @@ -32,13 +32,13 @@ function propal_prepare_head($object) { global $langs, $conf, $user; - $langs->load("propal"); + $langs->load("askpricesupplier"); $langs->load("compta"); $h = 0; $head = array(); - $head[$h][0] = DOL_URL_ROOT.'/comm/propal.php?id='.$object->id; + $head[$h][0] = DOL_URL_ROOT.'/comm/askpricesupplier.php?id='.$object->id; $head[$h][1] = $langs->trans('ProposalCard'); $head[$h][2] = 'comm'; $h++; @@ -47,7 +47,7 @@ function propal_prepare_head($object) || (! empty($conf->livraison_bon->enabled) && $user->rights->expedition->livraison->lire)))) { $langs->load("sendings"); - $head[$h][0] = DOL_URL_ROOT.'/expedition/propal.php?id='.$object->id; + $head[$h][0] = DOL_URL_ROOT.'/expedition/askpricesupplier.php?id='.$object->id; if ($conf->expedition_bon->enabled) $text=$langs->trans("Shipment"); if ($conf->livraison_bon->enabled) $text.='/'.$langs->trans("Receivings"); $head[$h][1] = $text; @@ -56,7 +56,7 @@ function propal_prepare_head($object) } if (! empty($conf->global->MAIN_USE_PREVIEW_TABS)) { - $head[$h][0] = DOL_URL_ROOT.'/comm/propal/apercu.php?id='.$object->id; + $head[$h][0] = DOL_URL_ROOT.'/comm/askpricesupplier/apercu.php?id='.$object->id; $head[$h][1] = $langs->trans("Preview"); $head[$h][2] = 'preview'; $h++; @@ -64,7 +64,7 @@ function propal_prepare_head($object) if (empty($conf->global->MAIN_DISABLE_CONTACTS_TAB)) { - $head[$h][0] = DOL_URL_ROOT.'/comm/propal/contact.php?id='.$object->id; + $head[$h][0] = DOL_URL_ROOT.'/comm/askpricesupplier/contact.php?id='.$object->id; $head[$h][1] = $langs->trans('ContactsAddresses'); $head[$h][2] = 'contact'; $h++; @@ -74,14 +74,14 @@ function propal_prepare_head($object) // Entries must be declared in modules descriptor with line // $this->tabs = array('entity:+tabname:Title:@mymodule:/mymodule/mypage.php?id=__ID__'); to add new tab // $this->tabs = array('entity:-tabname); to remove a tab - complete_head_from_modules($conf,$langs,$object,$head,$h,'propal'); + complete_head_from_modules($conf,$langs,$object,$head,$h,'askpricesupplier'); if (empty($conf->global->MAIN_DISABLE_NOTES_TAB)) { $nbNote = 0; if(!empty($object->note_private)) $nbNote++; if(!empty($object->note_public)) $nbNote++; - $head[$h][0] = DOL_URL_ROOT.'/comm/propal/note.php?id='.$object->id; + $head[$h][0] = DOL_URL_ROOT.'/comm/askpricesupplier/note.php?id='.$object->id; $head[$h][1] = $langs->trans('Notes'); if ($nbNote > 0) $head[$h][1].= ' '.$nbNote.''; $head[$h][2] = 'note'; @@ -91,18 +91,18 @@ function propal_prepare_head($object) require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php'; $upload_dir = $conf->propal->dir_output . "/" . dol_sanitizeFileName($object->ref); $nbFiles = count(dol_dir_list($upload_dir,'files',0,'','(\.meta|_preview\.png)$')); - $head[$h][0] = DOL_URL_ROOT.'/comm/propal/document.php?id='.$object->id; + $head[$h][0] = DOL_URL_ROOT.'/comm/askpricesupplier/document.php?id='.$object->id; $head[$h][1] = $langs->trans('Documents'); if($nbFiles > 0) $head[$h][1].= ' '.$nbFiles.''; $head[$h][2] = 'document'; $h++; - $head[$h][0] = DOL_URL_ROOT.'/comm/propal/info.php?id='.$object->id; + $head[$h][0] = DOL_URL_ROOT.'/comm/askpricesupplier/info.php?id='.$object->id; $head[$h][1] = $langs->trans('Info'); $head[$h][2] = 'info'; $h++; - complete_head_from_modules($conf,$langs,$object,$head,$h,'propal','remove'); + complete_head_from_modules($conf,$langs,$object,$head,$h,'askpricesupplier','remove'); return $head; } @@ -119,7 +119,7 @@ function propal_admin_prepare_head() $h = 0; $head = array(); - $head[$h][0] = DOL_URL_ROOT.'/admin/propal.php'; + $head[$h][0] = DOL_URL_ROOT.'/admin/askpricesupplier.php'; $head[$h][1] = $langs->trans("Miscellaneous"); $head[$h][2] = 'general'; $h++; @@ -128,19 +128,19 @@ function propal_admin_prepare_head() // Entries must be declared in modules descriptor with line // $this->tabs = array('entity:+tabname:Title:@mymodule:/mymodule/mypage.php?id=__ID__'); to add new tab // $this->tabs = array('entity:-tabname:Title:@mymodule:/mymodule/mypage.php?id=__ID__'); to remove a tab - complete_head_from_modules($conf,$langs,null,$head,$h,'propal_admin'); + complete_head_from_modules($conf,$langs,null,$head,$h,'askpricesupplier_admin'); - $head[$h][0] = DOL_URL_ROOT.'/comm/admin/propal_extrafields.php'; + $head[$h][0] = DOL_URL_ROOT.'/comm/admin/askpricesupplier_extrafields.php'; $head[$h][1] = $langs->trans("ExtraFields"); $head[$h][2] = 'attributes'; $h++; - $head[$h][0] = DOL_URL_ROOT.'/comm/admin/propaldet_extrafields.php'; + $head[$h][0] = DOL_URL_ROOT.'/comm/admin/askpricesupplierdet_extrafields.php'; $head[$h][1] = $langs->trans("ExtraFieldsLines"); $head[$h][2] = 'attributeslines'; $h++; - complete_head_from_modules($conf,$langs,null,$head,$h,'propal_admin','remove'); + complete_head_from_modules($conf,$langs,null,$head,$h,'askpricesupplier_admin','remove'); return $head; } diff --git a/htdocs/core/tpl/document_actions_post_headers.tpl.php b/htdocs/core/tpl/document_actions_post_headers.tpl.php index d1a1cedca61..b53e9cbd073 100644 --- a/htdocs/core/tpl/document_actions_post_headers.tpl.php +++ b/htdocs/core/tpl/document_actions_post_headers.tpl.php @@ -46,7 +46,7 @@ $savingdocmask=''; if (empty($conf->global->MAIN_DISABLE_SUGGEST_REF_AS_PREFIX)) { //var_dump($modulepart); - if (in_array($modulepart,array('facture_fournisseur','commande_fournisseur','facture','commande','propal','ficheinter','contract','project','project_task'))) + if (in_array($modulepart,array('facture_fournisseur','commande_fournisseur','facture','commande','propal', 'askpricesupplier','ficheinter','contract','project','project_task'))) { $savingdocmask=$object->ref.'___file__'; } diff --git a/htdocs/core/tpl/notes.tpl.php b/htdocs/core/tpl/notes.tpl.php index 66b310da69d..5773d7ce9d8 100644 --- a/htdocs/core/tpl/notes.tpl.php +++ b/htdocs/core/tpl/notes.tpl.php @@ -50,6 +50,7 @@ if (! empty($conf->global->MAIN_AUTO_TIMESTAMP_IN_PRIVATE_NOTES)) // Special cases if ($module == 'propal') { $permission=$user->rights->propale->creer;} +elseif ($module == 'askpricesupplier') { $permission=$user->rights->askpricesupplier->creer;} elseif ($module == 'fichinter') { $permission=$user->rights->ficheinter->creer;} elseif ($module == 'project') { $permission=$user->rights->projet->creer;} elseif ($module == 'project_task') { $permission=$user->rights->projet->creer;} diff --git a/htdocs/societe/class/societe.class.php b/htdocs/societe/class/societe.class.php index 4ce603ee1ad..5b4f57ae6a4 100644 --- a/htdocs/societe/class/societe.class.php +++ b/htdocs/societe/class/societe.class.php @@ -42,7 +42,7 @@ class Societe extends CommonObject public $element='societe'; public $table_element = 'societe'; public $fk_element='fk_soc'; - protected $childtables=array("propal","commande","facture","contrat","facture_fourn","commande_fournisseur"); // To test if we can delete object + protected $childtables=array("askpricesupplier", "propal","commande","facture","contrat","facture_fourn","commande_fournisseur"); // To test if we can delete object /** * 0=No test on entity, 1=Test with field entity, 2=Test with link by societe From 778ddf269d660c8a77ccb457d7e1f53ee98483b3 Mon Sep 17 00:00:00 2001 From: phf Date: Wed, 28 Jan 2015 14:32:41 +0100 Subject: [PATCH 006/287] =?UTF-8?q?[CORE]=20maj=20des=20r=C3=A9f=C3=A9renc?= =?UTF-8?q?es=20de=20traductions=20(#new=5Fask=5Fprice).?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- htdocs/langs/fr_FR/admin.lang | 1 + htdocs/langs/fr_FR/askpricesupplier.lang | 6 +++--- htdocs/langs/fr_FR/other.lang | 1 + 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/htdocs/langs/fr_FR/admin.lang b/htdocs/langs/fr_FR/admin.lang index 4e783fafce1..e8c8f6dd1a2 100644 --- a/htdocs/langs/fr_FR/admin.lang +++ b/htdocs/langs/fr_FR/admin.lang @@ -264,6 +264,7 @@ MAIN_MAIL_EMAIL_FROM=Adresse email de l'émetteur pour l'envoi d'emails automati MAIN_MAIL_ERRORS_TO=Adresse email utilisée pour les retours d'erreurs des emails envoyés MAIN_MAIL_AUTOCOPY_TO= Envoyer systématiquement une copie cachée des emails envoyés à MAIN_MAIL_AUTOCOPY_PROPOSAL_TO= Envoyer systématiquement une copie cachée des propositions envoyées par email à +MAIN_MAIL_AUTOCOPY_ASKPRICESUPPLIER_TO= Envoyer systématiquement une copie cachée des demandes de prix envoyées par email à MAIN_MAIL_AUTOCOPY_ORDER_TO= Envoyer systématiquement une copie cachée des commandes envoyées par emails à MAIN_MAIL_AUTOCOPY_INVOICE_TO= Envoyer systématiquement une copie cachée des factures envoyées par email à MAIN_DISABLE_ALL_MAILS=Désactiver globalement tout envoi d'emails (pour mode test ou démos) diff --git a/htdocs/langs/fr_FR/askpricesupplier.lang b/htdocs/langs/fr_FR/askpricesupplier.lang index c67e37dc7c5..863d3749dca 100644 --- a/htdocs/langs/fr_FR/askpricesupplier.lang +++ b/htdocs/langs/fr_FR/askpricesupplier.lang @@ -22,7 +22,7 @@ NewPropal=Nouvelle proposition Prospect=Prospect ProspectList=Liste des prospects ConfirmDeleteProp=Êtes-vous sûr de vouloir effacer cette proposition commerciale ? -ConfirmValidateProp=Êtes-vous sûr de vouloir valider cette proposition commerciale sous la référence %s ? + LastPropals=Les %s dernières propales LastClosedProposals=Les %s dernières propositions commerciales fermées LastModifiedProposals=Les %s dernières propositions commerciales modifiées @@ -36,7 +36,6 @@ NbOfProposals=Nombre de propositions commerciales # # Ajout -ShowAskpricesupplier=Afficher demande CommRequest=Demande de prix CommRequests=Demandes de prix SearchRequest=Rechercher une demande @@ -47,6 +46,7 @@ AskPriceSupplierArea=Espace des demandes de prix fournisseurs NewAskPrice=Nouvelle demande de prix NewAsk=Nouvelle demande # # Modifié +ConfirmValidateAsk=Êtes-vous sûr de vouloir valider cette demande de prix sous la référence %s ? DateAsk=Date de demande DateEndAsk=Date de fin de validité DateEndAskShort=Date de fin @@ -86,11 +86,11 @@ ListOfAskPriceSupplier=Liste des devis/propositions commerciales TypeContact_askpricesupplier_internal_SALESREPFOLL=Commercial suivi demande TypeContact_askpricesupplier_external_BILLING=Contact client facturation demande TypeContact_askpricesupplier_external_CUSTOMER=Contact client suivi demande +ActionsOnAskPriceSupplier=Événements sur la demande # # -ActionsOnPropal=Événements sur la proposition NoOpenedPropals=Pas de proposition ouverte NoOtherOpenedPropals=Pas d'autre proposition brouillon RefProposal=Réf. proposition commerciale diff --git a/htdocs/langs/fr_FR/other.lang b/htdocs/langs/fr_FR/other.lang index 1c23cce68cb..972fc5425fd 100644 --- a/htdocs/langs/fr_FR/other.lang +++ b/htdocs/langs/fr_FR/other.lang @@ -60,6 +60,7 @@ PredefinedMailTestHtml=Ceci est un message de test (le mot test doit êtr PredefinedMailContentSendInvoice=__CONTACTCIVNAME__\n\nVeuillez trouver ci-joint la facture __FACREF__\n\n__PERSONALIZED__Cordialement\n\n__SIGNATURE__ PredefinedMailContentSendInvoiceReminder=__CONTACTCIVNAME__ \n\nNous voudrions porter à votre connaissance que la facture __FACREF__ ne semble pas avoir été réglée. La voici donc, pour rappel, en pièce jointe.\n\n__PERSONALIZED__Cordialement\n\n__SIGNATURE__ PredefinedMailContentSendProposal=__CONTACTCIVNAME__\n\nVeuillez trouver ci-joint la proposition commerciale __PROPREF__\n\n__PERSONALIZED__Cordialement\n\n__SIGNATURE__ +PredefinedMailContentSendAskPriceSupplier=__CONTACTCIVNAME__\n\nVeuillez trouver ci-joint la demande commerciale __ASKREF__\n\n__PERSONALIZED__Cordialement\n\n__SIGNATURE__ PredefinedMailContentSendOrder=__CONTACTCIVNAME__\n\nVeuillez trouver ci-joint la commande __ORDERREF__\n\n__PERSONALIZED__Cordialement\n\n__SIGNATURE__ PredefinedMailContentSendSupplierOrder=__CONTACTCIVNAME__\n\nVeuillez trouver ci-joint notre commande __ORDERREF__\n\n__PERSONALIZED__Cordialement\n\n__SIGNATURE__ PredefinedMailContentSendSupplierInvoice=__CONTACTCIVNAME__\n\nVeuillez trouver ci-joint la facture __FACREF__\n\n__PERSONALIZED__Cordialement\n\n__SIGNATURE__ From ec621244f39302befb2c588dde94fdc7f4814cf1 Mon Sep 17 00:00:00 2001 From: phf Date: Wed, 28 Jan 2015 14:34:27 +0100 Subject: [PATCH 007/287] =?UTF-8?q?[CORE]=20ajouts=20des=20conditions=20sp?= =?UTF-8?q?=C3=A9cifiques=20pour=20les=20appels=20depuis=20l'objet=20AskPr?= =?UTF-8?q?iceSupplier=20(#new=5Fask=5Fprice).?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- htdocs/core/class/commonobject.class.php | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/htdocs/core/class/commonobject.class.php b/htdocs/core/class/commonobject.class.php index dc39692f08e..e035d0342c2 100644 --- a/htdocs/core/class/commonobject.class.php +++ b/htdocs/core/class/commonobject.class.php @@ -1768,7 +1768,7 @@ abstract class CommonObject // Specific code for backward compatibility with old field names if ($this->element == 'facture' || $this->element == 'facturerec') $fieldht='total'; if ($this->element == 'facture_fourn' || $this->element == 'invoice_supplier') $fieldtva='total_tva'; - if ($this->element == 'propal') $fieldttc='total'; + if ($this->element == 'propal' || $this->element == 'askpricesupplier') $fieldttc='total'; if (empty($nodatabaseupdate)) { @@ -1958,6 +1958,9 @@ abstract class CommonObject else if ($objecttype == 'propal') { $classpath = 'comm/propal/class'; } + else if ($objecttype == 'askpricesupplier') { + $classpath = 'comm/askpricesupplier/class'; + } else if ($objecttype == 'shipping') { $classpath = 'expedition/class'; $subelement = 'expedition'; $module = 'expedition_bon'; } @@ -2473,6 +2476,10 @@ abstract class CommonObject $tplpath = 'comm/'.$element; if (empty($conf->propal->enabled)) continue; // Do not show if module disabled } + else if ($objecttype == 'askpricesupplier') { + $tplpath = 'comm/'.$element; + if (empty($conf->askpricesupplier->enabled)) continue; // Do not show if module disabled + } else if ($objecttype == 'shipping') { $tplpath = 'expedition'; if (empty($conf->expedition->enabled)) continue; // Do not show if module disabled From a9d26efee8ae3aec9cdc57c34b12f6e896a65b93 Mon Sep 17 00:00:00 2001 From: phf Date: Wed, 28 Jan 2015 14:44:48 +0100 Subject: [PATCH 008/287] [CORE] ajout des conditions pour un element de type askpricesupplier (#new_ask_price). --- htdocs/core/class/html.formactions.class.php | 1 + htdocs/core/class/html.formmail.class.php | 3 +++ 2 files changed, 4 insertions(+) diff --git a/htdocs/core/class/html.formactions.class.php b/htdocs/core/class/html.formactions.class.php index 333969fc3b3..cfab0e52b7c 100644 --- a/htdocs/core/class/html.formactions.class.php +++ b/htdocs/core/class/html.formactions.class.php @@ -171,6 +171,7 @@ class FormActions if ($typeelement == 'invoice') $title=$langs->trans('ActionsOnBill'); elseif ($typeelement == 'invoice_supplier' || $typeelement == 'supplier_invoice') $title=$langs->trans('ActionsOnBill'); elseif ($typeelement == 'propal') $title=$langs->trans('ActionsOnPropal'); + elseif ($typeelement == 'askpricesupplier') $title=$langs->trans('ActionsOnAskPriceSupplier'); elseif ($typeelement == 'order') $title=$langs->trans('ActionsOnOrder'); elseif ($typeelement == 'order_supplier' || $typeelement == 'supplier_order') $title=$langs->trans('ActionsOnOrder'); elseif ($typeelement == 'project') $title=$langs->trans('ActionsOnProject'); diff --git a/htdocs/core/class/html.formmail.class.php b/htdocs/core/class/html.formmail.class.php index 07edb962371..118bb0462b6 100644 --- a/htdocs/core/class/html.formmail.class.php +++ b/htdocs/core/class/html.formmail.class.php @@ -477,6 +477,7 @@ class FormMail $showinfobcc=''; if (! empty($conf->global->MAIN_MAIL_AUTOCOPY_PROPOSAL_TO) && ! empty($this->param['models']) && $this->param['models'] == 'propal_send') $showinfobcc=$conf->global->MAIN_MAIL_AUTOCOPY_PROPOSAL_TO; + if (! empty($conf->global->MAIN_MAIL_AUTOCOPY_ASKPRICESUPPLIER_TO) && ! empty($this->param['models']) && $this->param['models'] == 'askpricesupplier_send') $showinfobcc=$conf->global->MAIN_MAIL_AUTOCOPY_ASKPRICESUPPLIER_TO; if (! empty($conf->global->MAIN_MAIL_AUTOCOPY_ORDER_TO) && ! empty($this->param['models']) && $this->param['models'] == 'order_send') $showinfobcc=$conf->global->MAIN_MAIL_AUTOCOPY_ORDER_TO; if (! empty($conf->global->MAIN_MAIL_AUTOCOPY_INVOICE_TO) && ! empty($this->param['models']) && $this->param['models'] == 'facture_send') $showinfobcc=$conf->global->MAIN_MAIL_AUTOCOPY_INVOICE_TO; if ($showinfobcc) $out.=' + '.$showinfobcc; @@ -496,6 +497,7 @@ class FormMail { $defaultvaluefordeliveryreceipt=0; if (! empty($conf->global->MAIL_FORCE_DELIVERY_RECEIPT_PROPAL) && ! empty($this->param['models']) && $this->param['models'] == 'propal_send') $defaultvaluefordeliveryreceipt=1; + if (! empty($conf->global->MAIL_FORCE_DELIVERY_RECEIPT_ASKPRICESUPPLIER) && ! empty($this->param['models']) && $this->param['models'] == 'askpricesupplier_send') $defaultvaluefordeliveryreceipt=1; if (! empty($conf->global->MAIL_FORCE_DELIVERY_RECEIPT_ORDER) && ! empty($this->param['models']) && $this->param['models'] == 'order_send') $defaultvaluefordeliveryreceipt=1; if (! empty($conf->global->MAIL_FORCE_DELIVERY_RECEIPT_INVOICE) && ! empty($this->param['models']) && $this->param['models'] == 'facture_send') $defaultvaluefordeliveryreceipt=1; $out.= $form->selectyesno('deliveryreceipt', (isset($_POST["deliveryreceipt"])?$_POST["deliveryreceipt"]:$defaultvaluefordeliveryreceipt), 1); @@ -718,6 +720,7 @@ class FormMail if ($type_template=='facture_send') { $defaultmessage=$outputlangs->transnoentities("PredefinedMailContentSendInvoice"); } elseif ($type_template=='facture_relance') { $defaultmessage=$outputlangs->transnoentities("PredefinedMailContentSendInvoiceReminder"); } elseif ($type_template=='propal_send') { $defaultmessage=$outputlangs->transnoentities("PredefinedMailContentSendProposal"); } + elseif ($type_template=='askpricesupplier_send') { $defaultmessage=$outputlangs->transnoentities("PredefinedMailContentSendAskPriceSupplier"); } elseif ($type_template=='order_send') { $defaultmessage=$outputlangs->transnoentities("PredefinedMailContentSendOrder"); } elseif ($type_template=='order_supplier_send') { $defaultmessage=$outputlangs->transnoentities("PredefinedMailContentSendSupplierOrder"); } elseif ($type_template=='invoice_supplier_send') { $defaultmessage=$outputlangs->transnoentities("PredefinedMailContentSendSupplierInvoice"); } From 3644f4c84cd2dfed1f7a41eef1c3ca2a86ee6752 Mon Sep 17 00:00:00 2001 From: phf Date: Wed, 28 Jan 2015 14:48:59 +0100 Subject: [PATCH 009/287] [CORE] renomage de masse (#new_ask_price). --- htdocs/comm/askpricesupplier.php | 10 +++++----- .../class/askpricesupplier.class.php | 4 ++-- htdocs/comm/askpricesupplier/index.php | 4 ++-- ...bre.php => mod_askpricesupplier_marbre.php} | 6 +++--- ...hir.php => mod_askpricesupplier_saphir.php} | 18 +++++++++--------- .../modules_askpricesupplier.php | 4 ++-- .../core/modules/modAskPriceSupplier.class.php | 2 +- 7 files changed, 24 insertions(+), 24 deletions(-) rename htdocs/core/modules/askpricesupplier/{mod_propale_marbre.php => mod_askpricesupplier_marbre.php} (95%) rename htdocs/core/modules/askpricesupplier/{mod_propale_saphir.php => mod_askpricesupplier_saphir.php} (84%) diff --git a/htdocs/comm/askpricesupplier.php b/htdocs/comm/askpricesupplier.php index 1cdd560bb49..855f84a72d8 100644 --- a/htdocs/comm/askpricesupplier.php +++ b/htdocs/comm/askpricesupplier.php @@ -33,7 +33,7 @@ require '../main.inc.php'; require_once DOL_DOCUMENT_ROOT . '/core/class/html.formother.class.php'; require_once DOL_DOCUMENT_ROOT . '/core/class/html.formfile.class.php'; -require_once DOL_DOCUMENT_ROOT . '/core/class/html.formpropal.class.php'; +require_once DOL_DOCUMENT_ROOT . '/core/class/html.formaskpricesupplier.class.php'; require_once DOL_DOCUMENT_ROOT . '/comm/askpricesupplier/class/askpricesupplier.class.php'; require_once DOL_DOCUMENT_ROOT . '/comm/action/class/actioncomm.class.php'; require_once DOL_DOCUMENT_ROOT . '/core/modules/askpricesupplier/modules_askpricesupplier.php'; @@ -1497,8 +1497,8 @@ if ($action == 'create') $i = 0; while ($i < $num) { $row = $db->fetch_row($resql); - $propalRefAndSocName = $row [1] . " - " . $row [2]; - $liste_ask [$row [0]] = $propalRefAndSocName; + $askPriceSupplierRefAndSocName = $row [1] . " - " . $row [2]; + $liste_ask [$row [0]] = $askPriceSupplierRefAndSocName; $i ++; } print $form->selectarray("copie_askpricesupplier", $liste_ask, 0); @@ -1579,7 +1579,7 @@ if ($action == 'create') $soc->fetch($object->socid); $head = propal_prepare_head($object); - dol_fiche_head($head, 'comm', $langs->trans('CommRequest'), 0, 'CommRequest'); + dol_fiche_head($head, 'comm', $langs->trans('CommRequest'), 0, 'askpricesupplier'); $formconfirm = ''; @@ -2308,7 +2308,7 @@ if ($action == 'create') // Tableau des parametres complementaires $formmail->param['action'] = 'send'; - $formmail->param['models'] = 'propal_send'; + $formmail->param['models'] = 'askpricesupplier_send'; $formmail->param['id'] = $object->id; $formmail->param['returnurl'] = $_SERVER["PHP_SELF"] . '?id=' . $object->id; // Init list of files diff --git a/htdocs/comm/askpricesupplier/class/askpricesupplier.class.php b/htdocs/comm/askpricesupplier/class/askpricesupplier.class.php index b2c7fc4dfb2..2deb897a192 100644 --- a/htdocs/comm/askpricesupplier/class/askpricesupplier.class.php +++ b/htdocs/comm/askpricesupplier/class/askpricesupplier.class.php @@ -1093,7 +1093,7 @@ class AskPriceSupplier extends CommonObject $sql.= ", dr.code as demand_reason_code, dr.label as demand_reason"; $sql.= ", cr.code as cond_reglement_code, cr.libelle as cond_reglement, cr.libelle_facture as cond_reglement_libelle_doc"; $sql.= ", cp.code as mode_reglement_code, cp.libelle as mode_reglement"; - $sql.= " FROM ".MAIN_DB_PREFIX."c_propalst as c, ".MAIN_DB_PREFIX."propal as p"; + $sql.= " FROM ".MAIN_DB_PREFIX."c_propalst as c, ".MAIN_DB_PREFIX."askpricesupplier as p"; $sql.= ' LEFT JOIN '.MAIN_DB_PREFIX.'c_paiement as cp ON p.fk_mode_reglement = cp.id'; $sql.= ' LEFT JOIN '.MAIN_DB_PREFIX.'c_payment_term as cr ON p.fk_cond_reglement = cr.rowid'; $sql.= ' LEFT JOIN '.MAIN_DB_PREFIX.'c_availability as ca ON p.fk_availability = ca.rowid'; @@ -2664,7 +2664,7 @@ class AskPriceSupplier extends CommonObject { $obj = $this->db->fetch_object($resql); - $this->lines[$i] = new PropaleLigne($this->db); + $this->lines[$i] = new AskPriceSupplierLigne($this->db); $this->lines[$i]->id = $obj->rowid; // for backward compatibility $this->lines[$i]->rowid = $obj->rowid; $this->lines[$i]->label = $obj->custom_label; diff --git a/htdocs/comm/askpricesupplier/index.php b/htdocs/comm/askpricesupplier/index.php index dcd3436bd25..ef9a37f145c 100644 --- a/htdocs/comm/askpricesupplier/index.php +++ b/htdocs/comm/askpricesupplier/index.php @@ -433,7 +433,7 @@ if (! empty($conf->propal->enabled)) print ''.img_object($langs->trans("ShowCompany"),"company").' '.dol_trunc($obj->name,24).''.img_object($langs->trans("ShowAskPriceSupplier"),"askpricesupplier").' '.dol_trunc($obj->name,24).''.$askpricesupplierstatic->LibStatut($obj->fk_statut,$obj->facture,5).''.img_object($langs->trans("ShowCompany"),"company").' '.$obj->name.''.img_object($langs->trans("ShowAskPriceSupplier"),"askpricesupplier").' '.$obj->name.''.$askpricesupplierstatic->LibStatut($obj->fk_statut,$obj->facture,5).'
'; - $tooltip=$langs->trans("GenericMaskCodes",$langs->transnoentities("Proposal"),$langs->transnoentities("Proposal")); + $tooltip=$langs->trans("GenericMaskCodes",$langs->transnoentities("CommRequest"),$langs->transnoentities("CommRequest")); $tooltip.=$langs->trans("GenericMaskCodes2"); $tooltip.=$langs->trans("GenericMaskCodes3"); - $tooltip.=$langs->trans("GenericMaskCodes4a",$langs->transnoentities("Proposal"),$langs->transnoentities("Proposal")); + $tooltip.=$langs->trans("GenericMaskCodes4a",$langs->transnoentities("CommRequest"),$langs->transnoentities("CommRequest")); $tooltip.=$langs->trans("GenericMaskCodes5"); // Parametrage du prefix $texte.= ''; - $texte.= ''; + $texte.= ''; $texte.= ''; @@ -106,14 +106,14 @@ class mod_propale_saphir extends ModeleNumRefPropales * @param Propal $propal Object commercial proposal * @return string Value if OK, 0 if KO */ - function getNextValue($objsoc,$propal) + function getNextValue($objsoc,$askpricesupplier) { global $db,$conf; require_once DOL_DOCUMENT_ROOT .'/core/lib/functions2.lib.php'; // On defini critere recherche compteur - $mask=$conf->global->PROPALE_SAPHIR_MASK; + $mask=$conf->global->ASKPRICESUPPLIER_SAPHIR_MASK; if (! $mask) { @@ -121,7 +121,7 @@ class mod_propale_saphir extends ModeleNumRefPropales return 0; } - $date=$propal->datep; + $date=$askpricesupplier->datep; $customercode=$objsoc->code_client; $numFinal=get_next_value($db,$mask,'propal','ref','',$customercode,$date); diff --git a/htdocs/core/modules/askpricesupplier/modules_askpricesupplier.php b/htdocs/core/modules/askpricesupplier/modules_askpricesupplier.php index 1662e9a45bf..b9efd387da5 100644 --- a/htdocs/core/modules/askpricesupplier/modules_askpricesupplier.php +++ b/htdocs/core/modules/askpricesupplier/modules_askpricesupplier.php @@ -86,7 +86,7 @@ abstract class ModeleNumRefAskPriceSupplier function info() { global $langs; - $langs->load("propale"); + $langs->load("askpricesupplier"); return $langs->trans("NoDescription"); } @@ -98,7 +98,7 @@ abstract class ModeleNumRefAskPriceSupplier function getExample() { global $langs; - $langs->load("propale"); + $langs->load("askpricesupplier"); return $langs->trans("NoExample"); } diff --git a/htdocs/core/modules/modAskPriceSupplier.class.php b/htdocs/core/modules/modAskPriceSupplier.class.php index e9b4359ee85..f0cf2a7a40f 100644 --- a/htdocs/core/modules/modAskPriceSupplier.class.php +++ b/htdocs/core/modules/modAskPriceSupplier.class.php @@ -82,7 +82,7 @@ class modAskPriceSupplier extends DolibarrModules $this->const[$r][0] = "ASKPRICESUPPLIER_ADDON"; $this->const[$r][1] = "chaine"; - $this->const[$r][2] = "mod_propale_marbre"; + $this->const[$r][2] = "mod_askpricesupplier_marbre"; $this->const[$r][3] = 'Nom du gestionnaire de numerotation des demandes de prix fournisseurs'; $this->const[$r][4] = 0; $r++; From d134fa6a323b3bffaadf6cdf0f800f4b2d70fa78 Mon Sep 17 00:00:00 2001 From: phf Date: Wed, 28 Jan 2015 15:33:52 +0100 Subject: [PATCH 010/287] [CORE] copie du odt propal pour le module askpricesupplier (#new_ask_price). --- .../doctemplates/askpricesupplier/index.html | 0 .../askpricesupplier/template_proposal.odt | Bin 0 -> 25866 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 htdocs/install/doctemplates/askpricesupplier/index.html create mode 100644 htdocs/install/doctemplates/askpricesupplier/template_proposal.odt diff --git a/htdocs/install/doctemplates/askpricesupplier/index.html b/htdocs/install/doctemplates/askpricesupplier/index.html new file mode 100644 index 00000000000..e69de29bb2d diff --git a/htdocs/install/doctemplates/askpricesupplier/template_proposal.odt b/htdocs/install/doctemplates/askpricesupplier/template_proposal.odt new file mode 100644 index 0000000000000000000000000000000000000000..8ece83c989c9ff688337dbb0edf6febd47eb0dcf GIT binary patch literal 25866 zcmbTc1yo$i@-K|LLvVL@cXx-NfdIqcFu1#0aF^f?!QCOaLxKl)cbCUG_n!Oi`(&-} z|IJ!^rgzn^OS)@U@9r8^1xP3?FfceUurKab;)a9lNHkzzV1Hd7Brsb`TcERtJ}(0LV{x@JWd<2LSvoO;?16TsAb^W4(9W6J8R+h;`hN(EwSNsVhXMop>-t+5 z(Ak*T-PT4>nAx?;#jhU646lezknOfSJ3z2`;lxE^37ZFAf1euvx0)YJg zXkhv<#hCP?tDO`7zgR-#E{=Bmf7`-uXKV{};&%q{|F=>6|BdGVThYHL?lzWo)~R%pgZ|7B)UUK9;|^3iuDs-o?@8Z?SLQhL5{+TmL`rsmA`|5g@c)kQqj`R#r>-eFZWk&PSXEkezkW5Spfmg zEF4^{wrrH*E|xZ?O#kTk-{Ssq72pW`muO=b$B$Vg{oBQVi2u_6pRjXs{_xVt*%Cnd zw{OnICN@AO0LaD8`6G78|3$R4H8%eb@gto7MuJTKvgRM?KUDkwLbCrGX>aUkZ0=}m zZ}AV9jg|M`EH{v&=|5Bs9*hQnvpYoc(_W=lGw& zIsbzH`)T0+Yn=c0-G8R+Z}PvA5gZ)c-R3^wDwxI{y{KPJbn&PCX^3Enc+F z^J>{gWm#G3OjUS|P$UjT*<61`t9|Mdn1=Y@%yK9f=OsYMOz13NbR!LdpR+=h@2ert zs;{Bs)(&#g9_@L@^&H1Jl&L>i>YTv2$FCn>ymAQqR<}(1AWOq=DbZy$W{i-8@>LF8 z%8r*#1z6PTVicVWQW+r(c*KYRamNcs=Q%%0ChHgwdv}ksc{r$lXjfc6zBv0jL|W+y zb+@*b6}v6O!qC!qdzMz59NzyxbJ!m4iesX7(Gn17uQXflO#Ds09#Xu=HSeGU>UL;% zjPucK2^b#SGj&;FKAogUz2!l3AO>)yw?f;GSZr*L2y;uNZ_m_3nA1yZ} zLc1nJ%dmptii)xAXg^5d?9;EVr!PKbp+in+U=+w`D@zP#+f|)WB&t!j{Y+g8-mBS=yywzo`v~VNh(Rk53 zvS=@i4beiW3lG1z30yajg`5HS@^iz9kUh~We1OQ=IrW>^YBg4J5R{*(*}N$}KIve0y_EHyxx}B41K7i^IhVc zX>XN=%|u{oV9D2(bRqV1))`8syCZsg3Z1krBk*z6;2ML+QTyx4JR0$RylL%H0DWDM z+Cl^(r)kGGtIU|OnlIh< zQ3jeF1B2GGR>|R9TJl;5TmAmoWCi>xY-ssBdsSie>vebBzy=+snUe!p)!But5npo1 z#F|+7UkL=t9%{8cT{&*;JX4=W)a1xdkR3mzKU__mkX3dIFG-+fA=4IEBq?Xb!+#IKM zfc+q?gd@dN*kY}9%higolG zn5a;k0$ZV`s?weq+yBWHF@&@cp3YKVN4JJ=Y^1a3jK}Ryy1eG}o;<wUVJ%;L>6zT|?{60eYCF^r`^;9B zgi%y^+Dm7X5#KN84rNk|DPfs7iz$W7+9=w;w4+T=If}(VJisGF(7pvx#2j)g5xflh zVw{Ymh@Nh}%thPP52$^j=Q7c_r6~J)R9Np#V_>@JKZ#MaNcRLBc&wNhM{TKiI9hR? zJ#Z8~Ml44=q?UDUOhXb)I{#_*q8$Ke!h_PE*$O;r4pqK$3XedD1Q^Z5=nXmziQ+Xb zyUwHT?<|ENnUaRjBfHjI^pLem1+Qpa#5$(1vCT-MK z^8|5!g`w0S^H#elwTc2RXMU3FUd_oW7w|hO-Fy90bcv{{01L+lcgboG4F<+a0S5N} zo~aQ(GBp5X=ls_T=0~DF{qkx@(2D-vty23NT&j9lKE?Fe=Jq6LJJt|Pz!kH|LJbR| zaV$CQg!x|f2had5S7i?NIMI3db=p^sT-$Z)3qF*xEARETJ#QACfpYC*#&IvaVg6HlHeaTJ4_?_Wxi99t+c1?4bz`e zI*fkhx5&7JkhFljuqufqW#b~TQH9|}vYhwCB?}BewK~o?{mj66!}o`WmJ&UuknAj$ z$n@%#FC}3oZ6yN!lxy4=@d& zcY*ctdhXn5?de<`?lO`z(lT=6t`it`bBvnH9kJ+HI0p~=c3zaZ7sGe%Py1Q2(&NwQ3{m}?-n1DutiE%JwoQugXg9Op5z6eR`6jLm>&)C) zXx!u8ZBY3ZU2C_m=SUJCk`t?TbdP*y@q#8-J-^}16X5680K|Gmbs)D`RQUZw(RclR zTu}Xt`5c(?a)%UV1gE3LIH2z!DaniGeuhqAmExKCSpbr|TP!cStIN8JH0yl!*5w2Z zM;D|vT;)ahh3)NO+RJjXO~mjlk7-6>8vhUgcDp6k`HT1i!V2Ky%M| zTc6J$n%|OhpH`kxIj^WJw1i%XGY$prrZ9}SHR}CaR}T&?Q>;eg z3A=6mhr)fO8o}_qFJbVfA`BCQ=A`fC?$bgC=K`$;cz37l{kbB%51T4X&OVO^Z76L) z1>f3;iB5@{)NWtkHHB71Rtv5CP)+;@3|NQ_7CO&nW>7PoiOx{<$~+&T%!Ke!crtI@ zr$GhBzY`BUYor#884RW}f)Y-R)~m}A3iI=ciIn26jR!3V+tf)ARwB;@ryOEp1?srO z?do*@9G?*}RL7AgwWciz-vwLoh6fLnseCzZ7rHGO9vHSku^~fth-b8DFmRO*iQ}@S z_{v?^2PW%p<__!`WXo*tOJzI9A--KQN>vl7TG5Ok_){oV{Nx(u`*w=*y0t>|wA(Cj zQ?bu>V{4;g5!tTi8HFan5t{EY4+iByUqyT(c?97_dpBTO!-Ln4;s>O6FVz;edj7nM zacr%fnPbo}24uJ{ZBTXtprHJI)FZzX-V1bB$n58Ye1Tx}o4t&iLd;w_N&{zAxOJo# ztk&R>IGu(F*1U$GA!aM;(oaypxA_T=u)s4Gq(>rBi1cJe?5jmn8e{l%>XoJ3Tv#FU zx=;d&_nSsWSmC;J%6!xQT$1Af!Nx{9uK!EqZVDB~?hH5|fwvPt*ztFz$XWkB&)HD| zG9BVhts&qy3oe33ety@$sI_qay3MST7@5>`^AqaS)DbizD~p*hyh9W5XM`{P31@Y? z5$pId&c&LsNALJ*OGZx_z+0Lr)_jszza#wOv$FX;^Y5$M)z*&Jqm68azFadk-S_(J z&mdZ*Tak0(!BYO={l4)f1((8BIR;>Hs}zaL`Yq?}JcvI3zWW44amb+AW9J9+{g*q} zh%w|Q=B=S|7s&oy5WZvPWkup`i&*P#tNw4$Jn-ac`R2}Omc*e^=@deWK2?dejt9P zAzE}P+xz*m+FN8#bsb*3e~%ccXK+cX_K#{|>pJ_*JgK0`uh|CrZXmmJyY=q|CDSu74aUL=#agtp%0o_l zOb=1w$9E=3iW_;dMhxxR)&WkfDY+?al{ETBo%Z;r_Br6`jxqv&`b3J{&BvZ^$oJLM7ph-X5L2Y^nCPeAnhg#fiapdI=||n zG8`1f<7=>g-dE8z;lg)-uZ!eN!ILo$}6Qp}p5 z6&jBPz};y>ax#>bj~F!SPAEl!f&!q4;TYpdsYe?VF8U)hF;Wys60w$+99dv`;5DPG zH>PbnlHr)btH$e*a~(A26J)Yx^zW5L7t0Qc5_{72gZ1JPv9Q=jE5@_4nMG7suEzaG1v|+{tU4iJ5Gho#?TK$&gg+* z>J3#g>Q6CxRx*0tL*zggv=A4th;m&FcC`?k_M%MqYRJ&PYkFNMSuvxi&S~6cko_^w zfDrH|{;Bd*9BiEsnML$n@#3^DmpV5k|*OlB)^F@OZ8#ioz zNM&6=U%ri3Cvk)&kXo!K@ckYqR|6L`0{HUNzM% zH(h7K^u(M8Q+l)9ZnC7^_d$XL_jauBUUK+OR%;r$1mb3!<=mIhZDlEPa%$?+rK36; zGFad%$+*bS((PCIc`X*&dYo9;r=yXf`T0P(8CBH=MjHIc2-hM>0NG4=G%q71pI%Hx z8x@r3%l-QM48O+6B*v(Wolv$0BwOyPeUcWUmsL z9iaaaI6I`|b)Nzb)XYF)e0DfxuGg>oGVh{7@oux5xBYY56;F@HRPAaeX`DZ%P))Ba zLWhNFxt8ZQ1z6ecwdd_=$IMk3f)BKFZgUy#m0seii7!$Xwg;J#27SMYeKC4p`ofKMYuzxo~trdG2=8<>wNbOcyw<&3L}%uShN8E%%NI#K?bRcNcM zqWu20_6qZMrduR~9G|*JzQ0F~vq%2X(Ec3HCwEyuKQIbL)(QWIhK@Rfm?;i>tZo7(+P2M9mwCT}+-a(CFrO)#kP2UZB?Pyy^ z;4;%rz99Ue*ebbQMRFA)1Vn{8Vh&u{Dmjt|6mzC5jP95fyYEITyg@&TI=k|`+Q7sY zbuIJDo2SY)^3&N))-*q5k&(I?93|4(wEogYmOI!Av*V2Q+_#e87Tbiv$}l}rW}j&K zB0%7*>~>zTd51?&NPCZvDy*$C;xm0x_B60L_YVHo{$VK2#0~c2Ag4~}pZ&u>XV@S` z7s*)xFtEQa+>iZ(riF{GiJh^fjT4LWKTT$PJM#!tWf^1ye1s1OvYf1>`p0i07#KJh z9K=V|CiJ!bV|Z+ zf5_{8i&^uk;(sC3!ijp|2bGQLudUa^A+|A4vB8SB%8#h!gZMobX8jGC(H(^|8>-qD zDPI8mkSi_`1_2;;Nv)azZRd-M@Qx(8OB#zj`YKvOn5G=CSJHE%Y(x*T5eqa}N{-T%{888V>Vk7JRtwcA% z0FS%1t?zfJg2UOci|av;*P?&ardLp0&!9+r;K~vFaUiD;{V@;_p#7Dhm$~ip;D)*V zPv@VtivrJAM9=uaRQ;tP**JPv1bPzjdR~a#r4ZL>VRTJZJ)z+aNlDSrupzHtu_re~ zdqA)%o#4zqV3R^{hS{)PO&NBA&_A2;zFQ7 zRkdHN@&bgu29}F&>_X#eDgGzBhnhw7E+`9dCLPhDSLNCnX@1 zopcm(hAG#FY*7}BC!WMSU|RMfkcU?n$}u%SsT%xFdaRxSG0sos9_hZtFW0BH7LWqD zZeSEJ_ZTw#PSE4MbBr^;ot%;wtII;f(B$ni?69BU7eF=KJX9qz?j{&TiqQcO2ya?1 z`@`PzZW5k6YW74zy6(wtNgxYhl&H~lcVph`469G?I5Hy{6%p3!GcSDy_;G7}gp=Fj zSu^wGQgo^paJysoOa-+RGp~mRs$F^CR$tk!4)lZVdBE!XWc2QD54|Wt`UU(B6;2!1 z@16BxY>H^jE2woZk8xmA0DjEmH6KC_8`%tv`*Qeh+n3fFB?~P~UGEv<6@(>MSJ1L` zkZ!p995+N_h*ABUwO}zw&nP9y*MZAqjNC6e#!tqq+X_4TeaEveMyktVfyv3!)PMTU zMz|cfSX7%B4O73dj}t@L*-4fEe)d+JKRCPRs~@_iAjLCNkG%thK4{_wp_ENKs1mcQ zI3+Jw4VObC-$~kiGXz}Uvr)SI`YLJM(sq`bSS2zxQo;RG`_&!EbYR|K-vmr0`(ixf z;x3gXUA!-$?i%S_Ggu@QH&BqckpI@KR#@8ifMYHCg%p2)5+{?5^V|rO&~z{ds;S?y zqMvY}{HE=ln_n+6yK=v+R<9FzZ=Uc9!MR{Z=yPqlIQa;!DM%4#Vl;sE!{C_edG_~W z>l9Ga+w(af|WR?a%yWN$JU_MG1&WFnT)j77Fn6 zL|&WuN0n#ClMN7BUOW@anyq|mv@Lhn@u2RGlt7GNC_REN^TzCDSnTnujOA~Q)LR2M z`D0bcT9Ff!d=9%3V!O$op*lW9v}h2u1Jdt?zQSLwnbgX$d>Z9a#Fi&RAMW#Q57hKk zI11``o2VZ~{Qksw5tf*enjpU;*op!K_zJ(wUeZ&rxg1aSsg4W;Ewqxyhg^>^UB5UG zACe4&^0>8qfA^#6G#+zBsV)R zc3_QvqqtqDmSwN&a86DcQUgb-dzwFWrQrIR6WqV?^kDYh!pZ{BH~2JFc&ipad^DIL zJn!S+)2vqnlZ!*=({b7Ngl%I=KDWBeJXDD8fTXD6Lq+E3!H!=Gj4Ob17Rq%eSPsVe zoy{DvemZFQ!;LknhzAqT)F)N;aO`q0mv!)r-txiQ;}0JPQ&Q2nU6~f^nZlsaFmJ2+ znA@U3mVB>zP#1d9^S+I@*k7l6NHx zStOqFF!MqIyW9U}0J~l_X3!oNqIc9{+vGz@Az(}Uc{H=cPvk*S%jDhoz^U3?#9V0f z-J*5dwB~mTG>n~#(d0{MZqoQYNl(nMQDaoYzV}AQbNn6B7lXHrn$+dC@k{p%Cyk)5 z-qr(AlgMl7$GnW*n?UOoi~tVDb=h+f?nruf2L(rfgws~2j{aTWd8JMD{<5L{4ZApz^DVQG~Xny96s$Aoja=(1P_o%NhI5qt(T43pj(YmN2*`Bd45DYtU$AGs%Q7rZ#9 zpUU^-%A8#73VhuPGYRz^?zX~2@UT0sM$ICrJ4n-ARp#i)2E*aKeM>)$^Kl?`=(~Ae zv+GMKCg@gk7(2)Z;71MRE9wP}L<37E$Q!sUmKp3uF_RwbSunIivUqT3bf~@>BLyj+ ziojq#yyVg_>zNC@^j+h)Kfff;X*J<}bbD+-S9(8e&j{+vRp{q4(D^8$K)ulsJS^Ow3sWNA?>cdJCRw-jmq^3v z$jBiF7QX=qOc(A`X6m>4O*)>fin=0v=Ot}EZy(n0x?!a2p&5y6`|JMEU77JLV6oh` zDc)^)M<;m9ULI3Iz!Y)<$oJPS2P^SW6uB^1M^%s$f0w{b2v+wNa4k6X4a%)GsN}J? z)sps*7>XiQ>dX(9RrzLW6uN3+`5i4th6A?q+>eBMTBPQL7RA=iQ*l2&K}cpMk2?9_ zrHT)gIdbNct%uyr{Mr!a4AVYy(gLodD`Q+koby53sKNm7wxMq!@S)_#-7t_okN;?< z@(1YN39?*aogc5p(vngyIwOkJe`Tn8ZRW=C@wmPj+Z1YBY`oZi{(S11jq^R+NU*v~ zTTC2MomOH_tHS!nD#aBIVsfwX)>nlV%JtxJT1y~miX?f$;g-hp@qpn>!w&}Jr?e9! zKMxILC)c){(KRP;BrSE1FtkxHY2Ed29BeAUrc(heH73*Ir#w@CSqM+LYC3==XLnuM ztt=`%JH|Sb310Ot?NWDS?P_=nV===#JdfJZP<(js3hvo5C`W~4>EaXHbFl$xwwAgy zJiK%ch%;lMK1~3`Yd>X&2lRwlvjYX6Fs`tQ*hT-Q98^PF(`t`m5&CpSF$1z7x^RRY zw$>pnLP$c77JMg1P)#4ABPN23Osz=)Tpc3VpS7hS=#zBIcuKn>6l2zl=V?=9loduU zhZ<9q0TzEnvN~k(GB`|vsj6AIa7sqzaO9s#hBKRn8Oz6g>9KVJQ&f&SSJ96rDFCq( z(a4UH=CY6yNOw6WndX#6Pv+V!or0{azMh0vGybc`c$R34^)PZ*e>3X{c=D^ zk`ay3-bnnn|2vwSqjOzKfrtGZft$K zqr3XlRE-)Mel$u@R%^;=eAy&3URN%0L(s{zGk_{=@*0Qo<>di#xOrj)Ru)fTA#5ea zx4r9qr_Tj@`HQuu?6L&gu(r>$N)i0E>kexu56>yQ7d+x``Nr|XguH6`q^lFJkV>)< zj;Lml;4cl_TwDwfetOAXlJaR#MN*w}2#LdBW6@LNj#<((8uNCtGfl}&bmO(ZE`uW> zgSii+W)EQNqz?#x1V{;g@|NyASpD^`8{O@9AQ1Kb*w56kQ280LQATB59F|!>nUU#F z_i+m&x7Y%M5p~rUkxqyEUM<(YNU1D>Z#yq9e4D)awa>FEslKh$h+pf-mDK+b@lq6a zMvtYplMiXroC|wxbO!N;NV3^3wV8goZX6ZH;-LGc=XsJM#wog3Xqj3hQtPyo1;>7c z`YwGLi;Uh-cw|7r8C=!n_v&3Q4+I;}Q=|N8$`&w%%8@aizrp5Mr6Mi6zRS;z0MMkL zMk+=PA)ANyff&BJBQ6`pt(>bDj9INPt&G z{LG(DSIkfA6L-tOF13Hllf*)(4V*REa{hFH?7rJ#S7S_Q|CU)-$oCFo#oV+&xC+h{|_ zQ|c-xg?<0@F%70Iagzm_v+S6bq2eQg0( zek-a)y=1Yp>Ah6BBRnsvUg=8kx=6&7PL5A$bGIzsJd&!2N=Mi6*~m0V9SD!&6Ztiu zNg!GBey~$d8$M-4voAAvBoKSPY`r-iF8DSRpbuv*r!K8ysn>v;CSp1OS z>!J8-+_ZOwVxl;AfWYaYJ8R!@Zyb;pkz4UlKw_7k)nKQxkX$jk*pREsuqTV^qp^DW zdck3x6ej$xea#s)FO`N$sJ_e8XZUz4$t7gYw!g0;pG2skQIIi$Fq(#r4JUQJvl0K$ zKfSUxQLz_~HzRMC+4FOl(?wp5j~79?Ok07H+KV*56vUZkyQ3Tc*Q1km=-!GTMT&8Y zK!stiYN6&@6~%f#tm+uj+F0K>V?OAOxkjV2_F0Ci{D!(#7LO3>&&19~-b2Af5$d%- zaL42!Vh!6aR60t-_lfIjtCh&1r} zy3k=g*w0kZv4B;nd47$V8T-Xwe=g$ubla}slTNLWJp4zftw&JGQ@2jG28t?Oiq-W( zl}dK*!PwXZ^Fb4O#?^f*po`z&y86q5lftp?^o%b zghgjVUmM{0-UK;ED8-H=0#3@ zd0T{kU&y`$kj=7s1}w7(N$&w~`sxED%U~DdO_|yXWX^a*c{3^-(MQ=h%Rx49612J7 zOQF&cFoWb8D5wJ@PQ*IGvcN?lluxIW*4LS_B%ldjS`lA=G~O{iF!D}sTa6YMpEoC* z@yllV)U>cFcrz5PDAwy6ZnFbtYSgLmb$MnImO8}|>SA}E@5@dzsx>Zn^-WUDr|P*u zCi^s7W4a1)xVCrg=JDgk;*Y_yTbkd?aM+`G?){ z678thzF7bx2{=V;4!_FI-9Z>XesJq&@f3s7SRG`~3&Z83@!F=L***jhK3ODO&&?^f^&M}FyY({O+UCBy?qNuW^+ z3LiuZ9D-FDAR*w!pFDIzsN4)xTUOUz*{Ebqd}|_fpjD>Wl+YNHuFpT`cPs8p#E`>< zlfUUGPfO;$H)f-ZW$^Y6u`OPp*3V5MLj8E!byxFaMc(rQmPY8JPw3B4WQ&vER14+* zv{~LAe5{+vJ_Y;qhy>M*P!sS+Oiw?>+jp8n;@x6iPIHE?o3W)`*NN>(aHXM=>Jo#@ zUl3D7jUQ`D@muxEdZxo^IpNn`lvtOHIV*(R|W3~8HC zzQU4EAHH}>u3q)9v+x@|1u2R;`LvHBm0*2WQrmWn?110BZ0CL7y2$r_v_+1@!-A;A zxA7fr=%`P^2)_$zS%tDBv?+ zIaPc3d923M&ok|t1~K6`^Pbw7vLN$4&;XT`*JP4{LszA4h4w7-i7?Z|2=Lf01>Q6( z7fo`t9BVZaK(dgEId zUYMC}cj}8+r3*E`PIR%QnF@Ldta;-aJ;hjHwi}wVB>P44bWD4f1{t|R7y6Oq!yk5V zq<(X z+@TO*Yi=TN*6->gOlcWoMo|#^^YcbsFaUKUKJR=`QtdOnUTZVmHvam4)Q5abGH;W6@I{kH5jq3uBV=Epm0(5wct&0i zJ6RWoO_c`Gkw*wI9i*=Gs*MPBXf)}r>bTqn)V~vI9?ddI5Vcwo4u2jb-+_fGf!-Xc z!(>5Je8JrrTklB5{cyP)gWgDGy+8kQQ?tI#;7`u_Ku{J7Ot~UVnE5foBK^s zYpfngY=mPa3-6vfj(zHv-I}XUf>$%e#fVin>BbS{=I%dcNmR78Y^5@RbsL+A?)f`)1RSoOs@*5cl0Wuc}** zYUd{li=tJBrgN#y+J5yDnH5Y-oeH|(XTOzS^JJXtNwgThr&7bIARY8mYYZg(yuH9} z85#VdTNL7St@BPb#%6@Uouk#LPPY}FP4P3-kD+CjO5i>$@VQD)ZX&S5>3B#=FAT%`X2K3_;ueKE7h*Lm3I#A5#`+zJ=OZs$ru0g@8m*z#t+yg~%pq(i~z8 zZ$&xCIss2GBqA8|9$mv}E9KE949KPPmG>{`66&q_H%*>5B+>$EW@cDPq zG}9Oa)BXu|!S5jYvJH74ML)%*Oj=vl4*mLp@_AWGWV-eog3jfZ4%X}j!&)6 z4=^LtLKj(O3=;8F&|K^xXT`&zCTG{jbCoRA*faUmoSOXvS7;JQx5=@SF+4$uix`k2 zT(rsQlJ<49*tkg2@w0F|UbrYKKS>&SrAp$R)D~= z=vg^XW!cEIu@BcC&$fq9e_KCIuKEHJUfSzE*i3E$e<+^KC+QaW^uDQWO~urr+d3Z` zd>eGsM*#_@Q}@f!l;K=DW>a=#_~PfoQx#g`(6uiZ7r4{Fa}&Th|z|A_D!@I~WETemyrsf?0gy}ll^R0MHf1kS`eIeFX7 zrn^VGpU~sPBt;`l?ZlQv)61pmm<$e)ien9-a2>XF&_N}Nm$C&0ge1|#{jdS-A#$!+ zK>TK5Bo8d)+LY6&k~e2fS7P<@n7vqhYd*eqK4jdnGC^XSsf+0^hYdw*Y4*<++Ux&CfPh(>6Y6iRRxg_B77_u zpA9Tq5d6HlqgLI})ZJTrI^ zOEP#Zi>_mIINC<-csQC$p2<{VeM=J*#PkcMX6|6g3_v5LJHh8yC>x1L0+vw)Q+oXb%=pKk(S^6m+0bS*@ zui<`WKgufCyr5UAK{@Mv7OZL6FNjqR=Uxl46m0shQMIR;>q5I1EG}-QZ)8pwfvwMD zey7qe3hec}IU$+0Z&Znu#Sb%bC#)pjmXN#a->Fsw-oqP zAzo6CR;J#KW||#KK{QcbB_Kb#U5tmV=|14A<*7yyD4=)`q=K{i24o;US{d0|J6x$> zi>(~gPjO9m^dX4PZwrjk3mTIB5cSvi1ZX$8MgA1_L=*gd39F^G@J9;cP*ED!PZ9fG zdA)A(izVyO1LjjiiQ+m$EnVnLFi*spsE>f|s)Wzj+8bDzm>Cq~rsnaAr5R>SIMoNo zl1KQKDFt;&PN%p4ZaT+a1NXM9t*J=MO%_F?dUa;<9#d%F7~mBVKDI4jw< z4dMkpX?gA~EqJ+gw5h`0o|-zG-<-nhDyq}!n}L~LVjZuL4jv}XN~z?r)yP}Twzyrw zQn1p67RMcnO=}L3aCR5+rby=nZ67CwnQzAe%JC{myVrH-znol#{W#qz6JCkbn7kZn zjI8;ruT3?hh8ZC;zMP)(CIS-4Z}Gbw6Fb)HRZn&3p?FH65V{`drH^+X3@zfB`l5=+ zLWoYqY$!bUd^MvlogSxRQ;c1FHI>~))N;GD!62peH4%$h0@c7R(vo@kDb0pdyLGtj z>{su?n+=nfZmqcMUWG~DDyPYah%eUUxMZqM6>gaBrG7o_BJ5LkZ7;CZ&!6G+&7LEH#C0qBez@8wAwsYBF{Fe>hU=zhw#Xl)ePZX7ni2#uO^ zGAt?P2Kbssf9(AtbZ=Ha_W!XmAz(G$e*p8_OL9@qmfKqkyaagackI@bRRZ3B%322G z6xFY;&zDm^;SC@#y5PYIw!ekhzKfP*LuNPI+r#t@M5exmp4bc{BT*J!$SZ~xF>9bq zRlbu6zD-RyX;`0nT+XpIpnh>HtE4V(P~F;y+X4F`zifLRv}(?{_{`|HHt z1yu4YoG@3`w-@Q)^1Yqy?JdAL3N3*^590DXT2&bao zLOGf*;PN8CZieNRPh@KodrZ*nUBGSUt0!%kCX}~CSwgktf6vy5PlDI^ zWiaN4p^eEq1={w|!+Yg&v4)G905S6WW!b)n+*e$uYx_oFL2lJp!dP`1h2 z*Y(coO_gdAHOkJ*2}HVsCl$Zv*<&f;oaFA@_orL!Dd|&z+P7H^zn4Ph-JCFDY@gQ| zw@=Z9qUU`)+C1J5Ogw(j!1JjtmLF%28;SCA3qSf7&0Sx)H@4*7R+DE!t*4lUUiL#% zTeC4{fSSXiJd zrR1Ea@dEZFpZi)wd%!7BZomm!>IN)EnF&TQV_DQncIfu~R+k$zLuV5H$>YDqFr79* z4JjT7ECE8Z$?NhbX_|9xPFsv^4 z@jdrvm>0U5Xpt0t=;~l9LFkzXq=TEH=sNp;=R?+Zn4kBO-`j6(BAISwK-UiM+rrmV z23X>gYUlK+$6?pFUQcuXyG9`?*Uh+5%iUOMp%4Ve5M$epGFflX>qp?G)5y$`9RmVc zxqTCRE!Z=_P~6V35pzTrjW)incR$B5uBJ{c-KhUKM9IM?GEx%YhRb-0wT&}a*O#7( zM2)&Ut4MyLe$svSEgziI#zH?Vi${uXz3+*lYW34SUU(m4uMmJea~59ucg2O;YFH?I zMxZe@6N}n&Z!jqoWQEDS>mGYiA)}{`et8j>IGVAwQcK|UbnFNH?bM_*z?x%ci-)x# zesp=OJUnb4>5N2LP06x|oSufk=%RhNB1RWKg5(qkdnTYq(m~mAH&ijmhj<-$u7<=F z@D>1+ajlloy2Lu#`6iO_7 zHl$~+DEZWd{ZquHQHEIq{g~W%3+Op9)T1MMnuT;8USO^@-5X z(DVyM;AO{3)gO#1bT((|y|T(Kj(vINyGJTdJdbY+)nl`+f*GW(4->w?-n(bn>C z0YuM}N929OPj?h7IYxrA2^wGlmS-tp0|fLTOBF$*qh3;;W$K#j2L@VCD4guPU(}Xt zeweGxBs@_ot)AeGFIOA3<6dQc)Biq7b2A*&e<gE;Le=Ci>0_ z4>A<1U$R}5jX@2a(m;E$cgFy)`oYA*s$mJ$P<$v4sS>P`pBeI*KT@Y*-PyU8xk$(z4AElZx5)h@agP0Ae-Bl#Y{p>G8oXJ&enfd#RvktuGf;;q_DR)sQ$;L(uMUyH*QUaSmsct!U581o$ynmQ&FU7YBQ4dEE}7bY>XVj9AloGdV6Wew4S5O$jnw1L-9c|hz5-m z&g8b)g!aOlSh$Z4&dM&$(D!iuDR(O!=WFnaPk2K1>mx`s;(nB}fS z7L*)mdK649m$Qo2%Zsa@_`3M{syp@qnJKQ$TFv`Cw3q|n0pEL}22~n;sxY1!+O?Q< z>pKd4QogWjh=OHnt5JzpIV_jYGVV9!Ce{zed2vIaD&k(FeXJlC#thA&Wb5bZt)>%K zZLwdR(k|z5j2l174Bywp9g2I|FtvqJh=*AQsyv>yztL*9nrHIpW~qK0x6d2IqDnKY z@N;bj%}<6>shsuwdPqgr+6zZzT)AIxbKdNdiyp(lFH$^2978qpxq_V?`KRIlbZf~H z1u6JCp6_n&+wzT=i+H*j@$}to1(|2LQgB9&-uZaz$+gTKXV<4`c$P`(x-^xkO_+u- z`#MuWwh`R-*uD+?cX2^f0w}vW{iswjd5tpuV4U;7ZWZ$W5eN9OfFQogaW5FPGOg2Z5x+`&$4sXZ!6RsLv}s4j z?z%xOc}+@$X%Y|B=W0RL$OFktkh|I_95|n&=?cW<2ts5U{t8kWiRcIGTn-*|kS&3K1A>$QF2*8J-85CqcG(18vt`+?LDochEigOQR7bP;D@A@N0WH7ks z37Qqs4ET-QdgzLm$Tp$(Vr#9(_ELsu%6xKp;PT3ZGA*3!UPMT9KIYE7lh^alUeWlS z&ok#WVED+h)a)F2wHO4@ZN6U@{G+aY6V)V^s;h(c`TcdKOIN`}PbRMM*CgQFk5$!5 z|7uBKUVUX)2P;0ty4}4&4L@yk@m7xOoAgog9JZ|=-!jc-9b%j`}z6t+cX!O-X+ zP&sY2pj~W>)?Fb_b)}mYtG&j&Y_3M8U5h-Q8p)b}!Sx__qwFh>dKT&Yd~w1B9C=Htd_@*92&}H{o=ScS25sge8}eNW~|mRq0V7jcd+_Qu0Cx3pWWto8ZxV5lDW;X#aHyqgLF)AY8?zbX$+ z0kXtZ)ow%U3+ifAecl zn;?P^xKOHM|WG?q^pQFa>nbI}>y~|Gx zsOAI!8T!zV;j*iZ=LI>31~q{slp`lk>&!A&8f@laTd_`{w<@ds&$0#1o{Q@j#DY(G zoDEJwBt>4NyWi!<@!Tiv4ZNJW>Vs6P;JV?(@wT6%*wwcw?T)Yt&B)c9zurS1r%r9R z(%mJ@J9SG(77>@;Be=U-xYZoLiZEV_|xYpO$m5gXnQ8`gg zjLfmoI4TUT6$9o9piw%*n;evrT^Vj*n=+~Jd!AQW(mbv66_8}42F*7c!qV0H1yY&J zeS!ifk5eOn-$(M7#mzr9;eRqoYn&E}Ff+b2S3s~KQ+uJ~s?(AxDutwv}c5jun(?9?gb;f z-Pxgc@bRLw=}SG+w^7TFWB$QsUejS$R+9={92!MVOML#x!!#qK9Fnl1ZE-#>pit!V zO4&|9$H8U&J9B|lQRK8CS8D_hLU+j}cz0@jOsivL9_PuQSJ{WFVCz>EtJL4hAZ@Fz~KL7l2+qw|-s-y0DZ{}|ua1`qF|zGEv0 zDc;;T#<{HVdA!M^6u8?b-qATtcTqa%zCXtWBtmR?;pCv zGq^ao0Sm8-dLcO#jARQi*j7m;qk!SkM>7kbrHsoe!W*@X^b{*Tde`^48SjpIQCvX5 zA5F)~A+$xIk9PN`kY{|PD`2iw@%J%^LR)ufJ%zuOHj}%&3@+O_(W@652)0q*(3P%$ zuB$Id<+8WP9_a?v8BKpSa+gXqvLUZUSv!R!0o#bFl0*b4KZKZXL!z&?oSB&i5?|ea zu@<0LuU%dEbT&{wJ9T8{DQEff7S28zp6tYnVmoRG&9c>Ne4$xE0Q8QkZ%d$dtor!P0%is^c# zxW0^?IjOJSFf?-qKRE6w(K#ES!*X6`mcorEenu~{H`8~XqLvg%;NXsXCU{B;za0N% zUL^@y3Sn0TssmqKhcmni>{vC0Z!!B3bYgL(zL9K0cbS0+&OhXBIkN7Fo&yCwQgM zW9#3NnxY1(piT)k2rjg4>5gj1>NWQFAI0ZA7+$$XuJ2#OZc3=W*Z;}r+w};0-zcyx zxS1qV=rw1`Y+PDU3k`Mp;yd8xt2Y&@!-?&#=ifsOE%z^X5-`xW*$VJr(fCt`9~RHP z5=!dAHpJjr8(q`9Gki*$6`$z@aR52oPqRmSLfZ@oR$2jdiJ*UM!lJ|1XiQ~|%!W?* z#p%;#5o(LJpwWJ8D)^*?Vn46j+^}!LOf02#IrqR8sqv$?PP)o?cb%D3gh-?De9j|R(es=G-HtyHhw<^YLl=v?z( z+NLKnHwYmuO#XoTJd?aKH9WkWrs$*gAo@i;&{7`L{eBG&;fP#r#$Bz%yg6`1`C2in zFjfqMKFiCIMBPV}skEwTn7CF29|cp=IkDJCw%)1|LMlEOz3s^<&oQrb<-t;j6PCi6 zStQ?&oa5=XzL*6;XYu=51l{I{wkH+jbYZ&hb!C=0Z1+Cjoj!etp)~RR8=e0&&z&yI z?#F@iGfgF)28-CE_H+b``gE{4Av;12fkZdcPup5zZ$JTjG;(%|)t`tVhOLn*l#FUu z4a^|$$uwIURC+o3E0yTGh^tiXdR9hI?QXwc3o@2*K~Y7D$r zQwXl?uDx*Wu7s%z<0aW+$5~H?^`guo^QCH(O;OzrbGqO2aBiq2zR+hNtw|&wOZv>Q z6AR^NpI*y4H5Dsgh#j{z{kRv727+Y1;kdm8dVU^#7U{~+*PKj*Df^_oV2dNX2iyYK znxo`0F*C>+tNg|iU=ofIhb6cPBx*KZX4E+(AoF}?(Sa=@>t0mqt#6ugpejC37Ab{O z^y-3xCkOVkLwY5>GBv-oYes8hFx&L~Ofb;cgG?+ig z+jItG%ms3YGs*%wGch`Gur+wkXWL{^TE35}T&x`vYuzQa%eC1{?J$4B-+LXicw1Gh ze$op}Y$1}>1hx|%z8bH7``G_xB2GBn!|y=ng=EtMoQ8m0LEJJ9_9rlaI~utGEe5z;~w*G>GUD2_|??P?q(>p2EU9CSVz zHBr96eYSlb0v%AaCHoZ4jajt0d{Ez-g94)V*dXM#5>5a`m0c`;&VGmSn=X*y!aVGW z`L^pzhS43fM>37ZdwKSsfpiME5uCOTE}%{@iObzvNpFhBpfifC^Qe@KL!~LO)3@Fy zF@3C34w>e71T^ntKQn#IC8_aVXmatve?Asl+Oi;?b3h`W>`El1fYs3?@8Ig_hNoc3 z0s}~yy(j6r72dOo_`OVM1w z`{thTrQw-?d+d93$STipkxXL1$&M7n8+WjmT)Q1Fy-xMDONf~`fU{efnP}M=#+(B8 zABV;TrEbis*;Npe$8h+JGG8c*Yq4=Sc(GH4#@>F^ZsZ2$;xOMoMkQ@shyN}*W|mhq z7)Ew9ZqLfEHu7ITR7}5qAGiGtw4^jmf47Pma%5;pMb(062X)-QUVtA_X`>b}Szk8h zGnJ&a;i|2*;y~UcX;5gTaMt$4Cp{v)pGadj>FKM9$r7n%{&+Nzcf6+d7+%fr!GHP5 zh#pO5AKj%U3+KJR!G^>;u!z>QvoNn>X7@RYFyLL&DqKG3S&Zv5pxm*T(fot==yp@K zrwx{==PK;HhY%|Hx!HW-BtB#mYuMF7g$_|PnDK!lnFp)?x;x8NT*w_F$W&9$;`hz2 zM(s~ev=2MNJkMW*=opP}nscdKGc#n1gau!;Ob>OP)O#{rGiS|x{m?sxe=|9*TjOTr zn1FBX_3jY8cj`Klwe3=q!cuQ7?Sh=XS{c9#1 z6lyO#{SK^Syi)F3dHW#A>92O!cOK7HnQcD^jRlJyHFO3B;S}_ks`^eoYRF{dh^2S;p_8yK`^%ByuX zW8{FFtUKuR67HFGr|m3|@e8G_QT0Y$&L|&M1oyBn0Hw|7L@{$1Z_HAfyc?IeYu)mK zT?wwIUY>~jf2gx*c7Le30XG`~pshz3d!|5^Cd7n#Vx8g$glr5fL8Ue;rFavnhgnMRS; z%~Yv6?De(1uv^|(+@SBxG{S@DhZcVNSnUl2S7x6(EIxUNxwec=@`X;W=?HWg zCGpMR)+ITnPRMtZKhJdg|GyP^L-27&<+wB9zBYWWE|R>o%Ht|Yld!+m5ke@wIhgu7 zd&1@TOwDa9%`HqUSXazVOfXk0OiXIgc;FgD7?}6tJSvFcYa(8M@5|BD$=1r!-GkH3 z!fGsa%qg6UFyc@o(sF!O0)U3*#yZ?$2kPdJ(nSM&%_jcbnV71rURb^hnqIGx;ayH_ zczIw-Js4M4+Vh0Z{66!roXy)EcHuV8mZAmW`PoKxx@?+byYM0qTdTJdn~-rvB*#Ns zhY$7ntUlRL5!H6a9;mZN(HhvIuKhLTD<7K8alUF1#N%nM6ZILJCLuk-i^Ovf=ssmr=r(q@10sY_0!SKGK~B;NtA!=>nJ2^aT7f z?Z3m({Ra0B*+qANq^*aesf+vHfPc494`*iw7gHxohyN0X(1Y}JH#2qn8yxj-f`zM7 zTDw`g{~t)ijP*aK2NCJtZ|`>~L_Ys}l$C=sTn6;VzWq);5upwH=Lk*B&EbNm|B&kh zz;6XbXlf$#x={XcTEW*xLd>a0*k7Mkhp4Py}*GUoUB0fH-K`*pziPuwb)* zpvhaLhjvyuWRx>`#~0rwrm=-7=9auMbWgKiD&JzLAf_q2+c&d8k1npi8lTLz>*_kq zx&S3LHqPv}@<6IhU+m+;_Svd@)#@9@xGz^{!G8AysB&s7*-`?>v6a)rtd$Z>-10KC zn`2Mwbg|2u^~w0G?aES%SoK!#aY&s^KCqOHugjal6MR)UCr|J?e)hd#D{W^Ta&*0> ze3H~XCNe?166d~&p?m4i6X;_G70Z1`Vm05#eRyM2;@J|vzJ4qyHa;Nfw7xSkqUcbV z-XkB$e#XOF$`_;e-i7cG^jxqI=B+7%&H_LF@me`|bJNAx;7_X5ep&z0_ySm926K@F@a@n4@Q@1O};cw$GuxYx6 zDXW=79C&=69c&{7wquJcRAu3=3~BjD))$%?ZaghScA`WHt3in>lT}>wsNNdTt<#Wu zN>N8)lpFF|FWm_E+WPxWqz1v#FyBE$m=N@i2HvgL)PlgEPo?6YE`nq5O0jK=wp#5I zK7q{Bh#t5m_f-v}rw5XCoLL4i`a>t-EWV*mQ>8Up6{LOv6)s&@Ts#zOQp`26b|Ii-w+OM7g8GW8YWIg2!p|5grVfL5VUx zjhx`b;x#!F(|$go%KRapoQ>DL?uw;(MW0HBx8ia28L*K6P+8x z*pZf{GdMQUDg!#`SAuRGOpS*h-RSxr$uskhMz-q_^F;|t{aVQ1oj4!Vg@Olq8l zqk0;0mCzTp<+?)3MiWH@z?Ascetg=Kim%f#8)iuP-K^y#wO+~Gbgi(SN#~!DPJJk( zeI-@HaCF=xql!g6tq$z&M{W}>nXG&iV%H(w7I(FP7O&U#)nC^0TIzAyfm9gZxb7Ez ze^Gs$EFRlM+l%D6D#{o3vUa6DA;4j42r#dZn~erkMwGoK!cc_e&Lg1 zb!QphAl`D)OpH|n3}{hj@VsSkmU57nS+zOH;c^m2C5 z7P~qFa+$jwM%ts&3q~korn%qln=luvoExlde6_J5@KKChJKZ;qr!yjhm6d*A)_vVA zVA6H0W338$KhfS)qS(2#LvMJ?zA8u4wL7?rH(7QAddMicej_faVNn6RLkN^yDUE6E zkJMR0D@)bHN~cc2D8EE4D;t=Rv~SOP#Ln|Nl$EyKT1m5Eg-)$+A6)6)hDr67d%13I zZv&rTAylM!m0wxRnVEDhtr?0<#+vpP(8`Zd&V`?`DwKA)y!bG3d%bYFt0zfUJ#4*m zB!Oe_p>Hj~uyZK1@x{=2V<}shCbX+#GQb@jn@f0*D6za)5goXvzh|Z^#`A#XjSWX# zgKLUG=po8wA2`MlDg65h6Qt3E<@SD?@e7cM9jRn_y+FlnW7|=(RP8v}rib0BZX|2@ z1HNJUXITwRDAW=7k1RwELaBXYt8KPO4`l@HaXq&VJ5@$?XXaufS&RfUX`pObSwgc9 zZyL$x%lX!2cM5S0tKHL`I z<6gY&{r+UXCHjlP#M)eZm(Uo2w+wWBKQDS)f0A(?`}3=v0igNih406A9vrsZj%d!~ zCsR+kMX6M`mIh2&ZMhB*??7L3iyC;)MduavH{5O)nu>!%YTJ}B!pJ@(btyg%YT?ZW z8DIKTF>~Zsu8d{ns6b+OFMPgE1ky&Opo5KEaKOsygTV}Znl7pUfq=FbTYKf|%=8d$ zTc(KjAD&iaw$dyB{0aCLcmrUy;X(P>tX#|1k?#ANL_w>Om){7KT)N(ISV+%X(;o^< zypff$!)eXf3H(xL{CxfGSB3zFL$iVVWqK0u39kTR+n^^=W5!2P$OVsHr{u{ygmHsP=HZhMHLJ=A}YQ1eTKri)rIT2 zue72<6_Au7Nj7;)VJI7!1U)Hp$6`J-j|vZR7#2Ygu)08^e2g^{6^Ta%(kKaqJ|DBCfM zv2>_~q+?lS-!`Nmfcz!QY%|m$JO;L@hU=MDWyS1vmxg|>5KDw*OePw?44=jS?uKd@N9M%v|c#c!9FeuZMWmxxo zH7cX%mqF}!?P{K^K zq4fRv12T-jK|@L|j8|Oi9n8;JP5vx1^%K}f_Sd3QKfL@1{8!5P$G}J7f>gg!);}YEWm|tl z-qD07>KB6g1NkHJpOGRVA&AjW(|PjmrTwqm?2iZdCk_b-!OnhK(r^6y8&~^lXMYT8 z^f%6a-??A8++X`au(_Wm@*6*Yu3;xr~k1s7^4}K6j1RMNmci`7!{zGo~<6HT|>90dKf(!mMXSma!%<#{+ jUx%REKSA)Nd85A==G7F@&=G4A!~e?R literal 0 HcmV?d00001 From c5398f61f99a18e46ff46f84f100c831afdff6cd Mon Sep 17 00:00:00 2001 From: phf Date: Wed, 28 Jan 2015 15:37:52 +0100 Subject: [PATCH 011/287] [CORE] Modif de trad et renomage pour le module askpricesupplier (#new_ask_price). --- htdocs/comm/askpricesupplier.php | 8 ++--- .../modules/modAskPriceSupplier.class.php | 32 +++++++++++++++--- ...osal.odt => template_askpricesupplier.odt} | Bin 3 files changed, 31 insertions(+), 9 deletions(-) rename htdocs/install/doctemplates/askpricesupplier/{template_proposal.odt => template_askpricesupplier.odt} (100%) diff --git a/htdocs/comm/askpricesupplier.php b/htdocs/comm/askpricesupplier.php index 855f84a72d8..ca34e84fb30 100644 --- a/htdocs/comm/askpricesupplier.php +++ b/htdocs/comm/askpricesupplier.php @@ -1285,7 +1285,7 @@ if ($action == 'create') // Third party print ''; - print ''; + print ''; if ($socid > 0) { print ''; } else { print ''; } print '' . "\n"; @@ -2186,14 +2186,14 @@ if ($action == 'create') * Documents generes */ $filename = dol_sanitizeFileName($object->ref); - $filedir = $conf->propal->dir_output . "/" . dol_sanitizeFileName($object->ref); + $filedir = $conf->askpricesupplier->dir_output . "/" . dol_sanitizeFileName($object->ref); $urlsource = $_SERVER["PHP_SELF"] . "?id=" . $object->id; $genallowed = $user->rights->askpricesupplier->creer; $delallowed = $user->rights->askpricesupplier->supprimer; $var = true; - $somethingshown = $formfile->show_documents('propal', $filename, $filedir, $urlsource, $genallowed, $delallowed, $object->modelpdf, 1, 0, 0, 28, 0, '', 0, '', $soc->default_lang); + $somethingshown = $formfile->show_documents('askpricesupplier', $filename, $filedir, $urlsource, $genallowed, $delallowed, $object->modelpdf, 1, 0, 0, 28, 0, '', 0, '', $soc->default_lang); /* * Linked object block diff --git a/htdocs/core/modules/modAskPriceSupplier.class.php b/htdocs/core/modules/modAskPriceSupplier.class.php index f0cf2a7a40f..593ac749b1a 100644 --- a/htdocs/core/modules/modAskPriceSupplier.class.php +++ b/htdocs/core/modules/modAskPriceSupplier.class.php @@ -48,7 +48,7 @@ class modAskPriceSupplier extends DolibarrModules $this->db = $db; $this->numero = 999999; - $this->family = "products"; + $this->family = "crm"; // Module label (no space allowed), used if translation string 'ModuleXXXName' not found (where XXX is value of numeric property 'numero' of module) $this->name = preg_replace('/^mod/i','',get_class($this)); $this->description = "askpricesupplierDESC"; @@ -220,11 +220,33 @@ class modAskPriceSupplier extends DolibarrModules */ function init($options='') { - //global $conf,$langs; + global $conf,$langs; - /*CREATE IF NOT EXISTS llx_askpricesupplier (rowid int auto_increment);*/ - - $sql = array(); + // Remove permissions and default values + $this->remove($options); + + //ODT template + $src=DOL_DOCUMENT_ROOT.'/install/doctemplates/askpricesupplier/template_askpricesupplier.odt'; + $dirodt=DOL_DATA_ROOT.'/doctemplates/askpricesupplier'; + $dest=$dirodt.'/template_askpricesupplier.odt'; + + if (file_exists($src) && ! file_exists($dest)) + { + require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php'; + dol_mkdir($dirodt); + $result=dol_copy($src,$dest,0,0); + if ($result < 0) + { + $langs->load("errors"); + $this->error=$langs->trans('ErrorFailToCopyFile',$src,$dest); + return 0; + } + } + + $sql = array( + "DELETE FROM ".MAIN_DB_PREFIX."document_model WHERE nom = '".$this->const[0][2]."' AND entity = ".$conf->entity, + "INSERT INTO ".MAIN_DB_PREFIX."document_model (nom, type, entity) VALUES('".$this->const[0][2]."','askpricesupplier',".$conf->entity.")", + ); $result=$this->_load_tables('/comm/askpricesupplier/sql/'); return $this->_init($sql, $options); diff --git a/htdocs/install/doctemplates/askpricesupplier/template_proposal.odt b/htdocs/install/doctemplates/askpricesupplier/template_askpricesupplier.odt similarity index 100% rename from htdocs/install/doctemplates/askpricesupplier/template_proposal.odt rename to htdocs/install/doctemplates/askpricesupplier/template_askpricesupplier.odt From a98ce0180786f841b04bd59ee91785e0c4e2ce13 Mon Sep 17 00:00:00 2001 From: phf Date: Wed, 28 Jan 2015 17:27:26 +0100 Subject: [PATCH 012/287] =?UTF-8?q?[CORE]=20renomage=20de=20masse=20+=20co?= =?UTF-8?q?rrection=20des=20noms=20des=20fichiers/fonctions=20par=20copie?= =?UTF-8?q?=20+=20ajout=20de=20cl=C3=A9s=20de=20traductions=20(#new=5Fask?= =?UTF-8?q?=5Fprice).?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- htdocs/admin/askpricesupplier.php | 648 ++++++++++++++++++ htdocs/comm/askpricesupplier.php | 2 +- htdocs/core/lib/askpricesupplier.lib.php | 4 +- ..._generic_askpricesupplier_odt.modules.php} | 44 +- ...zur.modules.php => pdf_aurore.modules.php} | 22 +- .../mod_askpricesupplier_marbre.php | 2 +- .../modules/modAskPriceSupplier.class.php | 2 +- htdocs/langs/fr_FR/askpricesupplier.lang | 16 +- 8 files changed, 695 insertions(+), 45 deletions(-) create mode 100644 htdocs/admin/askpricesupplier.php rename htdocs/core/modules/askpricesupplier/doc/{doc_generic_proposal_odt.modules.php => doc_generic_askpricesupplier_odt.modules.php} (89%) rename htdocs/core/modules/askpricesupplier/doc/{pdf_azur.modules.php => pdf_aurore.modules.php} (98%) diff --git a/htdocs/admin/askpricesupplier.php b/htdocs/admin/askpricesupplier.php new file mode 100644 index 00000000000..819aa64c471 --- /dev/null +++ b/htdocs/admin/askpricesupplier.php @@ -0,0 +1,648 @@ + + * Copyright (C) 2004-2011 Laurent Destailleur + * Copyright (C) 2004 Sebastien Di Cintio + * Copyright (C) 2004 Benoit Mortier + * Copyright (C) 2004 Eric Seigne + * Copyright (C) 2005-2012 Regis Houssin + * Copyright (C) 2008 Raphael Bertrand (Resultic) + * Copyright (C) 2011-2013 Juanjo Menent + * + * 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 3 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, see . + */ + +/** + * \file htdocs/admin/propal.php + * \ingroup propale + * \brief Setup page for commercial proposal module + */ + +require '../main.inc.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/admin.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/comm/askpricesupplier/class/askpricesupplier.class.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/propal.lib.php'; +$langs->load("admin"); +$langs->load("errors"); +$langs->load('other'); +$langs->load('propal'); + +if (! $user->admin) accessforbidden(); + +$action = GETPOST('action','alpha'); +$value = GETPOST('value','alpha'); +$label = GETPOST('label','alpha'); +$scandir = GETPOST('scandir','alpha'); +$type='askpricesupplier'; + +/* + * Actions + */ +$error=0; +if ($action == 'updateMask') +{ + $maskconstaskpricesupplier=GETPOST('maskconstaskpricesupplier','alpha'); + $maskaskpricesupplier=GETPOST('maskaskpricesupplier','alpha'); + if ($maskconstaskpricesupplier) $res = dolibarr_set_const($db,$maskconstaskpricesupplier,$maskaskpricesupplier,'chaine',0,'',$conf->entity); + + if (! $res > 0) $error++; + + if (! $error) + { + setEventMessage($langs->trans("SetupSaved")); + } + else + { + setEventMessage($langs->trans("Error"),'errors'); + } +} + +if ($action == 'specimen') +{ + $modele=GETPOST('module','alpha'); + + $propal = new AskPriceSupplier($db); + $propal->initAsSpecimen(); + + // Search template files + $file=''; $classname=''; $filefound=0; + $dirmodels=array_merge(array('/'),(array) $conf->modules_parts['models']); + foreach($dirmodels as $reldir) + { + $file=dol_buildpath($reldir."core/modules/askpricesupplier/doc/pdf_".$modele.".modules.php"); + if (file_exists($file)) + { + $filefound=1; + $classname = "pdf_".$modele; + break; + } + } + + if ($filefound) + { + require_once $file; + + $module = new $classname($db); + + if ($module->write_file($propal,$langs) > 0) + { + header("Location: ".DOL_URL_ROOT."/document.php?modulepart=askpricesupplier&file=SPECIMEN.pdf"); + return; + } + else + { + setEventMessage($module->error,'errors'); + dol_syslog($module->error, LOG_ERR); + } + } + else + { + setEventMessage($langs->trans("ErrorModuleNotFound"),'errors'); + dol_syslog($langs->trans("ErrorModuleNotFound"), LOG_ERR); + } +} + +if ($action == 'set_ASKPRICESUPPLIER_DRAFT_WATERMARK') +{ + $draft = GETPOST('ASKPRICESUPPLIER_DRAFT_WATERMARK','alpha'); + + $res = dolibarr_set_const($db, "ASKPRICESUPPLIER_DRAFT_WATERMARK",trim($draft),'chaine',0,'',$conf->entity); + if (! $res > 0) $error++; + + if (! $error) + { + setEventMessage($langs->trans("SetupSaved")); + } + else + { + setEventMessage($langs->trans("Error"),'errors'); + } +} + +if ($action == 'set_ASKPRICESUPPLIER_FREE_TEXT') +{ + $freetext = GETPOST('ASKPRICESUPPLIER_FREE_TEXT'); // No alpha here, we want exact string + + $res = dolibarr_set_const($db, "ASKPRICESUPPLIER_FREE_TEXT",$freetext,'chaine',0,'',$conf->entity); + + if (! $res > 0) $error++; + + if (! $error) + { + setEventMessage($langs->trans("SetupSaved")); + } + else + { + setEventMessage($langs->trans("Error"),'errors'); + } +} + +if ($action == 'setdefaultduration') +{ + $res = dolibarr_set_const($db, "ASKPRICESUPPLIER_VALIDITY_DURATION",$value,'chaine',0,'',$conf->entity); + + if (! $res > 0) $error++; + + if (! $error) + { + setEventMessage($langs->trans("SetupSaved")); + } + else + { + setEventMessage($langs->trans("Error"),'errors'); + } +} + +if ($action == 'set_BANK_ASK_PAYMENT_BANK_DURING_ASKPRICESUPPLIER') +{ + $res = dolibarr_set_const($db, "BANK_ASK_PAYMENT_BANK_DURING_ASKPRICESUPPLIER",$value,'chaine',0,'',$conf->entity); + + if (! $res > 0) $error++; + + if (! $error) + { + setEventMessage($langs->trans("SetupSaved")); + } + else + { + setEventMessage($langs->trans("Error"),'errors'); + } +} + +// Define constants for submodules that contains parameters (forms with param1, param2, ... and value1, value2, ...) +if ($action == 'setModuleOptions') +{ + $post_size=count($_POST); + + $db->begin(); + + for($i=0;$i < $post_size;$i++) + { + if (array_key_exists('param'.$i,$_POST)) + { + $param=GETPOST("param".$i,'alpha'); + $value=GETPOST("value".$i,'alpha'); + if ($param) $res = dolibarr_set_const($db,$param,$value,'chaine',0,'',$conf->entity); + if (! $res > 0) $error++; + } + } + if (! $error) + { + $db->commit(); + setEventMessage($langs->trans("SetupSaved")); + } + else + { + $db->rollback(); + setEventMessage($langs->trans("Error"),'errors'); + } +} + +// Activate a model +if ($action == 'set') +{ + $ret = addDocumentModel($value, $type, $label, $scandir); +} + +else if ($action == 'del') +{ + $ret = delDocumentModel($value, $type); + if ($ret > 0) + { + if ($conf->global->ASKPRICESUPPLIER_ADDON_PDF == "$value") dolibarr_del_const($db, 'ASKPRICESUPPLIER_ADDON_PDF',$conf->entity); + } +} + +else if ($action == 'setdoc') +{ + if (dolibarr_set_const($db, "ASKPRICESUPPLIER_ADDON_PDF",$value,'chaine',0,'',$conf->entity)) + { + $conf->global->ASKPRICESUPPLIER_ADDON_PDF = $value; + } + + // On active le modele + $ret = delDocumentModel($value, $type); + if ($ret > 0) + { + $ret = addDocumentModel($value, $type, $label, $scandir); + } +} + +else if ($action == 'setmod') +{ + // TODO Verifier si module numerotation choisi peut etre active + // par appel methode canBeActivated + + dolibarr_set_const($db, "ASKPRICESUPPLIER_ADDON",$value,'chaine',0,'',$conf->entity); +} + + +/* + * Affiche page + */ + +$dirmodels=array_merge(array('/'),(array) $conf->modules_parts['models']); + + +llxHeader('',$langs->trans("AskPriceSupplierSetup")); + +$form=new Form($db); + +//if ($mesg) print $mesg; + +$linkback=''.$langs->trans("BackToModuleList").''; +print_fiche_titre($langs->trans("AskPriceSupplierSetup"),$linkback,'setup'); + +$head = askpricesupplier_admin_prepare_head(); + +dol_fiche_head($head, 'general', $langs->trans("CommRequests"), 0, 'askpricesupplier'); + +/* + * Module numerotation + */ +print_titre($langs->trans("AskPriceSupplierNumberingModules")); + +print '
'.$langs->trans("Mask").':'.$form->textwithpicto('',$tooltip,1,1).''.$form->textwithpicto('',$tooltip,1,1).' 
' . $langs->trans('Customer') . '' . $langs->trans('Supplier') . ''; print $soc->getNomUrl(1); @@ -1293,7 +1293,7 @@ if ($action == 'create') print ''; - print $form->select_company('', 'socid', 's.client = 1 OR s.client = 2 OR s.client = 3', 1); + print $form->select_company('', 'socid', 's.fournisseur = 1', 1); print '
'; +print ''; +print '\n"; +print '\n"; +print '\n"; +print ''; +print ''; +print ''."\n"; + +clearstatcache(); + +foreach ($dirmodels as $reldir) +{ + $dir = dol_buildpath($reldir."core/modules/askpricesupplier/"); + + if (is_dir($dir)) + { + $handle = opendir($dir); + if (is_resource($handle)) + { + $var=true; + + while (($file = readdir($handle))!==false) + { + if (substr($file, 0, 12) == 'mod_askpricesupplier_' && substr($file, dol_strlen($file)-3, 3) == 'php') + { + $file = substr($file, 0, dol_strlen($file)-4); + + require_once $dir.$file.'.php'; + + $module = new $file; + + // Show modules according to features level + if ($module->version == 'development' && $conf->global->MAIN_FEATURES_LEVEL < 2) continue; + if ($module->version == 'experimental' && $conf->global->MAIN_FEATURES_LEVEL < 1) continue; + + if ($module->isEnabled()) + { + $var=!$var; + print ''; + + // Show example of numbering module + print ''."\n"; + + print ''; + + $propal=new AskPriceSupplier($db); + $propal->initAsSpecimen(); + + // Info + $htmltooltip=''; + $htmltooltip.=''.$langs->trans("Version").': '.$module->getVersion().'
'; + $propal->type=0; + $nextval=$module->getNextValue($mysoc,$propal); + if ("$nextval" != $langs->trans("NotAvailable")) { // Keep " on nextval + $htmltooltip.=''.$langs->trans("NextValue").': '; + if ($nextval) { + if (preg_match('/^Error/',$nextval) || $nextval=='NotConfigured') + $nextval = $langs->trans($nextval); + $htmltooltip.=$nextval.'
'; + } else { + $htmltooltip.=$langs->trans($module->error).'
'; + } + } + + print ''; + + print "\n"; + } + } + } + closedir($handle); + } + } +} +print "
'.$langs->trans("Name")."'.$langs->trans("Description")."'.$langs->trans("Example")."'.$langs->trans("Status").''.$langs->trans("ShortInfo").'
'.$module->nom."\n"; + print $module->info(); + print ''; + $tmp=$module->getExample(); + if (preg_match('/^Error/',$tmp)) print '
'.$langs->trans($tmp).'
'; + elseif ($tmp=='NotConfigured') print $langs->trans($tmp); + else print $tmp; + print '
'; + if ($conf->global->PROPALE_ADDON == "$file") + { + print img_picto($langs->trans("Activated"),'switch_on'); + } + else + { + print ''; + print img_picto($langs->trans("Disabled"),'switch_off'); + print ''; + } + print ''; + print $form->textwithpicto('',$htmltooltip,1,0); + print '

\n"; + + +/* + * Document templates generators + */ + +print_titre($langs->trans("AskPriceSupplierPDFModules")); + +// Load array def with activated templates +$def = array(); +$sql = "SELECT nom"; +$sql.= " FROM ".MAIN_DB_PREFIX."document_model"; +$sql.= " WHERE type = '".$type."'"; +$sql.= " AND entity = ".$conf->entity; +$resql=$db->query($sql); +if ($resql) +{ + $i = 0; + $num_rows=$db->num_rows($resql); + while ($i < $num_rows) + { + $array = $db->fetch_array($resql); + array_push($def, $array[0]); + $i++; + } +} +else +{ + dol_print_error($db); +} + + +print "\n"; +print "\n"; +print " \n"; +print " \n"; +print '\n"; +print '\n"; +print ''; +print ''; +print "\n"; + +clearstatcache(); + +$var=true; +foreach ($dirmodels as $reldir) +{ + foreach (array('','/doc') as $valdir) + { + $dir = dol_buildpath($reldir."core/modules/askpricesupplier".$valdir); + + if (is_dir($dir)) + { + $handle=opendir($dir); + if (is_resource($handle)) + { + while (($file = readdir($handle))!==false) + { + $filelist[]=$file; + } + closedir($handle); + arsort($filelist); + + foreach($filelist as $file) + { + if (preg_match('/\.modules\.php$/i',$file) && preg_match('/^(pdf_|doc_)/',$file)) + { + if (file_exists($dir.'/'.$file)) + { + $name = substr($file, 4, dol_strlen($file) -16); + $classname = substr($file, 0, dol_strlen($file) -12); + + require_once $dir.'/'.$file; + $module = new $classname($db); + + $modulequalified=1; + if ($module->version == 'development' && $conf->global->MAIN_FEATURES_LEVEL < 2) $modulequalified=0; + if ($module->version == 'experimental' && $conf->global->MAIN_FEATURES_LEVEL < 1) $modulequalified=0; + + if ($modulequalified) + { + $var = !$var; + print ''; + + // Active + if (in_array($name, $def)) + { + print ''; + } + else + { + print ""; + } + + // Defaut + print "'; + + // Info + $htmltooltip = ''.$langs->trans("Name").': '.$module->name; + $htmltooltip.='
'.$langs->trans("Type").': '.($module->type?$module->type:$langs->trans("Unknown")); + if ($module->type == 'pdf') + { + $htmltooltip.='
'.$langs->trans("Width").'/'.$langs->trans("Height").': '.$module->page_largeur.'/'.$module->page_hauteur; + } + $htmltooltip.='

'.$langs->trans("FeaturesSupported").':'; + $htmltooltip.='
'.$langs->trans("Logo").': '.yn($module->option_logo,1,1); + $htmltooltip.='
'.$langs->trans("PaymentMode").': '.yn($module->option_modereg,1,1); + $htmltooltip.='
'.$langs->trans("PaymentConditions").': '.yn($module->option_condreg,1,1); + $htmltooltip.='
'.$langs->trans("MultiLanguage").': '.yn($module->option_multilang,1,1); + //$htmltooltip.='
'.$langs->trans("Discounts").': '.yn($module->option_escompte,1,1); + //$htmltooltip.='
'.$langs->trans("CreditNote").': '.yn($module->option_credit_note,1,1); + $htmltooltip.='
'.$langs->trans("WatermarkOnDraftProposal").': '.yn($module->option_draft_watermark,1,1); + + + print ''; + + // Preview + print ''; + + print "\n"; + } + } + } + } + } + } + } +} + +print '
".$langs->trans("Name")."".$langs->trans("Description")."'.$langs->trans("Status")."'.$langs->trans("Default")."'.$langs->trans("ShortInfo").''.$langs->trans("Preview").'
'; + print (empty($module->name)?$name:$module->name); + print "\n"; + if (method_exists($module,'info')) print $module->info($langs); + else print $module->description; + print ''."\n"; + print ''; + print img_picto($langs->trans("Enabled"),'switch_on'); + print ''; + print '\n"; + print 'scandir.'&label='.urlencode($module->name).'">'.img_picto($langs->trans("Disabled"),'switch_off').''; + print ""; + if ($conf->global->ASKPRICESUPPLIER_ADDON_PDF == "$name") + { + print img_picto($langs->trans("Default"),'on'); + } + else + { + print 'scandir.'&label='.urlencode($module->name).'" alt="'.$langs->trans("Default").'">'.img_picto($langs->trans("Disabled"),'off').''; + } + print ''; + print $form->textwithpicto('',$htmltooltip,1,0); + print ''; + if ($module->type == 'pdf') + { + print ''.img_object($langs->trans("Preview"),'bill').''; + } + else + { + print img_object($langs->trans("PreviewNotAvailable"),'generic'); + } + print '
'; +print '
'; + + +/* + * Other options + * + */ +print_titre($langs->trans("OtherOptions")); + +$var=true; +print ""; +print ""; +print "\n"; +print '\n"; +print "\n"; +print ""; + +$var=!$var; +print ""; +print ''; +print ""; +print ""; +print ''; +print '"; +print ''; +print ''; +print ''; + +/* +$var=! $var; +print ''; +print ''; +print ''; +print '\n"; +print ''; +*/ + +$var=! $var; +print ''; +print ''; +print ''; +print '\n"; +print ''; + +$var=!$var; +print ""; +print ''; +print ""; +print '\n"; +print ''; + +if ($conf->banque->enabled) +{ + $var=!$var; + print ''; +} +else +{ + $var=!$var; + print ''; +} + +print '
".$langs->trans("Parameter")."'.$langs->trans("Value")." 
'.$langs->trans("DefaultAskDurationValidity").''."global->ASKPRICESUPPLIER_VALIDITY_DURATION."\">
'; +print $langs->trans("UseCustomerContactAsPropalRecipientIfExist"); +print ''; +print $form->selectyesno("value",$conf->global->PROPALE_USE_CUSTOMER_CONTACT_AS_RECIPIENT,1); +print ''; +print ''; +print "
'; +print $langs->trans("FreeLegalTextOnAskPriceSupplier").' ('.$langs->trans("AddCRIfTooLong").')
'; +print ''; +print '
'; +print ''; +print "
'; +print $langs->trans("WatermarkOnDraftAskPriceSupplier").'
'; +print ''; +print '
'; +print ''; +print "
'; + print $langs->trans("BANK_ASK_PAYMENT_BANK_DURING_ASKPRICESUPPLIER").' '; + if (! empty($conf->use_javascript_ajax)) + { + print ajax_constantonoff('BANK_ASK_PAYMENT_BANK_DURING_ASKPRICESUPPLIER'); + } + else + { + if (empty($conf->global->BANK_ASK_PAYMENT_BANK_DURING_ASKPRICESUPPLIER)) + { + print ''.img_picto($langs->trans("Disabled"),'switch_off').''; + } + else + { + print ''.img_picto($langs->trans("Enabled"),'switch_on').''; + } + } + print '
'; + print $langs->trans("BANK_ASK_PAYMENT_BANK_DURING_ASKPRICESUPLLIER").' '.$langs->trans('NotAvailable').'
'; + + + +/* + * Directory + */ +print '
'; +print_titre($langs->trans("PathToDocuments")); + +print "\n"; +print "\n"; +print " \n"; +print " \n"; +print "\n"; +print "\n \n \n\n"; +print "
".$langs->trans("Name")."".$langs->trans("Value")."
".$langs->trans("PathDirectory")."".$conf->askpricesupplier->dir_output."
\n
"; + +$db->close(); + +llxFooter(); diff --git a/htdocs/comm/askpricesupplier.php b/htdocs/comm/askpricesupplier.php index ca34e84fb30..f1ea1cde9f0 100644 --- a/htdocs/comm/askpricesupplier.php +++ b/htdocs/comm/askpricesupplier.php @@ -1578,7 +1578,7 @@ if ($action == 'create') $soc = new Societe($db); $soc->fetch($object->socid); - $head = propal_prepare_head($object); + $head = askpricesupplier_prepare_head($object); dol_fiche_head($head, 'comm', $langs->trans('CommRequest'), 0, 'askpricesupplier'); $formconfirm = ''; diff --git a/htdocs/core/lib/askpricesupplier.lib.php b/htdocs/core/lib/askpricesupplier.lib.php index b0b9369f6ee..1c3835e78be 100644 --- a/htdocs/core/lib/askpricesupplier.lib.php +++ b/htdocs/core/lib/askpricesupplier.lib.php @@ -29,7 +29,7 @@ * @param object $object Object related to tabs * @return array Array of tabs to show */ -function propal_prepare_head($object) +function askpricesupplier_prepare_head($object) { global $langs, $conf, $user; $langs->load("askpricesupplier"); @@ -112,7 +112,7 @@ function propal_prepare_head($object) * * @return array head array with tabs */ -function propal_admin_prepare_head() +function askpricesupplier_admin_prepare_head() { global $langs, $conf, $user; diff --git a/htdocs/core/modules/askpricesupplier/doc/doc_generic_proposal_odt.modules.php b/htdocs/core/modules/askpricesupplier/doc/doc_generic_askpricesupplier_odt.modules.php similarity index 89% rename from htdocs/core/modules/askpricesupplier/doc/doc_generic_proposal_odt.modules.php rename to htdocs/core/modules/askpricesupplier/doc/doc_generic_askpricesupplier_odt.modules.php index 8f79094befc..80c1a0bd347 100644 --- a/htdocs/core/modules/askpricesupplier/doc/doc_generic_proposal_odt.modules.php +++ b/htdocs/core/modules/askpricesupplier/doc/doc_generic_askpricesupplier_odt.modules.php @@ -23,7 +23,7 @@ * \brief File of class to build ODT documents for third parties */ -require_once DOL_DOCUMENT_ROOT.'/core/modules/propale/modules_propale.php'; +require_once DOL_DOCUMENT_ROOT.'/core/modules/askpricesupplier/modules_askpricesupplier.php'; require_once DOL_DOCUMENT_ROOT.'/product/class/product.class.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php'; @@ -34,7 +34,7 @@ require_once DOL_DOCUMENT_ROOT.'/core/lib/doc.lib.php'; /** * Class to build documents using ODF templates generator */ -class doc_generic_proposal_odt extends ModelePDFPropales +class doc_generic_askpricesupplier_odt extends ModelePDFAskPriceSupplier { var $emetteur; // Objet societe qui emet @@ -57,7 +57,7 @@ class doc_generic_proposal_odt extends ModelePDFPropales $this->db = $db; $this->name = "ODT templates"; $this->description = $langs->trans("DocumentModelOdt"); - $this->scandir = 'PROPALE_ADDON_PDF_ODT_PATH'; // Name of constant that is used to save list of directories to scan + $this->scandir = 'ASKPRICESUPPLIER_ADDON_PDF_ODT_PATH'; // Name of constant that is used to save list of directories to scan // Dimension page pour format A4 $this->type = 'odt'; @@ -105,19 +105,19 @@ class doc_generic_proposal_odt extends ModelePDFPropales $texte.= '
'; $texte.= ''; $texte.= ''; - $texte.= ''; - if ($conf->global->MAIN_PROPAL_CHOOSE_ODT_DOCUMENT > 0) + $texte.= ''; + if ($conf->global->MAIN_ASKPRICESUPPLIER_CHOOSE_ODT_DOCUMENT > 0) { - $texte.= ''; - $texte.= ''; - $texte.= ''; + $texte.= ''; + $texte.= ''; + $texte.= ''; } $texte.= ''; // List of directories area $texte.= ''; } diff --git a/htdocs/comm/askpricesupplier/document.php b/htdocs/comm/askpricesupplier/document.php index 5dd239e1cfa..0644f932629 100644 --- a/htdocs/comm/askpricesupplier/document.php +++ b/htdocs/comm/askpricesupplier/document.php @@ -85,9 +85,9 @@ $form = new Form($db); if ($object->id > 0) { - $upload_dir = $conf->propal->dir_output.'/'.dol_sanitizeFileName($object->ref); + $upload_dir = $conf->askpricesupplier->dir_output.'/'.dol_sanitizeFileName($object->ref); - $head = propal_prepare_head($object); + $head = askpricesupplier_prepare_head($object); dol_fiche_head($head, 'document', $langs->trans('CommRequest'), 0, 'askpricesupplier'); // Construit liste des fichiers diff --git a/htdocs/comm/askpricesupplier/info.php b/htdocs/comm/askpricesupplier/info.php index caa9f21dd1e..a288a3490b3 100644 --- a/htdocs/comm/askpricesupplier/info.php +++ b/htdocs/comm/askpricesupplier/info.php @@ -49,7 +49,7 @@ $object = new AskPriceSupplier($db); $object->fetch($id); $object->fetch_thirdparty(); -$head = propal_prepare_head($object); +$head = askpricesupplier_prepare_head($object); dol_fiche_head($head, 'info', $langs->trans('CommRequest'), 0, 'askpricesupplier'); $object->info($object->id); diff --git a/htdocs/comm/askpricesupplier/note.php b/htdocs/comm/askpricesupplier/note.php index c7b430dff8e..e681121db05 100644 --- a/htdocs/comm/askpricesupplier/note.php +++ b/htdocs/comm/askpricesupplier/note.php @@ -41,7 +41,7 @@ $action=GETPOST('action','alpha'); if ($user->societe_id) $socid=$user->societe_id; $result = restrictedArea($user, 'askpricesupplier', $id, 'askpricesupplier'); -$object = new Propal($db); +$object = new AskPriceSupplier($db); @@ -49,7 +49,7 @@ $object = new Propal($db); /* Actions */ /******************************************************************************/ -$permissionnote=$user->rights->propale->creer; // Used by the include of actions_setnotes.inc.php +$permissionnote=$user->rights->askpricesupplier->creer; // Used by the include of actions_setnotes.inc.php include DOL_DOCUMENT_ROOT.'/core/actions_setnotes.inc.php'; // Must be include, not includ_once @@ -74,7 +74,7 @@ if ($id > 0 || ! empty($ref)) $societe = new Societe($db); if ( $societe->fetch($object->socid) ) { - $head = propal_prepare_head($object); + $head = askpricesupplier_prepare_head($object); dol_fiche_head($head, 'note', $langs->trans('CommRequest'), 0, 'askpricesupplier'); print '
'; $texttitle=$langs->trans("ListOfDirectories"); - $listofdir=explode(',',preg_replace('/[\r\n]+/',',',trim($conf->global->PROPALE_ADDON_PDF_ODT_PATH))); + $listofdir=explode(',',preg_replace('/[\r\n]+/',',',trim($conf->global->ASKPRICESUPPLIER_ADDON_PDF_ODT_PATH))); $listoffiles=array(); foreach($listofdir as $key=>$tmpdir) { @@ -141,7 +141,7 @@ class doc_generic_proposal_odt extends ModelePDFPropales $texte.= $form->textwithpicto($texttitle,$texthelp,1,'help','',1); $texte.= '
'; $texte.= ''; $texte.= '
'; $texte.= ''; @@ -152,27 +152,27 @@ class doc_generic_proposal_odt extends ModelePDFPropales { $texte.=$langs->trans("NumberOfModelFilesFound").': '.count($listoffiles).''; - if ($conf->global->MAIN_PROPAL_CHOOSE_ODT_DOCUMENT > 0) + if ($conf->global->MAIN_ASKPRICESUPPLIER_CHOOSE_ODT_DOCUMENT > 0) { // Model for creation - $liste=ModelePDFPropales::liste_modeles($this->db); + $liste=ModelePDFAskPriceSupplier::liste_modeles($this->db); $texte.= ''; $texte.= ''; - $texte.= ''; + $texte.= ''; $texte.= '"; $texte.= ''; - $texte.= ''; + $texte.= ''; $texte.= '"; $texte.= ''; - $texte.= ''; + $texte.= ''; $texte.= '"; $texte.= '
'.$langs->trans("DefaultModelPropalCreate").''.$langs->trans("DefaultModelAskPriceSupplierCreate").''; - $texte.= $form->selectarray('value2',$liste,$conf->global->PROPALE_ADDON_PDF_ODT_DEFAULT); + $texte.= $form->selectarray('value2',$liste,$conf->global->ASKPRICESUPPLIER_ADDON_PDF_ODT_DEFAULT); $texte.= "
'.$langs->trans("DefaultModelPropalToBill").''.$langs->trans("DefaultModelAskPriceSupplierToBill").''; - $texte.= $form->selectarray('value3',$liste,$conf->global->PROPALE_ADDON_PDF_ODT_TOBILL); + $texte.= $form->selectarray('value3',$liste,$conf->global->ASKPRICESUPPLIER_ADDON_PDF_ODT_TOBILL); $texte.= "
'.$langs->trans("DefaultModelPropalClosed").''.$langs->trans("DefaultModelAskPriceSupplierClosed").''; - $texte.= $form->selectarray('value4',$liste,$conf->global->PROPALE_ADDON_PDF_ODT_CLOSED); + $texte.= $form->selectarray('value4',$liste,$conf->global->ASKPRICESUPPLIER_ADDON_PDF_ODT_CLOSED); $texte.= "
'; } @@ -236,7 +236,7 @@ class doc_generic_proposal_odt extends ModelePDFPropales if (! is_object($object)) { $id = $object; - $object = new Propale($this->db); + $object = new AskPriceSupplier($this->db); $result=$object->fetch($id); if ($result < 0) { @@ -285,7 +285,7 @@ class doc_generic_proposal_odt extends ModelePDFPropales //print "file=".$file; //print "conf->propal->dir_temp=".$conf->propal->dir_temp; - dol_mkdir($conf->propal->dir_temp); + dol_mkdir($conf->askpricesupplier->dir_temp); // If BILLING contact defined on invoice, we use it @@ -324,7 +324,7 @@ class doc_generic_proposal_odt extends ModelePDFPropales // Line of free text $newfreetext=''; - $paramfreetext='PROPALE_FREE_TEXT'; + $paramfreetext='ASKPRICESUPPLIER_FREE_TEXT'; if (! empty($conf->global->$paramfreetext)) { $newfreetext=make_substitutions($conf->global->$paramfreetext,$substitutionarray); @@ -336,7 +336,7 @@ class doc_generic_proposal_odt extends ModelePDFPropales $odfHandler = new odf( $srctemplatepath, array( - 'PATH_TO_TMP' => $conf->propal->dir_temp, + 'PATH_TO_TMP' => $conf->askpricesupplier->dir_temp, 'ZIP_PROXY' => 'PclZipProxy', // PhpZipProxy or PclZipProxy. Got "bad compression method" error when using PhpZipProxy. 'DELIMITER_LEFT' => '{', 'DELIMITER_RIGHT' => '}' diff --git a/htdocs/core/modules/askpricesupplier/doc/pdf_azur.modules.php b/htdocs/core/modules/askpricesupplier/doc/pdf_aurore.modules.php similarity index 98% rename from htdocs/core/modules/askpricesupplier/doc/pdf_azur.modules.php rename to htdocs/core/modules/askpricesupplier/doc/pdf_aurore.modules.php index 35953b8521f..347677ea1d9 100644 --- a/htdocs/core/modules/askpricesupplier/doc/pdf_azur.modules.php +++ b/htdocs/core/modules/askpricesupplier/doc/pdf_aurore.modules.php @@ -25,7 +25,7 @@ * \ingroup propale * \brief Fichier de la classe permettant de generer les propales au modele Azur */ -require_once DOL_DOCUMENT_ROOT.'/core/modules/propale/modules_propale.php'; +require_once DOL_DOCUMENT_ROOT.'/core/modules/askpricesupplier/modules_askpricesupplier.php'; require_once DOL_DOCUMENT_ROOT.'/product/class/product.class.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php'; @@ -35,7 +35,7 @@ require_once DOL_DOCUMENT_ROOT.'/core/lib/pdf.lib.php'; /** * Class to generate PDF proposal Azur */ -class pdf_azur extends ModelePDFPropales +class pdf_aurore extends ModelePDFAskPriceSupplier { var $db; var $name; @@ -69,8 +69,8 @@ class pdf_azur extends ModelePDFPropales $langs->load("bills"); $this->db = $db; - $this->name = "azur"; - $this->description = $langs->trans('DocModelAzurDescription'); + $this->name = "aurore"; + $this->description = $langs->trans('DocModelAuroreDescription'); // Dimension page pour format A4 $this->type = 'pdf'; @@ -149,14 +149,14 @@ class pdf_azur extends ModelePDFPropales $outputlangs->load("dict"); $outputlangs->load("companies"); $outputlangs->load("bills"); - $outputlangs->load("propal"); + $outputlangs->load("askpricesupplier"); $outputlangs->load("products"); $nblignes = count($object->lines); // Loop on each lines to detect if there is at least one image to show $realpatharray=array(); - if (! empty($conf->global->MAIN_GENERATE_PROPOSALS_WITH_PICTURE)) + if (! empty($conf->global->MAIN_GENERATE_ASKPRICESUPPLIER_WITH_PICTURE)) { for ($i = 0 ; $i < $nblignes ; $i++) { @@ -182,7 +182,7 @@ class pdf_azur extends ModelePDFPropales } if (count($realpatharray) == 0) $this->posxpicture=$this->posxtva; - if ($conf->propal->dir_output) + if ($conf->askpricesupplier->dir_output) { $object->fetch_thirdparty(); @@ -191,13 +191,13 @@ class pdf_azur extends ModelePDFPropales // Definition of $dir and $file if ($object->specimen) { - $dir = $conf->propal->dir_output; + $dir = $conf->askpricesupplier->dir_output; $file = $dir . "/SPECIMEN.pdf"; } else { $objectref = dol_sanitizeFileName($object->ref); - $dir = $conf->propal->dir_output . "/" . $objectref; + $dir = $conf->askpricesupplier->dir_output . "/" . $objectref; $file = $dir . "/" . $objectref . ".pdf"; } @@ -249,10 +249,10 @@ class pdf_azur extends ModelePDFPropales $pdf->SetDrawColor(128,128,128); $pdf->SetTitle($outputlangs->convToOutputCharset($object->ref)); - $pdf->SetSubject($outputlangs->transnoentities("CommercialProposal")); + $pdf->SetSubject($outputlangs->transnoentities("CommercialAsk")); $pdf->SetCreator("Dolibarr ".DOL_VERSION); $pdf->SetAuthor($outputlangs->convToOutputCharset($user->getFullName($outputlangs))); - $pdf->SetKeyWords($outputlangs->convToOutputCharset($object->ref)." ".$outputlangs->transnoentities("CommercialProposal")); + $pdf->SetKeyWords($outputlangs->convToOutputCharset($object->ref)." ".$outputlangs->transnoentities("CommercialAsk")); if (! empty($conf->global->MAIN_DISABLE_PDF_COMPRESSION)) $pdf->SetCompression(false); $pdf->SetMargins($this->marge_gauche, $this->marge_haute, $this->marge_droite); // Left, Top, Right diff --git a/htdocs/core/modules/askpricesupplier/mod_askpricesupplier_marbre.php b/htdocs/core/modules/askpricesupplier/mod_askpricesupplier_marbre.php index ec5164b679c..096c5a3cec5 100644 --- a/htdocs/core/modules/askpricesupplier/mod_askpricesupplier_marbre.php +++ b/htdocs/core/modules/askpricesupplier/mod_askpricesupplier_marbre.php @@ -23,7 +23,7 @@ * \brief File of class to manage commercial proposal numbering rules Marbre */ -require_once DOL_DOCUMENT_ROOT .'/core/modules/propale/modules_propale.php'; +require_once DOL_DOCUMENT_ROOT .'/core/modules/askpricesupplier/modules_askpricesupplier.php'; /** diff --git a/htdocs/core/modules/modAskPriceSupplier.class.php b/htdocs/core/modules/modAskPriceSupplier.class.php index 593ac749b1a..53a1552445d 100644 --- a/htdocs/core/modules/modAskPriceSupplier.class.php +++ b/htdocs/core/modules/modAskPriceSupplier.class.php @@ -75,7 +75,7 @@ class modAskPriceSupplier extends DolibarrModules $this->const[$r][0] = "ASKPRICESUPPLIER_ADDON_PDF"; $this->const[$r][1] = "chaine"; - $this->const[$r][2] = "azur"; + $this->const[$r][2] = "aurore"; $this->const[$r][3] = 'Nom du gestionnaire de generation des demandes de prix fournisseurs en PDF'; $this->const[$r][4] = 0; $r++; diff --git a/htdocs/langs/fr_FR/askpricesupplier.lang b/htdocs/langs/fr_FR/askpricesupplier.lang index 863d3749dca..7234366b0e6 100644 --- a/htdocs/langs/fr_FR/askpricesupplier.lang +++ b/htdocs/langs/fr_FR/askpricesupplier.lang @@ -13,8 +13,6 @@ ProposalsDraft=Propositions commerciales brouillons ProposalDraft=Proposition commerciale brouillon ProposalsOpened=Propositions commerciales ouvertes Prop=Propositions commerciales -CommercialProposal=Proposition commerciale -CommercialProposals=Propositions commerciales ProposalCard=Fiche proposition NewProp=Nouvelle proposition commerciale NewProposal=Nouvelle proposition commerciale @@ -88,6 +86,15 @@ TypeContact_askpricesupplier_external_BILLING=Contact client facturation demande TypeContact_askpricesupplier_external_CUSTOMER=Contact client suivi demande ActionsOnAskPriceSupplier=Événements sur la demande +DefaultModelAskPriceSupplierCreate=Modèle par défaut à la création +DefaultModelAskPriceSupplierToBill=Modèle par défaut lors de la clôture d'une proposition commerciale (à facturer) +DefaultModelAskPriceSupplierClosed=Modèle par défaut lors de la clôture d'une proposition commerciale (non facturée) +DefaultAskDurationValidity=Délai de validité par défaut (en jours) + +DocModelAuroreDescription=Modèle de demande de prix fournisseur complet (logo…) + +CommercialAsk=Demande commerciale +CommercialAsks=Demandes commerciales # # @@ -107,7 +114,6 @@ EstimateShort=Devis OtherPropals=Autres propositions AddToDraftProposals=Ajouter à proposition brouillon NoDraftProposals=Pas de propositions brouillons -DefaultProposalDurationValidity=Délai de validité par défaut (en jours) UseCustomerContactAsPropalRecipientIfExist=Utiliser l'adresse de contact suivi client si définie plutôt que l'adresse du tiers comme destinataire des propositions ProposalsAndProposalsLines=Propositions commerciales clients et lignes de propositions @@ -122,8 +128,4 @@ AvailabilityTypeAV_2W=2 semaines AvailabilityTypeAV_3W=3 semaines AvailabilityTypeAV_1M=1 mois # Document models -DocModelAzurDescription=Modèle de proposition commerciale complet (logo…) DocModelJauneDescription=Modèle de proposition Jaune -DefaultModelPropalCreate=Modèle par défaut à la création -DefaultModelPropalToBill=Modèle par défaut lors de la clôture d'une proposition commerciale (à facturer) -DefaultModelPropalClosed=Modèle par défaut lors de la clôture d'une proposition commerciale (non facturée) From 5da4d0262e2eda2f5def95195854ee52ae60a3c1 Mon Sep 17 00:00:00 2001 From: phf Date: Wed, 28 Jan 2015 17:28:44 +0100 Subject: [PATCH 013/287] =?UTF-8?q?[CORE]=20ajouts=20des=20conditions=20n?= =?UTF-8?q?=C3=A9cessaire=20pour=20l'int=C3=A9gration=20du=20module=20(#ne?= =?UTF-8?q?w=5Fask=5Fprice).?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- htdocs/core/class/html.formfile.class.php | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/htdocs/core/class/html.formfile.class.php b/htdocs/core/class/html.formfile.class.php index 274fa19a417..ef6f3fe225d 100644 --- a/htdocs/core/class/html.formfile.class.php +++ b/htdocs/core/class/html.formfile.class.php @@ -273,7 +273,7 @@ class FormFile } $printer=0; - if (in_array($modulepart,array('facture','propal','proposal','order','commande','expedition'))) // This feature is implemented only for such elements + if (in_array($modulepart,array('facture', 'askpricesupplier','propal','proposal','order','commande','expedition'))) // This feature is implemented only for such elements { $printer = (!empty($user->rights->printing->read) && !empty($conf->printing->enabled))?true:false; } @@ -316,6 +316,15 @@ class FormFile include_once DOL_DOCUMENT_ROOT.'/core/modules/propale/modules_propale.php'; $modellist=ModelePDFPropales::liste_modeles($this->db); } + } + else if ($modulepart == 'askpricesupplier') + { + if (is_array($genallowed)) $modellist=$genallowed; + else + { + include_once DOL_DOCUMENT_ROOT.'/core/modules/askpricesupplier/modules_askpricesupplier.php'; + $modellist=ModelePDFAskPriceSupplier::liste_modeles($this->db); + } } else if ($modulepart == 'commande') { @@ -923,6 +932,11 @@ class FormFile include_once DOL_DOCUMENT_ROOT.'/comm/propal/class/propal.class.php'; $object_instance=new Propal($this->db); } + else if ($modulepart == 'askpricesupplier') + { + include_once DOL_DOCUMENT_ROOT.'/comm/askpricesupplier/class/askpricesupplier.class.php'; + $object_instance=new AskPriceSupplier($this->db); + } else if ($modulepart == 'order') { include_once DOL_DOCUMENT_ROOT.'/commande/class/commande.class.php'; @@ -984,6 +998,7 @@ class FormFile if ($modulepart == 'invoice') { preg_match('/(.*)\/[^\/]+$/',$relativefile,$reg); $ref=(isset($reg[1])?$reg[1]:''); } if ($modulepart == 'invoice_supplier') { preg_match('/([^\/]+)\/[^\/]+$/',$relativefile,$reg); $ref=(isset($reg[1])?$reg[1]:''); if (is_numeric($ref)) { $id=$ref; $ref=''; } } // $ref may be also id with old supplier invoices if ($modulepart == 'propal') { preg_match('/(.*)\/[^\/]+$/',$relativefile,$reg); $ref=(isset($reg[1])?$reg[1]:''); } + if ($modulepart == 'askpricesupplier') { preg_match('/(.*)\/[^\/]+$/',$relativefile,$reg); $ref=(isset($reg[1])?$reg[1]:''); } if ($modulepart == 'order') { preg_match('/(.*)\/[^\/]+$/',$relativefile,$reg); $ref=(isset($reg[1])?$reg[1]:''); } if ($modulepart == 'order_supplier') { preg_match('/(.*)\/[^\/]+$/',$relativefile,$reg); $ref=(isset($reg[1])?$reg[1]:''); } if ($modulepart == 'contract') { preg_match('/(.*)\/[^\/]+$/',$relativefile,$reg); $ref=(isset($reg[1])?$reg[1]:''); } From b3b9527e32d0bbd7c250fa4d911b88509e503d6b Mon Sep 17 00:00:00 2001 From: phf Date: Wed, 28 Jan 2015 17:29:14 +0100 Subject: [PATCH 014/287] [CORE] ajouts de traductions pour le module (#new_ask_price). --- htdocs/langs/fr_FR/admin.lang | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/htdocs/langs/fr_FR/admin.lang b/htdocs/langs/fr_FR/admin.lang index e8c8f6dd1a2..49e6a6a22ec 100644 --- a/htdocs/langs/fr_FR/admin.lang +++ b/htdocs/langs/fr_FR/admin.lang @@ -1151,6 +1151,13 @@ UseOptionLineIfNoQuantity=Une ligne de produit/service ayant une quantité nulle FreeLegalTextOnProposal=Mention complémentaire sur les propositions commerciales WatermarkOnDraftProposal=Filigrane sur les brouillons de propositions commerciales (aucun si vide) BANK_ASK_PAYMENT_BANK_DURING_PROPOSAL=Saisir le compte bancaire cible lors de la proposition commerciale +##### AskPriceSupplier ##### +AskPriceSupplierSetup=Configuration du module Demandes de Prix Fournisseurs +AskPriceSupplierNumberingModules=Modèles de numérotation des demandes de prix fournisseurs +AskPriceSupplierPDFModules=Modèles de documents de demandes de prix fournisseurs +AskPriceSupplierPDFModules=Modèles de documents de demandes de prix fournisseurs +FreeLegalTextOnAskPriceSupplier=Mention complémentaire sur les demandes de prix fournisseurs +WatermarkOnDraftAskPriceSupplier=Filigrane sur les brouillons de demandes de prix (aucun si vide) ##### Orders ##### OrdersSetup=Configuration du module Commandes OrdersNumberingModules=Modèles de numérotation des commandes From a58899d354cd7ebf1471b0ec7a5dab9eb3c61633 Mon Sep 17 00:00:00 2001 From: phf Date: Thu, 29 Jan 2015 10:41:08 +0100 Subject: [PATCH 015/287] [CORE] ajout d'une condition pour le fonctionnement du module (#new_ask_price). --- htdocs/core/tpl/contacts.tpl.php | 1 + 1 file changed, 1 insertion(+) diff --git a/htdocs/core/tpl/contacts.tpl.php b/htdocs/core/tpl/contacts.tpl.php index 6aaf0f5f28d..b8b124b731a 100644 --- a/htdocs/core/tpl/contacts.tpl.php +++ b/htdocs/core/tpl/contacts.tpl.php @@ -27,6 +27,7 @@ $module = $object->element; // Special cases if ($module == 'propal') { $permission=$user->rights->propale->creer; } +elseif ($module == 'askpricesupplier') { $permission=$user->rights->askpricesupplier->creer; } elseif ($module == 'fichinter') { $permission=$user->rights->ficheinter->creer; } elseif ($module == 'invoice_supplier') { $permission=$user->rights->fournisseur->facture->creer; } elseif ($module == 'order_supplier') { $permission=$user->rights->fournisseur->commande->creer; } From 77e4619fe2da1aa9d9a3e8db54db92a27d443bfe Mon Sep 17 00:00:00 2001 From: phf Date: Thu, 29 Jan 2015 10:41:46 +0100 Subject: [PATCH 016/287] [CORE] correction de nom de fonction pour un appel correct (#new_ask_price). --- htdocs/comm/askpricesupplier/contact.php | 4 ++-- htdocs/comm/askpricesupplier/document.php | 4 ++-- htdocs/comm/askpricesupplier/info.php | 2 +- htdocs/comm/askpricesupplier/note.php | 8 ++++---- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/htdocs/comm/askpricesupplier/contact.php b/htdocs/comm/askpricesupplier/contact.php index 7ebb852d9bb..fbaf02ba7d8 100644 --- a/htdocs/comm/askpricesupplier/contact.php +++ b/htdocs/comm/askpricesupplier/contact.php @@ -149,7 +149,7 @@ $formother = new FormOther($db); if ($object->id > 0) { - $head = propal_prepare_head($object); + $head = askpricesupplier_prepare_head($object); dol_fiche_head($head, 'contact', $langs->trans("CommRequest"), 0, 'askpricesupplier'); /* @@ -198,7 +198,7 @@ if ($object->id > 0) } else { - $formother->form_address($_SERVER['PHP_SELF'].'?id='.$object->id,$object->fk_delivery_address,$object->socid,'none','propal',$object->id); + $formother->form_address($_SERVER['PHP_SELF'].'?id='.$object->id,$object->fk_delivery_address,$object->socid,'none','askpricesupplier',$object->id); } print '
'; @@ -126,7 +126,7 @@ if ($id > 0 || ! empty($ref)) if ($object->fin_validite) { print dol_print_date($object->fin_validite,'daytext'); - if ($object->statut == 1 && $object->fin_validite < ($now - $conf->propal->cloture->warning_delay)) print img_warning($langs->trans("Late")); + if ($object->statut == 1 && $object->fin_validite < ($now - $conf->askpricesupplier->cloture->warning_delay)) print img_warning($langs->trans("Late")); } else { From 87398c7d43bafe7dff78b3dc22b97b5768d72c75 Mon Sep 17 00:00:00 2001 From: phf Date: Thu, 29 Jan 2015 10:42:53 +0100 Subject: [PATCH 017/287] =?UTF-8?q?[CORE]=20renomage=20de=20variables=20po?= =?UTF-8?q?ur=20=C3=AAtre=20en=20rapport=20avec=20le=20module=20(#new=5Fas?= =?UTF-8?q?k=5Fprice).?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- htdocs/admin/askpricesupplier.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/htdocs/admin/askpricesupplier.php b/htdocs/admin/askpricesupplier.php index 819aa64c471..ae3f78ca3ce 100644 --- a/htdocs/admin/askpricesupplier.php +++ b/htdocs/admin/askpricesupplier.php @@ -31,11 +31,11 @@ require '../main.inc.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/admin.lib.php'; require_once DOL_DOCUMENT_ROOT.'/comm/askpricesupplier/class/askpricesupplier.class.php'; -require_once DOL_DOCUMENT_ROOT.'/core/lib/propal.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/askpricesupplier.lib.php'; $langs->load("admin"); $langs->load("errors"); $langs->load('other'); -$langs->load('propal'); +$langs->load('askpricesupplier'); if (! $user->admin) accessforbidden(); @@ -324,7 +324,7 @@ foreach ($dirmodels as $reldir) print ''."\n"; print '' . "\n"; // Contacts (ask contact only if thirdparty already defined). TODO do this also into order and invoice. + /* PHFAVRE retrait en temporaire if ($socid > 0) { print "'; } - + */ // Date print ''; // Validaty duration + /* PHFAVRE retrait en temporaire print ''; - + */ + // Terms of payment print '"; // Project + /* PHFAVRE retrait en temporaire if (! empty($conf->projet->enabled) && $socid > 0) { $formproject = new FormProjets($db); @@ -1408,7 +1412,8 @@ if ($action == 'create') print ''; print ''; } - + */ + // Other attributes $parameters = array('colspan' => ' colspan="3"'); $reshook = $hookmanager->executeHooks('formObjectOptions', $parameters, $object, $action); // Note that $action and $object may have been modified From a3c29f2e9ca89be6a3b8dc01e549e376995a1dd9 Mon Sep 17 00:00:00 2001 From: phf Date: Mon, 2 Feb 2015 15:41:14 +0100 Subject: [PATCH 036/287] =?UTF-8?q?[CORE]=20Avancement=20du=20fonctionneme?= =?UTF-8?q?nt=20du=20module,=20correction=20bug=20et=20=C3=A9puration=20de?= =?UTF-8?q?=20l'affichage=20(#new=5Fask=5Fprice).?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- htdocs/comm/askpricesupplier.php | 73 ++++++++++----- .../class/askpricesupplier.class.php | 92 +++++++++++++++---- .../mod_askpricesupplier_marbre.php | 6 +- .../mod_askpricesupplier_saphir.php | 6 +- .../modules/modAskPriceSupplier.class.php | 14 --- htdocs/langs/fr_FR/askpricesupplier.lang | 4 +- 6 files changed, 135 insertions(+), 60 deletions(-) diff --git a/htdocs/comm/askpricesupplier.php b/htdocs/comm/askpricesupplier.php index 46533a84210..cf296ef9417 100644 --- a/htdocs/comm/askpricesupplier.php +++ b/htdocs/comm/askpricesupplier.php @@ -249,18 +249,12 @@ if (empty($reshook)) $datep = dol_mktime(12, 0, 0, GETPOST('remonth'), GETPOST('reday'), GETPOST('reyear')); $date_delivery = dol_mktime(12, 0, 0, GETPOST('liv_month'), GETPOST('liv_day'), GETPOST('liv_year')); - $duration = GETPOST('duree_validite'); if (empty($datep)) { setEventMessage($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("Date")), 'errors'); $action = 'create'; $error ++; } - if (empty($duration)) { - setEventMessage($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("ValidityDuration")), 'errors'); - $action = 'create'; - $error ++; - } if ($socid < 1) { setEventMessage($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("Customer")), 'errors'); @@ -969,7 +963,7 @@ if (empty($reshook)) } } - else if ($action == 'updateligne' && $user->rights->propal->creer && GETPOST('cancel') == $langs->trans('Cancel')) { + else if ($action == 'updateligne' && $user->rights->askpricesupplier->creer && GETPOST('cancel') == $langs->trans('Cancel')) { header('Location: ' . $_SERVER['PHP_SELF'] . '?id=' . $object->id); // Pour reaffichage de la fiche en cours d'edition exit(); } @@ -1664,6 +1658,7 @@ if ($action == 'create') print ''; // Ref customer + /* PHFAVRE retrait en temporaire print ''; } + print "
'; - if ($conf->global->PROPALE_ADDON == "$file") + if ($conf->global->ASKPRICESUPPLIER_ADDON == "$file") { print img_picto($langs->trans("Activated"),'switch_on'); } From 770ce6b4ccbb22da54398ac8a524b07fdddd8c1d Mon Sep 17 00:00:00 2001 From: phf Date: Thu, 29 Jan 2015 10:43:46 +0100 Subject: [PATCH 018/287] =?UTF-8?q?[CORE]=20renomage=20d=20evariables=20po?= =?UTF-8?q?ur=20=C3=AAtre=20en=20rapport=20avec=20le=20module=20(#new=5Fas?= =?UTF-8?q?k=5Fprice).?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- htdocs/comm/askpricesupplier.php | 4 ++-- htdocs/comm/askpricesupplier/class/askpricesupplier.class.php | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/htdocs/comm/askpricesupplier.php b/htdocs/comm/askpricesupplier.php index f1ea1cde9f0..da35edf54a9 100644 --- a/htdocs/comm/askpricesupplier.php +++ b/htdocs/comm/askpricesupplier.php @@ -2028,7 +2028,7 @@ if ($action == 'create') $ret = $object->printObjectLines($action, $mysoc, $soc, $lineid, 1); // Form to add new line - if ($object->statut == 0 && $user->rights->propal->creer) + if ($object->statut == 0 && $user->rights->askpricesupplier->creer) { if ($action != 'editline') { @@ -2117,7 +2117,7 @@ if ($action == 'create') // Send if ($object->statut == 1 || $object->statut == 2) { - if (empty($conf->global->MAIN_USE_ADVANCED_PERMS) || $user->rights->askpricesupplier->propal_advance->send) { + if (empty($conf->global->MAIN_USE_ADVANCED_PERMS) || $user->rights->askpricesupplier->send) { print ''; } else print ''; diff --git a/htdocs/comm/askpricesupplier/class/askpricesupplier.class.php b/htdocs/comm/askpricesupplier/class/askpricesupplier.class.php index 2deb897a192..49af98252e4 100644 --- a/htdocs/comm/askpricesupplier/class/askpricesupplier.class.php +++ b/htdocs/comm/askpricesupplier/class/askpricesupplier.class.php @@ -1335,7 +1335,7 @@ class AskPriceSupplier extends CommonObject $now=dol_now(); if ((empty($conf->global->MAIN_USE_ADVANCED_PERMS) && ! empty($user->rights->askpricesupplier->creer)) - || (! empty($conf->global->MAIN_USE_ADVANCED_PERMS) && ! empty($user->rights->askpricesupplier->propal_advance->validate))) + || (! empty($conf->global->MAIN_USE_ADVANCED_PERMS) && ! empty($user->rights->askpricesupplier->validate))) { $this->db->begin(); From c9e74fbceaf211953b43358ad969d4ee4ba3b6a6 Mon Sep 17 00:00:00 2001 From: phf Date: Thu, 29 Jan 2015 10:44:03 +0100 Subject: [PATCH 019/287] [CORE] ajout d'une trad (#new_ask_price). --- htdocs/langs/fr_FR/askpricesupplier.lang | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/langs/fr_FR/askpricesupplier.lang b/htdocs/langs/fr_FR/askpricesupplier.lang index 7234366b0e6..e05a66dad10 100644 --- a/htdocs/langs/fr_FR/askpricesupplier.lang +++ b/htdocs/langs/fr_FR/askpricesupplier.lang @@ -19,7 +19,6 @@ NewProposal=Nouvelle proposition commerciale NewPropal=Nouvelle proposition Prospect=Prospect ProspectList=Liste des prospects -ConfirmDeleteProp=Êtes-vous sûr de vouloir effacer cette proposition commerciale ? LastPropals=Les %s dernières propales LastClosedProposals=Les %s dernières propositions commerciales fermées @@ -78,6 +77,7 @@ ConfirmReOpenAsk=Êtes-vous sûr de vouloir réouvrir la demande de prix %s Date: Thu, 29 Jan 2015 10:44:23 +0100 Subject: [PATCH 020/287] [CORE] maj mineur (#new_ask_price). --- htdocs/core/modules/modAskPriceSupplier.class.php | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/htdocs/core/modules/modAskPriceSupplier.class.php b/htdocs/core/modules/modAskPriceSupplier.class.php index 53a1552445d..66861061981 100644 --- a/htdocs/core/modules/modAskPriceSupplier.class.php +++ b/htdocs/core/modules/modAskPriceSupplier.class.php @@ -48,13 +48,13 @@ class modAskPriceSupplier extends DolibarrModules $this->db = $db; $this->numero = 999999; - $this->family = "crm"; + $this->family = "products"; // Module label (no space allowed), used if translation string 'ModuleXXXName' not found (where XXX is value of numeric property 'numero' of module) $this->name = preg_replace('/^mod/i','',get_class($this)); $this->description = "askpricesupplierDESC"; // Possible values for version are: 'development', 'experimental', 'dolibarr' or version - $this->version = '0.1'; + $this->version = 'dolibarr'; $this->const_name = 'MAIN_MODULE_'.strtoupper($this->name); $this->special = 0; @@ -140,6 +140,12 @@ class modAskPriceSupplier extends DolibarrModules $this->rights[$r][1] = 'Supprimer les demandes fournisseurs'; // libelle de la permission $this->rights[$r][3] = 0; // La permission est-elle une permission par defaut $this->rights[$r][4] = 'supprimer'; + + $r++; + $this->rights[$r][0] = $this->numero + $r; // id de la permission + $this->rights[$r][1] = 'Cloturer les demandes de prix fournisseurs'; // libelle de la permission + $this->rights[$r][3] = 0; // La permission est-elle une permission par defaut + $this->rights[$r][4] = 'cloturer'; // Exports //-------- From ffb533a4e462724788dc5b61a152321b2f5ce6b3 Mon Sep 17 00:00:00 2001 From: phf Date: Thu, 29 Jan 2015 12:11:14 +0100 Subject: [PATCH 021/287] =?UTF-8?q?[CORE]=20gestion=20du=20prix=20lors=20d?= =?UTF-8?q?e=20l'ajout=20d'un=20produit=20d=C3=A9j=C3=A0=20existant=20(#ne?= =?UTF-8?q?w=5Fask=5Fprice).?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- htdocs/comm/askpricesupplier.php | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/htdocs/comm/askpricesupplier.php b/htdocs/comm/askpricesupplier.php index da35edf54a9..fdace17d19b 100644 --- a/htdocs/comm/askpricesupplier.php +++ b/htdocs/comm/askpricesupplier.php @@ -696,8 +696,13 @@ if (empty($reshook)) // If prices fields are update $tva_tx = get_default_tva($mysoc, $object->thirdparty, $prod->id); $tva_npr = get_default_npr($mysoc, $object->thirdparty, $prod->id); - $pu_ht = $prod->price; - $pu_ttc = $prod->price_ttc; + + //On garde le prix indiqué dans l'input pour la demande de prix fournisseur + //$pu_ht = $prod->price; + $pu_ht = price2num($price_ht, 'MU'); + //$pu_ttc = $prod->price_ttc; + $pu_ttc = price2num($pu_ht * (1 + ($tva_tx / 100)), 'MU'); + $price_min = $prod->price_min; $price_base_type = $prod->price_base_type; From 2f8ceea587a91751c7548b9ee155c8428350252c Mon Sep 17 00:00:00 2001 From: phf Date: Thu, 29 Jan 2015 12:12:22 +0100 Subject: [PATCH 022/287] [CORE] renomage de variables pour le module + modification de traductions (#new_ask_price). --- htdocs/comm/askpricesupplier/apercu.php | 2 +- htdocs/core/lib/askpricesupplier.lib.php | 4 ++-- .../doc/doc_generic_askpricesupplier_odt.modules.php | 4 ++-- htdocs/langs/fr_FR/askpricesupplier.lang | 5 ++--- htdocs/langs/fr_FR/main.lang | 1 + 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/htdocs/comm/askpricesupplier/apercu.php b/htdocs/comm/askpricesupplier/apercu.php index a434bca9354..2486091f184 100644 --- a/htdocs/comm/askpricesupplier/apercu.php +++ b/htdocs/comm/askpricesupplier/apercu.php @@ -133,7 +133,7 @@ if ($id > 0 || ! empty($ref)) print ''; print ''; - print ''; + print ''; print ''; diff --git a/htdocs/core/lib/askpricesupplier.lib.php b/htdocs/core/lib/askpricesupplier.lib.php index 1c3835e78be..0cdf15a09a0 100644 --- a/htdocs/core/lib/askpricesupplier.lib.php +++ b/htdocs/core/lib/askpricesupplier.lib.php @@ -39,7 +39,7 @@ function askpricesupplier_prepare_head($object) $head = array(); $head[$h][0] = DOL_URL_ROOT.'/comm/askpricesupplier.php?id='.$object->id; - $head[$h][1] = $langs->trans('ProposalCard'); + $head[$h][1] = $langs->trans('AskPriceSupplierCard'); $head[$h][2] = 'comm'; $h++; @@ -89,7 +89,7 @@ function askpricesupplier_prepare_head($object) } require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php'; - $upload_dir = $conf->propal->dir_output . "/" . dol_sanitizeFileName($object->ref); + $upload_dir = $conf->askpricesupplier->dir_output . "/" . dol_sanitizeFileName($object->ref); $nbFiles = count(dol_dir_list($upload_dir,'files',0,'','(\.meta|_preview\.png)$')); $head[$h][0] = DOL_URL_ROOT.'/comm/askpricesupplier/document.php?id='.$object->id; $head[$h][1] = $langs->trans('Documents'); diff --git a/htdocs/core/modules/askpricesupplier/doc/doc_generic_askpricesupplier_odt.modules.php b/htdocs/core/modules/askpricesupplier/doc/doc_generic_askpricesupplier_odt.modules.php index 80c1a0bd347..ddc995cc69a 100644 --- a/htdocs/core/modules/askpricesupplier/doc/doc_generic_askpricesupplier_odt.modules.php +++ b/htdocs/core/modules/askpricesupplier/doc/doc_generic_askpricesupplier_odt.modules.php @@ -230,7 +230,7 @@ class doc_generic_askpricesupplier_odt extends ModelePDFAskPriceSupplier $outputlangs->load("companies"); $outputlangs->load("bills"); - if ($conf->propal->dir_output) + if ($conf->askpricesupplier->dir_output) { // If $object is id instead of object if (! is_object($object)) @@ -245,7 +245,7 @@ class doc_generic_askpricesupplier_odt extends ModelePDFAskPriceSupplier } } - $dir = $conf->propal->dir_output; + $dir = $conf->askpricesupplier->dir_output; $objectref = dol_sanitizeFileName($object->ref); if (! preg_match('/specimen/i',$objectref)) $dir.= "/" . $objectref; $file = $dir . "/" . $objectref . ".odt"; diff --git a/htdocs/langs/fr_FR/askpricesupplier.lang b/htdocs/langs/fr_FR/askpricesupplier.lang index e05a66dad10..a945774f836 100644 --- a/htdocs/langs/fr_FR/askpricesupplier.lang +++ b/htdocs/langs/fr_FR/askpricesupplier.lang @@ -13,7 +13,6 @@ ProposalsDraft=Propositions commerciales brouillons ProposalDraft=Proposition commerciale brouillon ProposalsOpened=Propositions commerciales ouvertes Prop=Propositions commerciales -ProposalCard=Fiche proposition NewProp=Nouvelle proposition commerciale NewProposal=Nouvelle proposition commerciale NewPropal=Nouvelle proposition @@ -77,6 +76,7 @@ ConfirmReOpenAsk=Êtes-vous sûr de vouloir réouvrir la demande de prix %s Date: Thu, 29 Jan 2015 12:13:06 +0100 Subject: [PATCH 023/287] [CORE] ajouts des conditions pour le fonctionnement avec le module (#new_ask_price). --- htdocs/core/tpl/objectline_create.tpl.php | 17 +++++++++++------ htdocs/core/tpl/objectline_edit.tpl.php | 4 ++-- htdocs/core/tpl/objectline_view.tpl.php | 2 +- 3 files changed, 14 insertions(+), 9 deletions(-) diff --git a/htdocs/core/tpl/objectline_create.tpl.php b/htdocs/core/tpl/objectline_create.tpl.php index 0c345aee5ac..136c751a87c 100644 --- a/htdocs/core/tpl/objectline_create.tpl.php +++ b/htdocs/core/tpl/objectline_create.tpl.php @@ -31,7 +31,7 @@ $usemargins=0; -if (! empty($conf->margin->enabled) && ! empty($object->element) && in_array($object->element,array('facture','propal','commande'))) $usemargins=1; +if (! empty($conf->margin->enabled) && ! empty($object->element) && in_array($object->element,array('facture','propal', 'askpricesupplier','commande'))) $usemargins=1; global $forceall, $senderissupplier, $inputalsopricewithtax; if (empty($dateSelector)) $dateSelector=0; @@ -43,7 +43,7 @@ if (empty($inputalsopricewithtax)) $inputalsopricewithtax=0; // Define colspan for button Add $colspan = 3; // Col total ht + col edit + col delete if (! empty($inputalsopricewithtax)) $colspan++; // We add 1 if col total ttc -if (in_array($object->element,array('propal','facture','invoice','commande','order'))) $colspan++; // With this, there is a column move button +if (in_array($object->element,array('propal', 'askpricesupplier','facture','invoice','commande','order'))) $colspan++; // With this, there is a column move button ?> @@ -211,7 +211,7 @@ else { @@ -270,6 +270,9 @@ else { elseif ($this->table_element_line=='propaldet') { $newline = new PropaleLigne($this->db); } + elseif ($this->table_element_line=='askpricesupplierdet') { + $newline = new AskPriceSupplierLigne($this->db); + } elseif ($this->table_element_line=='facturedet') { $newline = new FactureLigne($this->db); } @@ -287,7 +290,7 @@ if (! empty($conf->service->enabled) && $dateSelector && GETPOST('type') != '0') else $colspan = 9; if($this->situation_cycle_ref) $colspan++; if (! empty($inputalsopricewithtax)) $colspan++; // We add 1 if col total ttc - if (in_array($object->element,array('propal','facture','invoice','commande','order'))) $colspan++; // With this, there is a column move button + if (in_array($object->element,array('propal', 'askpricesupplier','facture','invoice','commande','order'))) $colspan++; // With this, there is a column move button if (! empty($usemargins)) { @@ -562,12 +565,14 @@ function setforpredef() { jQuery("#select_type").val(-1); jQuery("#prod_entry_mode_free").attr('checked',false); jQuery("#prod_entry_mode_predef").attr('checked',true); - jQuery("#price_ht").hide(); + element != 'askpricesupplier') { ?> + jQuery("#price_ht").hide(); + jQuery("#title_up_ht").hide(); + jQuery("#price_ttc").hide(); // May no exists jQuery("#tva_tx").hide(); jQuery("#buying_price").show(); jQuery("#title_vat").hide(); - jQuery("#title_up_ht").hide(); jQuery("#title_up_ttc").hide(); jQuery("#np_marginRate").hide(); // May no exists jQuery("#np_markRate").hide(); // May no exists diff --git a/htdocs/core/tpl/objectline_edit.tpl.php b/htdocs/core/tpl/objectline_edit.tpl.php index fd2e3e0d469..fa4dcdc5a4a 100644 --- a/htdocs/core/tpl/objectline_edit.tpl.php +++ b/htdocs/core/tpl/objectline_edit.tpl.php @@ -31,7 +31,7 @@ $usemargins=0; -if (! empty($conf->margin->enabled) && ! empty($object->element) && in_array($object->element,array('facture','propal','commande'))) $usemargins=1; +if (! empty($conf->margin->enabled) && ! empty($object->element) && in_array($object->element,array('facture','propal', 'askpricesupplier','commande'))) $usemargins=1; global $forceall, $senderissupplier, $inputalsopricewithtax; if (empty($dateSelector)) $dateSelector=0; @@ -43,7 +43,7 @@ if (empty($inputalsopricewithtax)) $inputalsopricewithtax=0; // Define colspan for button Add $colspan = 3; // Col total ht + col edit + col delete if (! empty($inputalsopricewithtax)) $colspan++; // We add 1 if col total ttc -if (in_array($object->element,array('propal','facture','invoice','commande','order'))) $colspan++; // With this, there is a column move button +if (in_array($object->element,array('propal', 'askpricesupplier','facture','invoice','commande','order'))) $colspan++; // With this, there is a column move button ?> diff --git a/htdocs/core/tpl/objectline_view.tpl.php b/htdocs/core/tpl/objectline_view.tpl.php index 2e1cc0f3678..f484b013ba2 100644 --- a/htdocs/core/tpl/objectline_view.tpl.php +++ b/htdocs/core/tpl/objectline_view.tpl.php @@ -32,7 +32,7 @@ */ $usemargins=0; -if (! empty($conf->margin->enabled) && ! empty($object->element) && in_array($object->element,array('facture','propal','commande'))) $usemargins=1; +if (! empty($conf->margin->enabled) && ! empty($object->element) && in_array($object->element,array('facture','propal', 'askpricesupplier','commande'))) $usemargins=1; global $forceall, $senderissupplier, $inputalsopricewithtax; if (empty($dateSelector)) $dateSelector=0; From aba3ec06120cbdebc770801004ecbc7ac63e4800 Mon Sep 17 00:00:00 2001 From: phf Date: Thu, 29 Jan 2015 12:26:50 +0100 Subject: [PATCH 024/287] [CORE] modification de l'affiche du PDF (#new_ask_price). --- .../doc/pdf_aurore.modules.php | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/htdocs/core/modules/askpricesupplier/doc/pdf_aurore.modules.php b/htdocs/core/modules/askpricesupplier/doc/pdf_aurore.modules.php index 347677ea1d9..ed486d4f076 100644 --- a/htdocs/core/modules/askpricesupplier/doc/pdf_aurore.modules.php +++ b/htdocs/core/modules/askpricesupplier/doc/pdf_aurore.modules.php @@ -102,8 +102,8 @@ class pdf_aurore extends ModelePDFAskPriceSupplier // Define position of columns $this->posxdesc=$this->marge_gauche+1; - $this->posxtva=112; - $this->posxup=126; + $this->posxtva=102; + $this->posxup=116; $this->posxqty=145; $this->posxdiscount=162; $this->postotalht=174; @@ -425,7 +425,7 @@ class pdf_aurore extends ModelePDFAskPriceSupplier { $vat_rate = pdf_getlinevatrate($object, $i, $outputlangs, $hidedetails); $pdf->SetXY($this->posxtva, $curY); - $pdf->MultiCell($this->posxup-$this->posxtva-0.8, 3, $vat_rate, 0, 'R'); + $pdf->MultiCell($this->posxup-$this->posxtva-3, 3, $vat_rate, 0, 'R'); } // Unit price before discount @@ -1124,19 +1124,20 @@ class pdf_aurore extends ModelePDFAskPriceSupplier if (empty($conf->global->MAIN_GENERATE_DOCUMENTS_WITHOUT_VAT)) { - $pdf->line($this->posxtva-1, $tab_top, $this->posxtva-1, $tab_top + $tab_height); + //$pdf->line($this->posxtva-1, $tab_top, $this->posxtva-1, $tab_top + $tab_height); + $pdf->line($this->posxtva-2, $tab_top, $this->posxtva-2, $tab_top + $tab_height); if (empty($hidetop)) { - $pdf->SetXY($this->posxtva-3, $tab_top+1); + $pdf->SetXY($this->posxtva-5, $tab_top+1); $pdf->MultiCell($this->posxup-$this->posxtva+3,2, $outputlangs->transnoentities("VAT"),'','C'); } } - $pdf->line($this->posxup-1, $tab_top, $this->posxup-1, $tab_top + $tab_height); + $pdf->line($this->posxup-3, $tab_top, $this->posxup-3, $tab_top + $tab_height); if (empty($hidetop)) { $pdf->SetXY($this->posxup-1, $tab_top+1); - $pdf->MultiCell($this->posxqty-$this->posxup-1,2, $outputlangs->transnoentities("PriceUHT"),'','C'); + $pdf->MultiCell($this->posxqty-$this->posxup-1,2, $outputlangs->transnoentities("AskPriceSupplierUHT"),'','C'); } $pdf->line($this->posxqty-1, $tab_top, $this->posxqty-1, $tab_top + $tab_height); @@ -1181,7 +1182,7 @@ class pdf_aurore extends ModelePDFAskPriceSupplier $outputlangs->load("main"); $outputlangs->load("bills"); - $outputlangs->load("propal"); + $outputlangs->load("askpricesupplier"); $outputlangs->load("companies"); $default_font_size = pdf_getPDFFontSize($outputlangs); @@ -1228,7 +1229,7 @@ class pdf_aurore extends ModelePDFAskPriceSupplier $pdf->SetFont('','B',$default_font_size + 3); $pdf->SetXY($posx,$posy); $pdf->SetTextColor(0,0,60); - $title=$outputlangs->transnoentities("CommercialProposal"); + $title=$outputlangs->transnoentities("CommercialAsk"); $pdf->MultiCell(100, 4, $title, '', 'R'); $pdf->SetFont('','B',$default_font_size); From 3b0fd5ec98a3f96870131da0b1ab2417ce3f7cf0 Mon Sep 17 00:00:00 2001 From: phf Date: Thu, 29 Jan 2015 17:36:12 +0100 Subject: [PATCH 025/287] =?UTF-8?q?[CORE]=20modification=20l=C3=A9g=C3=A8r?= =?UTF-8?q?e,=20d=C3=A9but=20de=20redirection=20pour=20cr=C3=A9er=20une=20?= =?UTF-8?q?commande=20fournisseur=20si=20la=20demande=20est=20acc=C3=A9pt?= =?UTF-8?q?=C3=A9=20(#new=5Fask=5Fprice).?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- htdocs/comm/askpricesupplier.php | 2 +- htdocs/fourn/commande/card.php | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/htdocs/comm/askpricesupplier.php b/htdocs/comm/askpricesupplier.php index fdace17d19b..cf40e62643e 100644 --- a/htdocs/comm/askpricesupplier.php +++ b/htdocs/comm/askpricesupplier.php @@ -2131,7 +2131,7 @@ if ($action == 'create') // Create an order if (! empty($conf->commande->enabled) && $object->statut == 2) { if ($user->rights->commande->creer) { - print ''; + print ''; } } diff --git a/htdocs/fourn/commande/card.php b/htdocs/fourn/commande/card.php index 15fdbc70722..e6104d866aa 100644 --- a/htdocs/fourn/commande/card.php +++ b/htdocs/fourn/commande/card.php @@ -52,6 +52,7 @@ $langs->load('sendings'); $langs->load('companies'); $langs->load('bills'); $langs->load('propal'); +$langs->load('askpricesupplier'); $langs->load('deliveries'); $langs->load('products'); $langs->load('stocks'); From 9a289537be97cd69b89cd85d390045f1475fc0e9 Mon Sep 17 00:00:00 2001 From: phf Date: Fri, 30 Jan 2015 16:50:46 +0100 Subject: [PATCH 026/287] [CORE] maj du code + ajout d'une fonction pour le module (#new_ask_price). --- htdocs/comm/askpricesupplier.php | 29 ++++++++---------- .../class/askpricesupplier.class.php | 30 +++++++++++++++++++ htdocs/comm/askpricesupplier/index.php | 8 ++--- htdocs/comm/askpricesupplier/list.php | 4 +-- 4 files changed, 48 insertions(+), 23 deletions(-) diff --git a/htdocs/comm/askpricesupplier.php b/htdocs/comm/askpricesupplier.php index cf40e62643e..dc0abc68642 100644 --- a/htdocs/comm/askpricesupplier.php +++ b/htdocs/comm/askpricesupplier.php @@ -177,7 +177,7 @@ if (empty($reshook)) ((empty($conf->global->MAIN_USE_ADVANCED_PERMS) && ! empty($user->rights->askpricesupplier->creer)) || (! empty($conf->global->MAIN_USE_ADVANCED_PERMS) && ! empty($user->rights->askpricesupplier->validate))) ) - { + { $result = $object->valid($user); if ($result >= 0) { @@ -543,19 +543,6 @@ if (empty($reshook)) } } - // Close proposal - else if ($action == 'setstatut' && $user->rights->askpricesupplier->cloturer && ! GETPOST('cancel')) { - if (! GETPOST('statut')) { - setEventMessage($langs->trans("ErrorFieldRequired", $langs->transnoentities("CloseAs")), 'errors'); - $action = 'statut'; - } else { - // prevent browser refresh from closing proposal several times - if ($object->statut == 1) { - $object->cloture($user, GETPOST('statut'), GETPOST('note')); - } - } - } - // Classify billed else if ($action == 'classifybilled' && $user->rights->askpricesupplier->cloturer) { $object->cloture($user, 4, ''); @@ -1284,9 +1271,11 @@ if ($action == 'create') print ''; // Ref customer + /* PHFAVRE retrait en temporaire print ''; print ''; + */ // Third party print ''; @@ -1355,15 +1344,19 @@ if ($action == 'create') } // What trigger creation + /* PHFAVRE retrait en temporaire print ''; - + */ + // Delivery delay + /* PHFAVRE retrait en temporaire print ''; - + */ + // Shipping Method if (! empty($conf->expedition->enabled)) { print ''; print ''; - + */ + // Model print ''; print ''; diff --git a/htdocs/comm/askpricesupplier/class/askpricesupplier.class.php b/htdocs/comm/askpricesupplier/class/askpricesupplier.class.php index 49af98252e4..8ac09582339 100644 --- a/htdocs/comm/askpricesupplier/class/askpricesupplier.class.php +++ b/htdocs/comm/askpricesupplier/class/askpricesupplier.class.php @@ -31,6 +31,7 @@ * \brief File of class to manage proposals */ +require_once DOL_DOCUMENT_ROOT .'/fourn/class/fournisseur.product.class.php'; require_once DOL_DOCUMENT_ROOT .'/core/class/commonobject.class.php'; require_once DOL_DOCUMENT_ROOT .'/product/class/product.class.php'; require_once DOL_DOCUMENT_ROOT .'/contact/class/contact.class.php'; @@ -1784,6 +1785,10 @@ class AskPriceSupplier extends CommonObject $this->db->rollback(); return -2; } + else + { + $this->updatePriceFournisseur(); + } } if ($statut == 4) { @@ -1828,6 +1833,31 @@ class AskPriceSupplier extends CommonObject } } + function updatePriceFournisseur() + { + $productsupplier = new ProductFournisseur($this->db); + + dol_syslog(get_class($this)."::updatePriceFournisseur", LOG_DEBUG); + foreach ($this->lines as $product) { + $idProductFourn = $productsupplier->find_min_price_product_fournisseur($product->fk_product, $product->qty); + $res = $productsupplier->fetch($idProductFourn); + + $price=price2num($product->subprice*$product->qty,'MU'); + //$qty=price2num($product->qty); + $unitPrice = price2num($product->subprice,'MU'); + + //$sql = 'UPDATE '.MAIN_DB_PREFIX.'product_fournisseur_price SET price ='.$price.', quantity ='.$qty.', unitprice ='.$unitPrice.' WHERE rowid = '.$productsupplier->product_fourn_price_id; + $sql = 'UPDATE '.MAIN_DB_PREFIX.'product_fournisseur_price SET price ='.$price.', unitprice ='.$unitPrice.' WHERE rowid = '.$productsupplier->product_fourn_price_id; + + $resql=$this->db->query($sql); + if (!resql) { + $this->error=$this->db->error(); + $this->db->rollback(); + return -1; + } + } + } + /** * Class invoiced the Propal * diff --git a/htdocs/comm/askpricesupplier/index.php b/htdocs/comm/askpricesupplier/index.php index ef9a37f145c..7684664c56b 100644 --- a/htdocs/comm/askpricesupplier/index.php +++ b/htdocs/comm/askpricesupplier/index.php @@ -152,7 +152,7 @@ else /* * Draft proposals */ -if (! empty($conf->propal->enabled)) +if (! empty($conf->askpricesupplier->enabled)) { $sql = "SELECT c.rowid, c.ref, s.nom as socname, s.rowid as socid, s.canvas, s.client"; $sql.= " FROM ".MAIN_DB_PREFIX."askpricesupplier as c"; @@ -258,7 +258,7 @@ if ($resql) print '
'.$langs->trans("Documents").'
'.$langs->trans("Proposal").' PDF
'.$langs->trans("CommRequest").' PDF'.$object->ref.'.pdf - + element == 'askpricesupplier' || GETPOST('prod_entry_mode') != 'predef') { ?> ">
' . $langs->trans('Ref') . '' . $langs->trans("Draft") . '
' . $langs->trans('RefCustomer') . ''; print '
' . $langs->trans('Source') . ''; $form->selectInputReason('', 'demand_reason_id', "SRC_PROP", 1); print '
' . $langs->trans('AvailabilityPeriod') . ''; $form->selectAvailabilityDelay('', 'availability_id', '', 1); print '
' . $langs->trans('SendingMethod') . ''; @@ -1372,6 +1365,7 @@ if ($action == 'create') } // Delivery date (or manufacturing) + /* PHFAVRE retrait en temporaire print '
' . $langs->trans("DeliveryDate") . ''; if ($conf->global->DATE_LIVRAISON_WEEK_DELAY != "") { @@ -1384,7 +1378,8 @@ if ($action == 'create') $form->select_date(-1, 'liv_', '', '', '', "addask", 1, 1); } print '
' . $langs->trans("DefaultModel") . ''; $filename=dol_sanitizeFileName($obj->ref); - $filedir=$conf->propal->dir_output . '/' . dol_sanitizeFileName($obj->ref); + $filedir=$conf->askpricesupplier->dir_output . '/' . dol_sanitizeFileName($obj->ref); $urlsource=$_SERVER['PHP_SELF'].'?id='.$obj->rowid; print $formfile->getDocumentsLink($askpricesupplierstatic->element, $filename, $filedir); print '
'; @@ -291,7 +291,7 @@ if (! empty($conf->askpricesupplier->enabled) && $user->rights->askpricesupplier $now=dol_now(); - $sql = "SELECT s.nom as socname, s.rowid as socid, s.canvas, s.client, p.rowid as propalid, p.total as total_ttc, p.total_ht, p.ref, p.fk_statut, p.datep as dp, p.fin_validite as dfv"; + $sql = "SELECT s.nom as socname, s.rowid as socid, s.canvas, s.client, p.rowid as askpricesupplierid, p.total as total_ttc, p.total_ht, p.ref, p.fk_statut, p.datep as dp, p.fin_validite as dfv"; $sql.= " FROM ".MAIN_DB_PREFIX."societe as s"; $sql.= ", ".MAIN_DB_PREFIX."askpricesupplier as p"; if (!$user->rights->societe->client->voir && !$socid) $sql.= ", ".MAIN_DB_PREFIX."societe_commerciaux as sc"; @@ -325,7 +325,7 @@ if (! empty($conf->askpricesupplier->enabled) && $user->rights->askpricesupplier // Ref print '
'; - $askpricesupplierstatic->id=$obj->propalid; + $askpricesupplierstatic->id=$obj->askpricesupplierid; $askpricesupplierstatic->ref=$obj->ref; print ''; diff --git a/htdocs/comm/askpricesupplier/list.php b/htdocs/comm/askpricesupplier/list.php index 47eb078d401..148156f4da2 100644 --- a/htdocs/comm/askpricesupplier/list.php +++ b/htdocs/comm/askpricesupplier/list.php @@ -357,7 +357,7 @@ if ($result) if (! empty($objp->note_private)) { print ' '; - print ''.img_picto($langs->trans("ViewPrivateNote"),'object_generic').''; + print ''.img_picto($langs->trans("ViewPrivateNote"),'object_generic').''; print ''; } print ''; @@ -365,7 +365,7 @@ if ($result) // Ref print '
'; $filename=dol_sanitizeFileName($objp->ref); - $filedir=$conf->propal->dir_output . '/' . dol_sanitizeFileName($objp->ref); + $filedir=$conf->askpricesupplier->dir_output . '/' . dol_sanitizeFileName($objp->ref); $urlsource=$_SERVER['PHP_SELF'].'?id='.$objp->askpricesupplierid; print $formfile->getDocumentsLink($objectstatic->element, $filename, $filedir); print '
'; From d2cd78884e22c229e081213611543eb67bd68e9c Mon Sep 17 00:00:00 2001 From: phf Date: Fri, 30 Jan 2015 16:52:14 +0100 Subject: [PATCH 027/287] =?UTF-8?q?[CORE]=20ajout=20de=20code=20n=C3=A9ces?= =?UTF-8?q?saire=20pour=20le=20fonctionnement=20du=20module=20pour=20cr?= =?UTF-8?q?=C3=A9er=20une=20code=20fournisseur=20depuis=20une=20demande=20?= =?UTF-8?q?valid=C3=A9=20et=20acc=C3=A9pt=C3=A9=20(#new=5Fask=5Fprice).?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- htdocs/fourn/commande/card.php | 301 ++++++++++++++++++++++++++++++--- 1 file changed, 275 insertions(+), 26 deletions(-) diff --git a/htdocs/fourn/commande/card.php b/htdocs/fourn/commande/card.php index e6104d866aa..5073d5433cb 100644 --- a/htdocs/fourn/commande/card.php +++ b/htdocs/fourn/commande/card.php @@ -65,6 +65,10 @@ $comclientid = GETPOST('comid','int'); $socid = GETPOST('socid','int'); $projectid = GETPOST('projectid','int'); +$lineid = GETPOST('lineid', 'int'); +$origin = GETPOST('origin', 'alpha'); +$originid = (GETPOST('originid', 'int') ? GETPOST('originid', 'int') : GETPOST('origin_id', 'int')); // For backward compatibility + //PDF $hidedetails = (GETPOST('hidedetails','int') ? GETPOST('hidedetails','int') : (! empty($conf->global->MAIN_GENERATE_DOCUMENTS_HIDE_DETAILS) ? 1 : 0)); $hidedesc = (GETPOST('hidedesc','int') ? GETPOST('hidedesc','int') : (! empty($conf->global->MAIN_GENERATE_DOCUMENTS_HIDE_DESC) ? 1 : 0)); @@ -846,29 +850,180 @@ else if ($action == 'add' && $user->rights->fournisseur->commande->creer) $object->note_private = GETPOST('note_private'); $object->note_public = GETPOST('note_public'); - // Fill array 'array_options' with data from add form - $ret = $extrafields->setOptionalsFromPost($extralabels,$object); + // If creation from another object of another module (Example: origin=propal, originid=1) + if (! empty($origin) && ! empty($originid)) { + // Parse element/subelement (ex: project_task) + $element = $subelement = $origin; + if (preg_match('/^([^_]+)_([^_]+)/i', $origin, $regs)) { + $element = $regs [1]; + $subelement = $regs [2]; + } - $id = $object->create($user); - if ($id < 0) - { - $error++; + $element = 'comm/askpricesupplier'; + $subelement = 'askpricesupplier'; + + $object->origin = $origin; + $object->origin_id = $originid; + + // Possibility to add external linked objects with hooks + $object->linked_objects [$object->origin] = $object->origin_id; + $other_linked_objects = GETPOST('other_linked_objects', 'array'); + if (! empty($other_linked_objects)) { + $object->linked_objects = array_merge($object->linked_objects, $other_linked_objects); + } + + // Fill array 'array_options' with data from add form + $ret = $extrafields->setOptionalsFromPost($extralabels, $object); + if ($ret < 0) + $error ++; + + if (! $error) + { + $object_id = $object->create($user); + + if ($object_id > 0) + { + dol_include_once('/' . $element . '/class/' . $subelement . '.class.php'); + + $classname = ucfirst($subelement); + $srcobject = new $classname($db); + + dol_syslog("Try to find source object origin=" . $object->origin . " originid=" . $object->origin_id . " to add lines"); + $result = $srcobject->fetch($object->origin_id); + if ($result > 0) + { + $lines = $srcobject->lines; + if (empty($lines) && method_exists($srcobject, 'fetch_lines')) + { + $srcobject->fetch_lines(); + $lines = $srcobject->lines; + } + + $fk_parent_line = 0; + $num = count($lines); + + $productsupplier = new ProductFournisseur($db); + + for($i = 0; $i < $num; $i ++) + { + $label = (! empty($lines [$i]->label) ? $lines [$i]->label : ''); + $desc = (! empty($lines [$i]->desc) ? $lines [$i]->desc : $lines [$i]->libelle); + $product_type = (! empty($lines [$i]->product_type) ? $lines [$i]->product_type : 0); + + // Dates + // TODO mutualiser + $date_start = $lines [$i]->date_debut_prevue; + if ($lines [$i]->date_debut_reel) + $date_start = $lines [$i]->date_debut_reel; + if ($lines [$i]->date_start) + $date_start = $lines [$i]->date_start; + $date_end = $lines [$i]->date_fin_prevue; + if ($lines [$i]->date_fin_reel) + $date_end = $lines [$i]->date_fin_reel; + if ($lines [$i]->date_end) + $date_end = $lines [$i]->date_end; + + // Reset fk_parent_line for no child products and special product + if (($lines [$i]->product_type != 9 && empty($lines [$i]->fk_parent_line)) || $lines [$i]->product_type == 9) { + $fk_parent_line = 0; + } + + // Extrafields + if (empty($conf->global->MAIN_EXTRAFIELDS_DISABLED) && method_exists($lines [$i], 'fetch_optionals')) // For avoid conflicts if + // trigger used + { + $lines [$i]->fetch_optionals($lines [$i]->rowid); + $array_option = $lines [$i]->array_options; + } +/* + $idprod=$productsupplier->get_buyprice($lines [$i]->fk_fournprice, $qty); + $res = $productsupplier->fetch($idprod); + */ + + $idprod = $productsupplier->find_min_price_product_fournisseur($lines [$i]->fk_product, $qty); + $res = $productsupplier->fetch($idProductFourn); + + $result = $object->addline( + $desc, + $lines [$i]->subprice, + $lines [$i]->qty, + $lines [$i]->tva_tx, + $lines [$i]->localtax1_tx, + $lines [$i]->localtax2_tx, + $productsupplier->id, + $lines [$i]->fk_product, + $productsupplier->ref_fourn, + $lines [$i]->remise_percent, + 'HT', + 0, + $lines [$i]->product_type, + '', + '', + $date_start, + $date_end + ); + + if ($result < 0) { + $error ++; + break; + } + + // Defined the new fk_parent_line + if ($result > 0 && $lines [$i]->product_type == 9) { + $fk_parent_line = $result; + } + } + + // Hooks + $parameters = array('objFrom' => $srcobject); + $reshook = $hookmanager->executeHooks('createFrom', $parameters, $object, $action); // Note that $action and $object may have been + // modified by hook + if ($reshook < 0) + $error ++; + } else { + setEventMessage($srcobject->error, 'errors'); + $error ++; + } + } else { + setEventMessage($object->error, 'errors'); + $error ++; + } + } else { + // Required extrafield left blank, error message already defined by setOptionalsFromPost() + $action = 'create'; + } + } else { + // Fill array 'array_options' with data from add form + $ret = $extrafields->setOptionalsFromPost($extralabels, $object); + if ($ret < 0) + $error ++; + + if (! $error) { + $object_id = $object->create($user); + + // If some invoice's lines already known + $NBLINES = 8; + for($i = 1; $i <= $NBLINES; $i ++) { + if ($_POST['idprod' . $i]) { + $xid = 'idprod' . $i; + $xqty = 'qty' . $i; + $xremise = 'remise_percent' . $i; + $object->add_product($_POST[$xid], $_POST[$xqty], $_POST[$xremise]); + } + } + } + } + + // End of object creation, we show it + if ($object_id > 0 && ! $error) { + $db->commit(); + header('Location: ' . $_SERVER["PHP_SELF"] . '?id=' . $object_id); + exit(); + } else { + $db->rollback(); + $action = 'create'; + setEventMessage($object->error, 'errors'); } - - if ($error) - { - $langs->load("errors"); - $db->rollback(); - setEventMessage($langs->trans($object->error), 'errors'); - $action='create'; - $_GET['socid']=$_POST['socid']; - } - else - { - $db->commit(); - header("Location: ".$_SERVER['PHP_SELF']."?id=".$id); - exit; - } } } @@ -1221,7 +1376,7 @@ $productstatic = new Product($db); /* *************************************************************************** */ $now=dol_now(); -if ($action=="create") +if ($action=='create') { print_fiche_titre($langs->trans('NewOrder')); @@ -1234,12 +1389,67 @@ if ($action=="create") $societe->fetch($socid); } - $cond_reglement_id = $societe->cond_reglement_supplier_id; - $mode_reglement_id = $societe->mode_reglement_supplier_id; + if (! empty($origin) && ! empty($originid)) { + // Parse element/subelement (ex: project_task) + $element = $subelement = $origin; + if (preg_match('/^([^_]+)_([^_]+)/i', $origin, $regs)) { + $element = $regs [1]; + $subelement = $regs [2]; + } + + $element = 'comm/askpricesupplier'; + $subelement = 'askpricesupplier'; + + dol_include_once('/' . $element . '/class/' . $subelement . '.class.php'); + $classname = ucfirst($subelement); + $objectsrc = new $classname($db); + $objectsrc->fetch($originid); + if (empty($objectsrc->lines) && method_exists($objectsrc, 'fetch_lines')) + $objectsrc->fetch_lines(); + $objectsrc->fetch_thirdparty(); + + // Replicate extrafields + $objectsrc->fetch_optionals($originid); + $object->array_options = $objectsrc->array_options; + + $projectid = (! empty($objectsrc->fk_project) ? $objectsrc->fk_project : ''); + $ref_client = (! empty($objectsrc->ref_client) ? $objectsrc->ref_client : ''); + + $soc = $objectsrc->client; + $cond_reglement_id = (!empty($objectsrc->cond_reglement_id)?$objectsrc->cond_reglement_id:(!empty($soc->cond_reglement_id)?$soc->cond_reglement_id:1)); + $mode_reglement_id = (!empty($objectsrc->mode_reglement_id)?$objectsrc->mode_reglement_id:(!empty($soc->mode_reglement_id)?$soc->mode_reglement_id:0)); + $fk_account = (! empty($objectsrc->fk_account)?$objectsrc->fk_account:(! empty($soc->fk_account)?$soc->fk_account:0)); + $availability_id = (!empty($objectsrc->availability_id)?$objectsrc->availability_id:(!empty($soc->availability_id)?$soc->availability_id:0)); + $shipping_method_id = (! empty($objectsrc->shipping_method_id)?$objectsrc->shipping_method_id:(! empty($soc->shipping_method_id)?$soc->shipping_method_id:0)); + $demand_reason_id = (!empty($objectsrc->demand_reason_id)?$objectsrc->demand_reason_id:(!empty($soc->demand_reason_id)?$soc->demand_reason_id:0)); + $remise_percent = (!empty($objectsrc->remise_percent)?$objectsrc->remise_percent:(!empty($soc->remise_percent)?$soc->remise_percent:0)); + $remise_absolue = (!empty($objectsrc->remise_absolue)?$objectsrc->remise_absolue:(!empty($soc->remise_absolue)?$soc->remise_absolue:0)); + $dateinvoice = empty($conf->global->MAIN_AUTOFILL_DATE)?-1:''; + + $datedelivery = (! empty($objectsrc->date_livraison) ? $objectsrc->date_livraison : ''); + + $note_private = (! empty($objectsrc->note_private) ? $objectsrc->note_private : (! empty($objectsrc->note_private) ? $objectsrc->note_private : '')); + $note_public = (! empty($objectsrc->note_public) ? $objectsrc->note_public : ''); + + // Object source contacts list + $srccontactslist = $objectsrc->liste_contact(- 1, 'external', 1); + + } + else + { + $cond_reglement_id = $societe->cond_reglement_supplier_id; + $mode_reglement_id = $societe->mode_reglement_supplier_id; + } + print ''; print ''; print ''; + print '' . "\n"; + print ''; + print ''; + print ''; + print ''; // Ref @@ -1287,7 +1497,7 @@ if ($action=="create") print ''; print ''; //print ''; @@ -1295,13 +1505,40 @@ if ($action=="create") print ''; print ''; //print ''; print ''; + if (! empty($origin) && ! empty($originid) && is_object($objectsrc)) { + print "\n"; + print "\n"; + print '' . "\n"; + print '' . "\n"; + print '' . "\n"; + print ''; + print ''; + + $newclassname = $classname; + if ($newclassname == 'AskPriceSupplier') + $newclassname = 'CommercialAskPriceSupplier'; + print ''; + print ''; + print '"; + if ($mysoc->localtax1_assuj == "1" || $objectsrc->total_localtax1 != 0) // Localtax1 RE + { + print '"; + } + + if ($mysoc->localtax2_assuj == "1" || $objectsrc->total_localtax2 != 0) // Localtax2 IRPF + { + print '"; + } + + print '"; + } // Other options $parameters=array(); @@ -1318,6 +1555,18 @@ if ($action=="create") print '
'; print "\n"; + + // Show origin lines + if (! empty($origin) && ! empty($originid) && is_object($objectsrc)) { + $title = $langs->trans('ProductsAndServices'); + print_titre($title); + + print '
'.$langs->trans('NotePublic').''; - $doleditor = new DolEditor('note_public', GETPOST('note_public'), '', 80, 'dolibarr_notes', 'In', 0, false, true, ROWS_3, 70); + $doleditor = new DolEditor('note_public', isset($note_public) ? $note_public : GETPOST('note_public'), '', 80, 'dolibarr_notes', 'In', 0, false, true, ROWS_3, 70); print $doleditor->Create(1); print '
'.$langs->trans('NotePrivate').''; - $doleditor = new DolEditor('note_private', GETPOST('note_private'), '', 80, 'dolibarr_notes', 'In', 0, false, true, ROWS_3, 70); + $doleditor = new DolEditor('note_private', isset($note_private) ? $note_private : GETPOST('note_private'), '', 80, 'dolibarr_notes', 'In', 0, false, true, ROWS_3, 70); print $doleditor->Create(1); print '
' . $langs->trans($newclassname) . '' . $objectsrc->getNomUrl(1) . '
' . $langs->trans('TotalHT') . '' . price($objectsrc->total_ht) . '
' . $langs->trans('TotalVAT') . '' . price($objectsrc->total_tva) . "
' . $langs->transcountry("AmountLT1", $mysoc->country_code) . '' . price($objectsrc->total_localtax1) . "
' . $langs->transcountry("AmountLT2", $mysoc->country_code) . '' . price($objectsrc->total_localtax2) . "
' . $langs->trans('TotalTTC') . '' . price($objectsrc->total_ttc) . "
'; + + $objectsrc->printOriginLinesList(); + + print '
'; + } } elseif (! empty($object->id)) { From f60ed2b1538ed248ee23f0457f6a31a95c5c01c2 Mon Sep 17 00:00:00 2001 From: phf Date: Fri, 30 Jan 2015 16:53:31 +0100 Subject: [PATCH 028/287] [CORE] ajout de traductions pour le module (#new_ask_price). --- htdocs/langs/fr_FR/askpricesupplier.lang | 2 ++ 1 file changed, 2 insertions(+) diff --git a/htdocs/langs/fr_FR/askpricesupplier.lang b/htdocs/langs/fr_FR/askpricesupplier.lang index a945774f836..146a0db9938 100644 --- a/htdocs/langs/fr_FR/askpricesupplier.lang +++ b/htdocs/langs/fr_FR/askpricesupplier.lang @@ -39,8 +39,10 @@ DraftRequests=Demandes brouillons LastModifiedRequests=Les %s dernières demandes de prix modifiées RequestsOpened=Demandes de prix ouvertes AskPriceSupplierArea=Espace des demandes de prix fournisseurs +Askpricesupplier=Demande de prix fournisseur NewAskPrice=Nouvelle demande de prix NewAsk=Nouvelle demande +ShowAskpricesupplier=Afficher la demande de prix # # Modifié ConfirmValidateAsk=Êtes-vous sûr de vouloir valider cette demande de prix sous la référence %s ? DateAsk=Date de demande From 18cb313348d6382f4cbf5b3e16055075e53d290a Mon Sep 17 00:00:00 2001 From: phf Date: Fri, 30 Jan 2015 16:54:50 +0100 Subject: [PATCH 029/287] [CORE] ajout du nom du module dans $childtables pour le bon fonctionnement du module (#new_ask_price). --- htdocs/product/class/product.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/product/class/product.class.php b/htdocs/product/class/product.class.php index a889136de01..5c75ba4dbf6 100755 --- a/htdocs/product/class/product.class.php +++ b/htdocs/product/class/product.class.php @@ -42,7 +42,7 @@ class Product extends CommonObject public $element='product'; public $table_element='product'; public $fk_element='fk_product'; - protected $childtables=array('propaldet','commandedet','facturedet','contratdet','facture_fourn_det','commande_fournisseurdet'); // To test if we can delete object + protected $childtables=array('askpricesupplierdet', 'propaldet','commandedet','facturedet','contratdet','facture_fourn_det','commande_fournisseurdet'); // To test if we can delete object protected $isnolinkedbythird = 1; // No field fk_soc protected $ismultientitymanaged = 1; // 0=No test on entity, 1=Test with field entity, 2=Test with link by societe From d39439437e49cb75354be441b701e749d618b18d Mon Sep 17 00:00:00 2001 From: Florian HENRY Date: Sat, 31 Jan 2015 13:50:18 +0100 Subject: [PATCH 030/287] Add fetch optionnals extrafield on contract lines --- htdocs/contrat/class/contrat.class.php | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/htdocs/contrat/class/contrat.class.php b/htdocs/contrat/class/contrat.class.php index 9619ae462f4..d5d0d3309dc 100644 --- a/htdocs/contrat/class/contrat.class.php +++ b/htdocs/contrat/class/contrat.class.php @@ -641,6 +641,11 @@ class Contrat extends CommonObject $now=dol_now(); + require_once DOL_DOCUMENT_ROOT.'/core/class/extrafields.class.php'; + $extrafieldsline=new ExtraFields($this->db); + $line = new ContratLigne($this->db); + $extralabelsline=$extrafieldsline->fetch_name_optionals_label($line->table_element,true); + $this->lines=array(); // Selectionne les lignes contrats liees a un produit @@ -719,6 +724,11 @@ class Contrat extends CommonObject $line->date_fin_prevue = $this->db->jdate($objp->date_fin_validite); $line->date_fin_reel = $this->db->jdate($objp->date_cloture); + // Retreive all extrafield for propal + // fetch optionals attributes and labels + + $line->fetch_optionals($line->id,$extralabelsline); + $this->lines[] = $line; //dol_syslog("1 ".$line->desc); @@ -814,6 +824,13 @@ class Contrat extends CommonObject if ($line->statut == 4 && (! empty($line->date_fin_prevue) && $line->date_fin_prevue < $now)) $this->nbofservicesexpired++; if ($line->statut == 5) $this->nbofservicesclosed++; + + // Retreive all extrafield for propal + // fetch optionals attributes and labels + + $line->fetch_optionals($line->id,$extralabelsline); + + $this->lines[] = $line; $total_ttc+=$objp->total_ttc; From 1eb73d0e495b4067454b2ead144f0c07ecb7f54e Mon Sep 17 00:00:00 2001 From: Florian HENRY Date: Sat, 31 Jan 2015 13:52:23 +0100 Subject: [PATCH 031/287] fetch optional extrafeild lines on propal fetch --- htdocs/comm/propal/class/propal.class.php | 16 +++++++++------- htdocs/contrat/class/contrat.class.php | 1 - 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/htdocs/comm/propal/class/propal.class.php b/htdocs/comm/propal/class/propal.class.php index f68a1f4f708..be945c7027e 100644 --- a/htdocs/comm/propal/class/propal.class.php +++ b/htdocs/comm/propal/class/propal.class.php @@ -1196,6 +1196,11 @@ class Propal extends CommonObject $result = $this->db->query($sql); if ($result) { + require_once DOL_DOCUMENT_ROOT.'/core/class/extrafields.class.php'; + $extrafieldsline=new ExtraFields($this->db); + $line = new PropaleLigne($this->db); + $extralabelsline=$extrafieldsline->fetch_name_optionals_label($line->table_element,true); + $num = $this->db->num_rows($result); $i = 0; @@ -1205,7 +1210,8 @@ class Propal extends CommonObject $line = new PropaleLigne($this->db); - $line->rowid = $objp->rowid; + $line->rowid = $objp->rowid; //Deprecated + $line->id = $objp->rowid; $line->fk_propal = $objp->fk_propal; $line->fk_parent_line = $objp->fk_parent_line; $line->product_type = $objp->product_type; @@ -1246,6 +1252,8 @@ class Propal extends CommonObject $line->date_start = $objp->date_start; $line->date_end = $objp->date_end; + $line->fetch_optionals($line->id,$extralabelsline); + $this->lines[$i] = $line; //dol_syslog("1 ".$line->fk_product); //print "xx $i ".$this->lines[$i]->fk_product; @@ -1259,12 +1267,6 @@ class Propal extends CommonObject return -1; } - // Retreive all extrafield for propal - // fetch optionals attributes and labels - require_once DOL_DOCUMENT_ROOT.'/core/class/extrafields.class.php'; - $extrafields=new ExtraFields($this->db); - $extralabels=$extrafields->fetch_name_optionals_label($this->table_element,true); - $this->fetch_optionals($this->id,$extralabels); return 1; } diff --git a/htdocs/contrat/class/contrat.class.php b/htdocs/contrat/class/contrat.class.php index d5d0d3309dc..21430ecca5b 100644 --- a/htdocs/contrat/class/contrat.class.php +++ b/htdocs/contrat/class/contrat.class.php @@ -726,7 +726,6 @@ class Contrat extends CommonObject // Retreive all extrafield for propal // fetch optionals attributes and labels - $line->fetch_optionals($line->id,$extralabelsline); $this->lines[] = $line; From 85a4df4ce25766652002cf514ac7cf8b7d186d40 Mon Sep 17 00:00:00 2001 From: phf Date: Mon, 2 Feb 2015 10:06:36 +0100 Subject: [PATCH 032/287] [CORE] maj du pdf, champs PU HT et Total HT vide (#new_ask_price). --- .../core/modules/askpricesupplier/doc/pdf_aurore.modules.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/core/modules/askpricesupplier/doc/pdf_aurore.modules.php b/htdocs/core/modules/askpricesupplier/doc/pdf_aurore.modules.php index ed486d4f076..a1c613339a3 100644 --- a/htdocs/core/modules/askpricesupplier/doc/pdf_aurore.modules.php +++ b/htdocs/core/modules/askpricesupplier/doc/pdf_aurore.modules.php @@ -431,7 +431,7 @@ class pdf_aurore extends ModelePDFAskPriceSupplier // Unit price before discount $up_excl_tax = pdf_getlineupexcltax($object, $i, $outputlangs, $hidedetails); $pdf->SetXY($this->posxup, $curY); - $pdf->MultiCell($this->posxqty-$this->posxup-0.8, 3, $up_excl_tax, 0, 'R', 0); + //$pdf->MultiCell($this->posxqty-$this->posxup-0.8, 3, $up_excl_tax, 0, 'R', 0); // Quantity $qty = pdf_getlineqty($object, $i, $outputlangs, $hidedetails); @@ -449,7 +449,7 @@ class pdf_aurore extends ModelePDFAskPriceSupplier // Total HT line $total_excl_tax = pdf_getlinetotalexcltax($object, $i, $outputlangs, $hidedetails); $pdf->SetXY($this->postotalht, $curY); - $pdf->MultiCell($this->page_largeur-$this->marge_droite-$this->postotalht, 3, $total_excl_tax, 0, 'R', 0); + //$pdf->MultiCell($this->page_largeur-$this->marge_droite-$this->postotalht, 3, $total_excl_tax, 0, 'R', 0); // Collecte des totaux par valeur de tva dans $this->tva["taux"]=total_tva $tvaligne=$object->lines[$i]->total_tva; From 0f7af613f11b41f13bfc27aad02990332cd470c0 Mon Sep 17 00:00:00 2001 From: phf Date: Mon, 2 Feb 2015 10:24:42 +0100 Subject: [PATCH 033/287] =?UTF-8?q?[CORE]=20ajout=20du=20bouton=20"cr?= =?UTF-8?q?=C3=A9er=20une=20demande=20de=20prix"=20sur=20la=20fiche=20four?= =?UTF-8?q?nisseur=20(#new=5Fask=5Fprice).?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- htdocs/fourn/card.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/htdocs/fourn/card.php b/htdocs/fourn/card.php index 0fefa8d4555..8cb1a36d09e 100644 --- a/htdocs/fourn/card.php +++ b/htdocs/fourn/card.php @@ -490,6 +490,11 @@ if ($object->id > 0) $langs->load("bills"); print ''.$langs->trans("AddBill").''; } + + if ($conf->askpricesupplier->enabled && $user->rights->askpricesupplier->creer) { + $langs->load("askpricesupplier"); + print ''.$langs->trans("AddAskPriceSupplier").''; + } if ($user->rights->fournisseur->facture->creer) { From fedf4769876e5a35e0f09e3dc88c28ef6643a521 Mon Sep 17 00:00:00 2001 From: phf Date: Mon, 2 Feb 2015 10:25:27 +0100 Subject: [PATCH 034/287] =?UTF-8?q?[CORE]=20ajout=20d'une=20traduction=20p?= =?UTF-8?q?our=20le=20bouton=20cr=C3=A9er=20demande=20de=20prix=20sur=20la?= =?UTF-8?q?=20fiche=20fournisseur=20(#new=5Fask=5Fprice).?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- htdocs/langs/fr_FR/askpricesupplier.lang | 1 + 1 file changed, 1 insertion(+) diff --git a/htdocs/langs/fr_FR/askpricesupplier.lang b/htdocs/langs/fr_FR/askpricesupplier.lang index 146a0db9938..0f0e39b7c43 100644 --- a/htdocs/langs/fr_FR/askpricesupplier.lang +++ b/htdocs/langs/fr_FR/askpricesupplier.lang @@ -43,6 +43,7 @@ Askpricesupplier=Demande de prix fournisseur NewAskPrice=Nouvelle demande de prix NewAsk=Nouvelle demande ShowAskpricesupplier=Afficher la demande de prix +AddAskPriceSupplier=Créer une demande de prix # # Modifié ConfirmValidateAsk=Êtes-vous sûr de vouloir valider cette demande de prix sous la référence %s ? DateAsk=Date de demande From 5573c6a2504a73cdde0d903b3956b0ef7d93efa8 Mon Sep 17 00:00:00 2001 From: phf Date: Mon, 2 Feb 2015 10:26:04 +0100 Subject: [PATCH 035/287] =?UTF-8?q?[CORE]=20mise=20en=20commentaire=20des?= =?UTF-8?q?=20champs=20inutile=20lors=20de=20la=201ere=20=C3=A9tape=20de?= =?UTF-8?q?=20cr=C3=A9er=20de=20demande=20de=20prix=20(#new=5Fask=5Fprice)?= =?UTF-8?q?.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- htdocs/comm/askpricesupplier.php | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/htdocs/comm/askpricesupplier.php b/htdocs/comm/askpricesupplier.php index dc0abc68642..46533a84210 100644 --- a/htdocs/comm/askpricesupplier.php +++ b/htdocs/comm/askpricesupplier.php @@ -1293,6 +1293,7 @@ if ($action == 'create') print '
" . $langs->trans("DefaultContact") . ''; @@ -1317,15 +1318,17 @@ if ($action == 'create') print '.'; print '
' . $langs->trans('Date') . ''; $form->select_date('', '', '', '', '', "addask", 1, 1); print '
' . $langs->trans("ValidityDuration") . ' ' . $langs->trans("days") . '
' . $langs->trans('PaymentConditionsShort') . ''; $form->select_conditions_paiements($soc->cond_reglement_id, 'cond_reglement_id'); @@ -1389,6 +1392,7 @@ if ($action == 'create') print "
'; print ''; @@ -1684,12 +1679,14 @@ if ($action == 'create') } print ''; print ''; - + */ + // Company - print ''; + print ''; print ''; // Ligne info remises tiers + /* PHFAVRE retrait en temporaire print ''; - + */ + // Date of proposal print ''; print ''; // Date end proposal + /* PHFAVRE retrait en temporaire print ''; print ''; print ''; print ''; - print ''; - print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; print ''; print ''; print ''; diff --git a/htdocs/expensereport/class/expensereport.class.php b/htdocs/expensereport/class/expensereport.class.php index 0ebde8ac92c..b31329fae95 100755 --- a/htdocs/expensereport/class/expensereport.class.php +++ b/htdocs/expensereport/class/expensereport.class.php @@ -19,7 +19,8 @@ class ExpenseReport extends CommonObject var $total_ht; var $total_tva; var $total_ttc; - var $note; + var $note_public; + var $note_private; var $date_debut; var $date_fin; @@ -134,7 +135,8 @@ class ExpenseReport extends CommonObject $sql.= ",fk_user_validator"; $sql.= ",fk_c_expensereport_statuts"; $sql.= ",fk_c_paiement"; - $sql.= ",note"; + $sql.= ",note_public"; + $sql.= ",note_private"; $sql.= ") VALUES("; $sql.= "'(PROV)'"; $sql.= ", ".$this->total_ht; @@ -147,7 +149,8 @@ class ExpenseReport extends CommonObject $sql.= ", ".($this->fk_user_validator > 0 ? $this->fk_user_validator:"null"); $sql.= ", ".($this->fk_c_expensereport_statuts > 1 ? $this->fk_c_expensereport_statuts:0); $sql.= ", ".($this->fk_c_paiement > 0 ? $this->fk_c_paiement:"null"); - $sql.= ", ".($this->note?"'".$this->db->escape($this->note)."'":"null"); + $sql.= ", ".($this->note_public?"'".$this->db->escape($this->note_public)."'":"null"); + $sql.= ", ".($this->note_private?"'".$this->db->escape($this->note_private)."'":"null"); $sql.= ")"; dol_syslog(get_class($this)."::create sql=".$sql, LOG_DEBUG); @@ -230,7 +233,8 @@ class ExpenseReport extends CommonObject $sql.= " , fk_user_paid = ".($this->fk_user_paid > 0 ? $this->fk_user_paid:"null"); $sql.= " , fk_c_expensereport_statuts = ".($this->fk_c_expensereport_statuts >= 0 ? $this->fk_c_expensereport_statuts:'0'); $sql.= " , fk_c_paiement = ".($this->fk_c_paiement > 0 ? $this->fk_c_paiement:"null"); - $sql.= " , note = ".(!empty($this->note)?"'".$this->db->escape($this->note)."'":"''"); + $sql.= " , note_public = ".(!empty($this->note_public)?"'".$this->db->escape($this->note_public)."'":"''"); + $sql.= " , note_private = ".(!empty($this->note_private)?"'".$this->db->escape($this->note_private)."'":"''"); $sql.= " , detail_refuse = ".(!empty($this->detail_refuse)?"'".$this->db->escape($this->detail_refuse)."'":"''"); $sql.= " WHERE rowid = ".$this->id; @@ -258,7 +262,7 @@ class ExpenseReport extends CommonObject { global $conf,$db; - $sql = "SELECT d.rowid, d.ref, d.note,"; // DEFAULT + $sql = "SELECT d.rowid, d.ref, d.note_public, d.note_private,"; // DEFAULT $sql.= " d.detail_refuse, d.detail_cancel, d.fk_user_refuse, d.fk_user_cancel,"; // ACTIONS $sql.= " d.date_refuse, d.date_cancel,"; // ACTIONS $sql.= " d.total_ht, d.total_ttc, d.total_tva,"; // TOTAUX (int) @@ -283,7 +287,8 @@ class ExpenseReport extends CommonObject $this->total_ht = $obj->total_ht; $this->total_tva = $obj->total_tva; $this->total_ttc = $obj->total_ttc; - $this->note = $obj->note; + $this->note_public = $obj->note_public; + $this->note_private = $obj->note_private; $this->detail_refuse = $obj->detail_refuse; $this->detail_cancel = $obj->detail_cancel; From 40fa32509cb9f87385dc8a6f883181dc9c60dbb0 Mon Sep 17 00:00:00 2001 From: aspangaro Date: Mon, 23 Feb 2015 21:51:29 +0100 Subject: [PATCH 143/287] Add doleditor & typo --- htdocs/expensereport/card.php | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/htdocs/expensereport/card.php b/htdocs/expensereport/card.php index 51be7a7f3d8..ce3d396e95e 100755 --- a/htdocs/expensereport/card.php +++ b/htdocs/expensereport/card.php @@ -25,16 +25,17 @@ $res=0; require '../main.inc.php'; -require_once(DOL_DOCUMENT_ROOT."/core/class/html.formfile.class.php"); -require_once(DOL_DOCUMENT_ROOT.'/core/class/CMailFile.class.php'); -require_once(DOL_DOCUMENT_ROOT."/core/class/html.formmail.class.php"); -require_once(DOL_DOCUMENT_ROOT."/core/class/html.formprojet.class.php"); -require_once(DOL_DOCUMENT_ROOT."/projet/class/project.class.php"); -require_once(DOL_DOCUMENT_ROOT.'/compta/bank/class/account.class.php'); -require_once(DOL_DOCUMENT_ROOT."/core/lib/expensereport.lib.php"); -require_once(DOL_DOCUMENT_ROOT."/core/lib/price.lib.php"); -require_once(DOL_DOCUMENT_ROOT."/core/modules/expensereport/modules_expensereport.php"); -require_once(DOL_DOCUMENT_ROOT."/expensereport/class/expensereport.class.php"); +require_once DOL_DOCUMENT_ROOT . '/core/class/html.formfile.class.php'; +require_once DOL_DOCUMENT_ROOT . '/core/class/CMailFile.class.php'; +require_once DOL_DOCUMENT_ROOT . '/core/class/html.formmail.class.php'; +require_once DOL_DOCUMENT_ROOT . '/core/class/html.formprojet.class.php'; +require_once DOL_DOCUMENT_ROOT . '/projet/class/project.class.php'; +require_once DOL_DOCUMENT_ROOT . '/compta/bank/class/account.class.php'; +require_once DOL_DOCUMENT_ROOT . '/core/lib/expensereport.lib.php'; +require_once DOL_DOCUMENT_ROOT . '/core/lib/price.lib.php'; +require_once DOL_DOCUMENT_ROOT . '/core/modules/expensereport/modules_expensereport.php'; +require_once DOL_DOCUMENT_ROOT . '/expensereport/class/expensereport.class.php'; +require_once DOL_DOCUMENT_ROOT . '/core/class/doleditor.class.php'; $langs->load("trips"); @@ -1161,7 +1162,7 @@ if ($action == 'create') dol_fiche_end(); - print '
'; + print '
'; print ''; print '     '; print '
'; From c1069eea470db81d9ca2782dbcc00164f7740fea Mon Sep 17 00:00:00 2001 From: aspangaro Date: Mon, 23 Feb 2015 22:04:01 +0100 Subject: [PATCH 144/287] FIXED: Update licence to GPLv3 --- htdocs/core/modules/expensereport/modules_expensereport.php | 3 +-- htdocs/expensereport/ajax/ajaxprojet.php | 3 +-- htdocs/expensereport/card.php | 3 +-- htdocs/expensereport/list.php | 3 +-- htdocs/expensereport/synchro_compta.php | 3 +-- htdocs/holiday/tomergewithdefine_holiday.php | 5 ++--- htdocs/public/offline.php | 2 +- 7 files changed, 8 insertions(+), 14 deletions(-) diff --git a/htdocs/core/modules/expensereport/modules_expensereport.php b/htdocs/core/modules/expensereport/modules_expensereport.php index 7e40d9df1a2..3fa32af0fdf 100755 --- a/htdocs/core/modules/expensereport/modules_expensereport.php +++ b/htdocs/core/modules/expensereport/modules_expensereport.php @@ -3,7 +3,7 @@ * * 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 + * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, @@ -13,7 +13,6 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - * or see http://www.gnu.org/ */ require_once DOL_DOCUMENT_ROOT.'/core/class/commondocgenerator.class.php'; diff --git a/htdocs/expensereport/ajax/ajaxprojet.php b/htdocs/expensereport/ajax/ajaxprojet.php index 5246e7eb5d9..77d22d1ac90 100755 --- a/htdocs/expensereport/ajax/ajaxprojet.php +++ b/htdocs/expensereport/ajax/ajaxprojet.php @@ -6,7 +6,7 @@ * * 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 + * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, @@ -16,7 +16,6 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - * or see http://www.gnu.org/ */ /** diff --git a/htdocs/expensereport/card.php b/htdocs/expensereport/card.php index 8cbb25fcc53..454bbc98680 100755 --- a/htdocs/expensereport/card.php +++ b/htdocs/expensereport/card.php @@ -5,7 +5,7 @@ * * 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 + * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, @@ -15,7 +15,6 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - * or see http://www.gnu.org/ */ /** diff --git a/htdocs/expensereport/list.php b/htdocs/expensereport/list.php index d71a9410c9f..25769369ef9 100755 --- a/htdocs/expensereport/list.php +++ b/htdocs/expensereport/list.php @@ -6,7 +6,7 @@ * * 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 + * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, @@ -16,7 +16,6 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - * or see http://www.gnu.org/ */ /** diff --git a/htdocs/expensereport/synchro_compta.php b/htdocs/expensereport/synchro_compta.php index 11c91d314fb..b8f7760e409 100755 --- a/htdocs/expensereport/synchro_compta.php +++ b/htdocs/expensereport/synchro_compta.php @@ -3,7 +3,7 @@ * * 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 + * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, @@ -13,7 +13,6 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - * or see http://www.gnu.org/ */ require '../main.inc.php'; diff --git a/htdocs/holiday/tomergewithdefine_holiday.php b/htdocs/holiday/tomergewithdefine_holiday.php index 46dde3028a4..707783712a5 100644 --- a/htdocs/holiday/tomergewithdefine_holiday.php +++ b/htdocs/holiday/tomergewithdefine_holiday.php @@ -4,7 +4,7 @@ * * 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 + * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, @@ -13,8 +13,7 @@ * 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. + * along with this program. If not, see . */ /** diff --git a/htdocs/public/offline.php b/htdocs/public/offline.php index 11ed3d95993..043da4ac9c7 100644 --- a/htdocs/public/offline.php +++ b/htdocs/public/offline.php @@ -6,7 +6,7 @@ * * 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 + * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, From 6436179fb6fae4c0327410c6091324986c1cf093 Mon Sep 17 00:00:00 2001 From: aspangaro Date: Mon, 23 Feb 2015 22:18:39 +0100 Subject: [PATCH 145/287] Correct --- htdocs/expensereport/card.php | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/htdocs/expensereport/card.php b/htdocs/expensereport/card.php index ce3d396e95e..39b42b73e6e 100755 --- a/htdocs/expensereport/card.php +++ b/htdocs/expensereport/card.php @@ -1215,8 +1215,6 @@ else print ''; } - - print '
'; print $langs->trans('RefCustomer') . '
' . $langs->trans('Company') . '' . $soc->getNomUrl(1) . '
' . $langs->trans('Supplier') . '' . $soc->getNomUrl(1) . '
' . $langs->trans('Discounts') . ''; if ($soc->remise_percent) print $langs->trans("CompanyHasRelativeDiscount", $soc->remise_percent); @@ -1716,7 +1713,8 @@ if ($action == 'create') if (! $absolute_discount && ! $absolute_creditnote) print $langs->trans("CompanyHasNoAbsoluteDiscount") . '.'; print '
'; @@ -1744,6 +1742,7 @@ if ($action == 'create') print '
'; print ''; print ''; - + */ + // Payment term print ''; } + + // Public note print ''; - print ''; - print ''; - print ''; + print ''; + print ''; + + // Private note + if (empty($user->societe_id)) { + print ''; + print ''; + print ''; + } + print '
'; @@ -1771,7 +1770,8 @@ if ($action == 'create') } print '
'; print ''; // Delivery date + /* PHFAVRE retrait en temporaire $langs->load('deliveries'); print ''; diff --git a/htdocs/compta/facture.php b/htdocs/compta/facture.php index 1459dac849e..8cb304daf27 100644 --- a/htdocs/compta/facture.php +++ b/htdocs/compta/facture.php @@ -58,6 +58,7 @@ $langs->load('compta'); $langs->load('products'); $langs->load('banks'); $langs->load('main'); +if (!empty($conf->incoterm->enabled)) $langs->load('incoterm'); if (! empty($conf->margin->enabled)) $langs->load('margins'); @@ -318,6 +319,12 @@ if (empty($reshook)) dol_print_error($db, $object->error); } + // Set incoterm + elseif ($action == 'set_incoterms' && !empty($conf->incoterm->enabled)) + { + $result = $object->setIncoterms(GETPOST('incoterm_id', 'int'), GETPOST('location_incoterms', 'alpha')); + } + // bank account else if ($action == 'setbankaccount' && $user->rights->facture->creer) { @@ -674,6 +681,8 @@ if (empty($reshook)) $object->fk_account = GETPOST('fk_account', 'int'); $object->remise_absolue = $_POST['remise_absolue']; $object->remise_percent = $_POST['remise_percent']; + $object->fk_incoterms = GETPOST('incoterm_id', 'int'); + $object->location_incoterms = GETPOST('location_incoterms', 'alpha'); // Proprietes particulieres a facture de remplacement $object->fk_facture_source = $_POST['fac_replacement']; @@ -718,6 +727,8 @@ if (empty($reshook)) $object->fk_account = GETPOST('fk_account', 'int'); $object->remise_absolue = $_POST['remise_absolue']; $object->remise_percent = $_POST['remise_percent']; + $object->fk_incoterms = GETPOST('incoterm_id', 'int'); + $object->location_incoterms = GETPOST('location_incoterms', 'alpha'); // Proprietes particulieres a facture avoir $object->fk_facture_source = $_POST['fac_avoir']; @@ -846,6 +857,8 @@ if (empty($reshook)) $object->amount = $_POST['amount']; $object->remise_absolue = $_POST['remise_absolue']; $object->remise_percent = $_POST['remise_percent']; + $object->fk_incoterms = GETPOST('incoterm_id', 'int'); + $object->location_incoterms = GETPOST('location_incoterms', 'alpha'); if (GETPOST('type') == Facture::TYPE_SITUATION) { @@ -2262,6 +2275,16 @@ if ($action == 'create') print ''; } + // Incoterms + if (!empty($conf->incoterm->enabled)) + { + print ''; + print ''; + print ''; + } + // Other attributes $parameters = array('objectsrc' => $objectsrc,'colspan' => ' colspan="3"'); $reshook = $hookmanager->executeHooks('formObjectOptions', $parameters, $object, $action); // Note that $action and $object may have been modified by @@ -3361,6 +3384,29 @@ if ($action == 'create') print ''; print ''; } + + // Incoterms + if (!empty($conf->incoterm->enabled)) + { + print ''; + print ''; + } // Other attributes $cols = 5; diff --git a/htdocs/compta/facture/class/facture.class.php b/htdocs/compta/facture/class/facture.class.php index 5c645783cc1..3dd4076188b 100644 --- a/htdocs/compta/facture/class/facture.class.php +++ b/htdocs/compta/facture/class/facture.class.php @@ -123,6 +123,11 @@ class Facture extends CommonInvoice var $specimen; var $fac_rec; + + //Incoterms + var $fk_incoterms; + var $location_incoterms; + var $libelle_incoterms; //Used into tooltip /** * @var int Situation cycle reference number @@ -237,6 +242,8 @@ class Facture extends CommonInvoice $this->mode_reglement_id = $_facrec->mode_reglement_id; $this->remise_absolue = $_facrec->remise_absolue; $this->remise_percent = $_facrec->remise_percent; + $this->fk_incoterms = $_facrec->fk_incoterms; + $this->location_incoterms= $_facrec->location_incoterms; // Clean parametres if (! $this->type) $this->type = self::TYPE_STANDARD; @@ -271,6 +278,7 @@ class Facture extends CommonInvoice $sql.= ", fk_facture_source, fk_user_author, fk_projet"; $sql.= ", fk_cond_reglement, fk_mode_reglement, date_lim_reglement, model_pdf"; $sql.= ", situation_cycle_ref, situation_counter, situation_final"; + $sql.= ", fk_incoterms, location_incoterms"; $sql.= ")"; $sql.= " VALUES ("; $sql.= "'(PROV)'"; @@ -296,6 +304,8 @@ class Facture extends CommonInvoice $sql.= ", ".($this->situation_cycle_ref?"'".$this->db->escape($this->situation_cycle_ref)."'":"null"); $sql.= ", ".($this->situation_counter?"'".$this->db->escape($this->situation_counter)."'":"null"); $sql.= ", ".($this->situation_final?$this->situation_final:0); + $sql.= ", ".(int) $this->fk_incoterms; + $sql.= ", '".$this->db->escape($this->location_incoterms)."'"; $sql.=")"; dol_syslog(get_class($this)."::create", LOG_DEBUG); @@ -913,9 +923,12 @@ class Facture extends CommonInvoice $sql.= ', f.fk_account'; $sql.= ', p.code as mode_reglement_code, p.libelle as mode_reglement_libelle'; $sql.= ', c.code as cond_reglement_code, c.libelle as cond_reglement_libelle, c.libelle_facture as cond_reglement_libelle_doc'; + $sql.= ', f.fk_incoterms, f.location_incoterms'; + $sql.= ", i.libelle as libelle_incoterms"; $sql.= ' FROM '.MAIN_DB_PREFIX.'facture as f'; $sql.= ' LEFT JOIN '.MAIN_DB_PREFIX.'c_payment_term as c ON f.fk_cond_reglement = c.rowid'; $sql.= ' LEFT JOIN '.MAIN_DB_PREFIX.'c_paiement as p ON f.fk_mode_reglement = p.id'; + $sql.= ' LEFT JOIN '.MAIN_DB_PREFIX.'c_incoterms as i ON f.fk_incoterms = i.rowid'; $sql.= ' WHERE f.entity = '.$conf->entity; if ($rowid) $sql.= " AND f.rowid=".$rowid; if ($ref) $sql.= " AND f.facnumber='".$this->db->escape($ref)."'"; @@ -975,6 +988,11 @@ class Facture extends CommonInvoice $this->situation_final = $obj->situation_final; $this->extraparams = (array) json_decode($obj->extraparams, true); + //Incoterms + $this->fk_incoterms = $obj->fk_incoterms; + $this->location_incoterms = $obj->location_incoterms; + $this->libelle_incoterms = $obj->libelle_incoterms; + if ($this->statut == 0) $this->brouillon = 1; // Retreive all extrafield for invoice diff --git a/htdocs/expedition/card.php b/htdocs/expedition/card.php index 7e7b3cf6e3b..c9e3609eafa 100644 --- a/htdocs/expedition/card.php +++ b/htdocs/expedition/card.php @@ -51,6 +51,7 @@ $langs->load('orders'); $langs->load('stocks'); $langs->load('other'); $langs->load('propal'); +if (!empty($conf->incoterm->enabled)) $langs->load('incoterm'); if (! empty($conf->productbatch->enabled)) $langs->load('productbatch'); $origin = GETPOST('origin','alpha')?GETPOST('origin','alpha'):'expedition'; // Example: commande, propal @@ -104,6 +105,12 @@ if (($action == 'create') || ($action == 'add')) } } +// Set incoterm +if ($action == 'set_incoterms' && !empty($conf->incoterm->enabled)) +{ + $result = $object->setIncoterms(GETPOST('incoterm_id', 'int'), GETPOST('location_incoterms', 'alpha')); +} + $parameters=array(); $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'); @@ -143,6 +150,8 @@ if (empty($reshook)) $object->ref_int = GETPOST('ref_int','alpha'); $object->note_private = GETPOST('note_private'); $object->note_public = GETPOST('note_public'); + $object->fk_incoterms = GETPOST('incoterm_id', 'int'); + $object->location_incoterms = GETPOST('location_incoterms', 'alpha'); $num=count($objectsrc->lines); $totalqty=0; @@ -571,6 +580,16 @@ if ($action == 'create') print ''; print "\n"; + // Incoterms + if (!empty($conf->incoterm->enabled)) + { + print ''; + print ''; + print ''; + } + // Other attributes $parameters=array('colspan' => ' colspan="3"'); $reshook=$hookmanager->executeHooks('formObjectOptions',$parameters,$expe,$action); // Note that $action and $object may have been modified by hook @@ -1159,6 +1178,29 @@ else if ($id || $ref) print $form->editfieldval("TrackingNumber",'trackingnumber',$object->tracking_url,$object,$user->rights->expedition->creer,'string',$object->tracking_number); print ''; + // Incoterms + if (!empty($conf->incoterm->enabled)) + { + print ''; + print ''; + } + // Other attributes $parameters=array('colspan' => ' colspan="3"'); $reshook=$hookmanager->executeHooks('formObjectOptions',$parameters,$object,$action); // Note that $action and $object may have been modified by hook diff --git a/htdocs/expedition/class/expedition.class.php b/htdocs/expedition/class/expedition.class.php index 67426510da2..03f4868dbbf 100644 --- a/htdocs/expedition/class/expedition.class.php +++ b/htdocs/expedition/class/expedition.class.php @@ -90,6 +90,10 @@ class Expedition extends CommonObject var $listmeths; // List of carriers + //Incorterms + var $fk_incoterms; + var $location_incoterms; + var $libelle_incoterms; //Used into tooltip /** * Constructor @@ -214,6 +218,7 @@ class Expedition extends CommonObject $sql.= ", note_private"; $sql.= ", note_public"; $sql.= ", model_pdf"; + $sql.= ", fk_incoterms, location_incoterms"; $sql.= ") VALUES ("; $sql.= "'(PROV)'"; $sql.= ", ".$conf->entity; @@ -236,6 +241,8 @@ class Expedition extends CommonObject $sql.= ", ".(!empty($this->note_private)?"'".$this->db->escape($this->note_private)."'":"null"); $sql.= ", ".(!empty($this->note_public)?"'".$this->db->escape($this->note_public)."'":"null"); $sql.= ", ".(!empty($this->model_pdf)?"'".$this->db->escape($this->model_pdf)."'":"null"); + $sql.= ", ".(int) $this->fk_incoterms; + $sql.= ", '".$this->db->escape($this->location_incoterms)."'"; $sql.= ")"; dol_syslog(get_class($this)."::create", LOG_DEBUG); @@ -414,8 +421,11 @@ class Expedition extends CommonObject $sql.= ", e.fk_shipping_method, e.tracking_number"; $sql.= ", el.fk_source as origin_id, el.sourcetype as origin"; $sql.= ", e.note_private, e.note_public"; + $sql.= ', e.fk_incoterms, e.location_incoterms'; + $sql.= ', i.libelle as libelle_incoterms'; $sql.= " FROM ".MAIN_DB_PREFIX."expedition as e"; $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."element_element as el ON el.fk_target = e.rowid AND el.targettype = '".$this->element."'"; + $sql.= ' LEFT JOIN '.MAIN_DB_PREFIX.'c_incoterms as i ON e.fk_incoterms = i.rowid'; $sql.= " WHERE e.entity = ".$conf->entity; if ($id) $sql.= " AND e.rowid=".$id; if ($ref) $sql.= " AND e.ref='".$this->db->escape($ref)."'"; @@ -468,6 +478,11 @@ class Expedition extends CommonObject $this->trueSize = $obj->size."x".$obj->width."x".$obj->height; $this->size_units = $obj->size_units; + //Incoterms + $this->fk_incoterms = $obj->fk_incoterms; + $this->location_incoterms = $obj->location_incoterms; + $this->libelle_incoterms = $obj->libelle_incoterms; + $this->db->free($result); if ($this->statut == 0) $this->brouillon = 1; diff --git a/htdocs/fourn/class/fournisseur.commande.class.php b/htdocs/fourn/class/fournisseur.commande.class.php index 7f2237859ea..19819e55387 100644 --- a/htdocs/fourn/class/fournisseur.commande.class.php +++ b/htdocs/fourn/class/fournisseur.commande.class.php @@ -86,6 +86,11 @@ class CommandeFournisseur extends CommonOrder var $user_valid_id; var $user_approve_id; + //Incorterms + var $fk_incoterms; + var $location_incoterms; + var $libelle_incoterms; //Used into tooltip + var $extraparams=array(); @@ -137,10 +142,13 @@ class CommandeFournisseur extends CommonOrder $sql.= " cm.libelle as methode_commande,"; $sql.= " cr.code as cond_reglement_code, cr.libelle as cond_reglement_libelle,"; $sql.= " p.code as mode_reglement_code, p.libelle as mode_reglement_libelle"; + $sql.= ', c.fk_incoterms, c.location_incoterms'; + $sql.= ', i.libelle as libelle_incoterms'; $sql.= " FROM ".MAIN_DB_PREFIX."commande_fournisseur as c"; $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."c_payment_term as cr ON (c.fk_cond_reglement = cr.rowid)"; $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."c_paiement as p ON (c.fk_mode_reglement = p.id)"; $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."c_input_method as cm ON cm.rowid = c.fk_input_method"; + $sql.= ' LEFT JOIN '.MAIN_DB_PREFIX.'c_incoterms as i ON c.fk_incoterms = i.rowid'; $sql.= " WHERE c.entity = ".$conf->entity; if ($ref) $sql.= " AND c.ref='".$this->db->escape($ref)."'"; else $sql.= " AND c.rowid=".$id; @@ -196,6 +204,11 @@ class CommandeFournisseur extends CommonOrder $this->note_public = $obj->note_public; $this->modelpdf = $obj->model_pdf; + //Incoterms + $this->fk_incoterms = $obj->fk_incoterms; + $this->location_incoterms = $obj->location_incoterms; + $this->libelle_incoterms = $obj->libelle_incoterms; + $this->extraparams = (array) json_decode($obj->extraparams, true); $this->db->free($resql); @@ -906,6 +919,7 @@ class CommandeFournisseur extends CommonOrder $sql.= ", fk_mode_reglement"; $sql.= ", fk_cond_reglement"; $sql.= ", fk_account"; + $sql.= ", fk_incoterms, location_incoterms"; $sql.= ") "; $sql.= " VALUES ("; $sql.= "''"; @@ -923,6 +937,8 @@ class CommandeFournisseur extends CommonOrder $sql.= ", ".($this->mode_reglement_id > 0 ? $this->mode_reglement_id : 'null'); $sql.= ", ".($this->cond_reglement_id > 0 ? $this->cond_reglement_id : 'null'); $sql.= ", ".($this->fk_account>0?$this->fk_account:'NULL'); + $sql.= ", ".(int) $this->fk_incoterms; + $sql.= ", '".$this->db->escape($this->location_incoterms)."'"; $sql.= ")"; dol_syslog(get_class($this)."::create", LOG_DEBUG); @@ -2203,7 +2219,7 @@ class CommandeFournisseurLigne extends CommonOrderLine $this->date_start = $this->db->jdate($objp->date_start); $this->date_end = $this->db->jdate($objp->date_end); - + $this->db->free($result); return 1; } diff --git a/htdocs/fourn/class/fournisseur.facture.class.php b/htdocs/fourn/class/fournisseur.facture.class.php index 71e5c320dfa..4260f23a343 100644 --- a/htdocs/fourn/class/fournisseur.facture.class.php +++ b/htdocs/fourn/class/fournisseur.facture.class.php @@ -93,6 +93,11 @@ class FactureFournisseur extends CommonInvoice var $fournisseur; // deprecated var $thirdparty; // To store thirdparty + //Incorterms + var $fk_incoterms; + var $location_incoterms; + var $libelle_incoterms; //Used into tooltip + var $extraparams=array(); /** @@ -186,6 +191,7 @@ class FactureFournisseur extends CommonInvoice $sql.= ", note_public"; $sql.= ", fk_user_author"; $sql.= ", date_lim_reglement"; + $sql.= ", fk_incoterms, location_incoterms"; $sql.= ")"; $sql.= " VALUES ("; $sql.= "'(PROV)'"; @@ -203,6 +209,8 @@ class FactureFournisseur extends CommonInvoice $sql.= ", '".$this->db->escape($this->note_public)."'"; $sql.= ", ".$user->id.","; $sql.= $this->date_echeance!=''?"'".$this->db->idate($this->date_echeance)."'":"null"; + $sql.= ", ".(int) $this->fk_incoterms; + $sql.= ", '".$this->db->escape($this->location_incoterms)."'"; $sql.= ")"; dol_syslog(get_class($this)."::create", LOG_DEBUG); @@ -369,11 +377,14 @@ class FactureFournisseur extends CommonInvoice $sql.= " t.extraparams,"; $sql.= " cr.code as cond_reglement_code, cr.libelle as cond_reglement_libelle,"; $sql.= " p.code as mode_reglement_code, p.libelle as mode_reglement_libelle,"; - $sql.= ' s.nom as socnom, s.rowid as socid'; + $sql.= ' s.nom as socnom, s.rowid as socid,'; + $sql.= ' t.fk_incoterms, t.location_incoterms,'; + $sql.= " i.libelle as libelle_incoterms"; $sql.= ' FROM '.MAIN_DB_PREFIX.'facture_fourn as t'; $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."societe as s ON (t.fk_soc = s.rowid)"; $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."c_payment_term as cr ON (t.fk_cond_reglement = cr.rowid)"; $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."c_paiement as p ON (t.fk_mode_reglement = p.id)"; + $sql.= ' LEFT JOIN '.MAIN_DB_PREFIX.'c_incoterms as i ON t.fk_incoterms = i.rowid'; if ($id) $sql.= " WHERE t.rowid=".$id; if ($ref) $sql.= " WHERE t.ref='".$this->db->escape($ref)."'"; @@ -433,6 +444,11 @@ class FactureFournisseur extends CommonInvoice $this->modelpdf = $obj->model_pdf; $this->import_key = $obj->import_key; + //Incoterms + $this->fk_incoterms = $obj->fk_incoterms; + $this->location_incoterms = $obj->location_incoterms; + $this->libelle_incoterms = $obj->libelle_incoterms; + $this->extraparams = (array) json_decode($obj->extraparams, true); $this->socid = $obj->socid; diff --git a/htdocs/fourn/commande/card.php b/htdocs/fourn/commande/card.php index fe22a154251..b4857d4f9c3 100644 --- a/htdocs/fourn/commande/card.php +++ b/htdocs/fourn/commande/card.php @@ -55,6 +55,7 @@ $langs->load('propal'); $langs->load('deliveries'); $langs->load('products'); $langs->load('stocks'); +if (!empty($conf->incoterm->enabled)) $langs->load('incoterm'); $id = GETPOST('id','int'); $ref = GETPOST('ref','alpha'); @@ -135,6 +136,12 @@ if ($action == 'setmode' && $user->rights->fournisseur->commande->creer) $result = $object->setPaymentMethods(GETPOST('mode_reglement_id','int')); } +// Set incoterm +if ($action == 'set_incoterms' && !empty($conf->incoterm->enabled)) +{ + $result = $object->setIncoterms(GETPOST('incoterm_id', 'int'), GETPOST('location_incoterms', 'alpha')); +} + // bank account if ($action == 'setbankaccount' && $user->rights->fournisseur->commande->creer) { @@ -844,6 +851,8 @@ if ($action == 'add' && $user->rights->fournisseur->commande->creer) $object->fk_account = GETPOST('fk_account', 'int'); $object->note_private = GETPOST('note_private'); $object->note_public = GETPOST('note_public'); + $object->fk_incoterms = GETPOST('incoterm_id', 'int'); + $object->location_incoterms = GETPOST('location_incoterms', 'alpha'); // Fill array 'array_options' with data from add form $ret = $extrafields->setOptionalsFromPost($extralabels,$object); @@ -1284,6 +1293,16 @@ if ($action=="create") print ''; } + // Incoterms + if (!empty($conf->incoterm->enabled)) + { + print ''; + print ''; + print ''; + } + print ''; print ''; print ''; } - + + // Incoterms + if (!empty($conf->incoterm->enabled)) + { + print ''; + print ''; + } + // Other attributes $cols = 3; include DOL_DOCUMENT_ROOT . '/core/tpl/extrafields_view.tpl.php'; diff --git a/htdocs/fourn/facture/card.php b/htdocs/fourn/facture/card.php index 325a9e5d591..290585ac080 100644 --- a/htdocs/fourn/facture/card.php +++ b/htdocs/fourn/facture/card.php @@ -52,6 +52,7 @@ $langs->load('suppliers'); $langs->load('companies'); $langs->load('products'); $langs->load('banks'); +if (!empty($conf->incoterm->enabled)) $langs->load('incoterm'); $id = (GETPOST('facid','int') ? GETPOST('facid','int') : GETPOST('id','int')); $action = GETPOST("action"); @@ -224,6 +225,12 @@ else if ($action == 'setmode' && $user->rights->fournisseur->commande->creer) $result = $object->setPaymentMethods(GETPOST('mode_reglement_id','int')); } +// Set incoterm +elseif ($action == 'set_incoterms' && !empty($conf->incoterm->enabled)) +{ + $result = $object->setIncoterms(GETPOST('incoterm_id', 'int'), GETPOST('location_incoterms', 'alpha')); +} + // bank account else if ($action == 'setbankaccount' && $user->rights->fournisseur->facture->creer) { $result=$object->setBankAccount(GETPOST('fk_account', 'int')); @@ -328,6 +335,8 @@ elseif ($action == 'add' && $user->rights->fournisseur->facture->creer) $object->mode_reglement_id = GETPOST('mode_reglement_id'); $object->fk_account = GETPOST('fk_account', 'int'); $object->fk_project = ($tmpproject > 0) ? $tmpproject : null; + $object->fk_incoterms = GETPOST('incoterm_id', 'int'); + $object->location_incoterms = GETPOST('location_incoterms', 'alpha'); // Auto calculation of date due if not filled by user if(empty($object->date_echeance)) $object->date_echeance = $object->calculate_date_lim_reglement(); @@ -1404,6 +1413,16 @@ if ($action == 'create') $formproject->select_projects((empty($conf->global->PROJECT_CAN_ALWAYS_LINK_TO_ALL_SUPPLIERS)?$object->socid:'-1'), $projectid, 'projectid', 0); print ''; } + + // Incoterms + if (!empty($conf->incoterm->enabled)) + { + print ''; + print ''; + print ''; + } // Bank Account print ''; } + // Incoterms + if (!empty($conf->incoterm->enabled)) + { + print ''; + print ''; + } + // Other attributes $cols = 4; include DOL_DOCUMENT_ROOT . '/core/tpl/extrafields_view.tpl.php'; diff --git a/htdocs/install/mysql/migration/3.7.0-3.8.0.sql b/htdocs/install/mysql/migration/3.7.0-3.8.0.sql index 360c99af189..385268b1ad7 100755 --- a/htdocs/install/mysql/migration/3.7.0-3.8.0.sql +++ b/htdocs/install/mysql/migration/3.7.0-3.8.0.sql @@ -101,7 +101,12 @@ ALTER TABLE llx_contratdet_extrafields ADD INDEX idx_contratdet_extrafields (fk_ -- -- Module incoterm -- -ALTER TABLE llx_facture ADD COLUMN ( +ALTER TABLE llx_societe ADD COLUMN ( + fk_incoterms integer, + location_incoterms varchar(255) +); + +ALTER TABLE llx_propal ADD COLUMN ( fk_incoterms integer, location_incoterms varchar(255) ); @@ -111,7 +116,17 @@ ALTER TABLE llx_commande ADD COLUMN ( location_incoterms varchar(255) ); -ALTER TABLE llx_propal ADD COLUMN ( +ALTER TABLE llx_commande_fournisseur ADD COLUMN ( + fk_incoterms integer, + location_incoterms varchar(255) +); + +ALTER TABLE llx_facture ADD COLUMN ( + fk_incoterms integer, + location_incoterms varchar(255) +); + +ALTER TABLE llx_facture_fourn ADD COLUMN ( fk_incoterms integer, location_incoterms varchar(255) ); @@ -126,16 +141,6 @@ ALTER TABLE llx_livraison ADD COLUMN ( location_incoterms varchar(255) ); -ALTER TABLE llx_societe ADD COLUMN ( - fk_incoterms integer, - location_incoterms varchar(255) -); - -ALTER TABLE llx_commande_fournisseur ADD COLUMN ( - fk_incoterms integer, - location_incoterms varchar(255) -); - CREATE TABLE IF NOT EXISTS llx_c_incoterms ( rowid integer NOT NULL AUTO_INCREMENT, code varchar(3) NOT NULL, diff --git a/htdocs/livraison/card.php b/htdocs/livraison/card.php index 4ab76afe239..e50fb9c8ea8 100644 --- a/htdocs/livraison/card.php +++ b/htdocs/livraison/card.php @@ -43,6 +43,7 @@ $langs->load("sendings"); $langs->load("bills"); $langs->load('deliveries'); $langs->load('orders'); +if (!empty($conf->incoterm->enabled)) $langs->load('incoterm'); $action=GETPOST('action', 'alpha'); $confirm=GETPOST('confirm', 'alpha'); @@ -80,7 +81,8 @@ if ($action == 'add') $object->date_livraison = time(); $object->note = $_POST["note"]; $object->commande_id = $_POST["commande_id"]; - + $object->fk_incoterms = GETPOST('incoterm_id', 'int'); + if (!$conf->expedition_bon->enabled && ! empty($conf->stock->enabled)) { $expedition->entrepot_id = $_POST["entrepot_id"]; @@ -173,6 +175,12 @@ if ($action == 'setdate_livraison' && $user->rights->expedition->livraison->cree } } +// Set incoterm +elseif ($action == 'set_incoterms' && !empty($conf->incoterm->enabled)) +{ + $result = $object->setIncoterms(GETPOST('incoterm_id', 'int'), GETPOST('location_incoterms', 'alpha')); +} + /* * Build document */ @@ -579,6 +587,29 @@ else print ''; print ''; + // Incoterms + if (!empty($conf->incoterm->enabled)) + { + print ''; + print ''; + } + // Note Public print ''; print ''; print ''; print ''; + print ''; print ''; } From d3a79c87245bff5227e3486c7e75bbf203b43489 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 23 Feb 2015 14:44:24 +0100 Subject: [PATCH 137/287] Fix default entity guess --- htdocs/user/card.php | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/htdocs/user/card.php b/htdocs/user/card.php index 429bcc91130..ec6b65e534c 100644 --- a/htdocs/user/card.php +++ b/htdocs/user/card.php @@ -1,7 +1,7 @@ * Copyright (C) 2002-2003 Jean-Louis Bergamo - * Copyright (C) 2004-2012 Laurent Destailleur + * Copyright (C) 2004-2015 Laurent Destailleur * Copyright (C) 2004 Eric Seigne * Copyright (C) 2005-2012 Regis Houssin * Copyright (C) 2005 Lionel Cousteix @@ -213,25 +213,25 @@ if ($action == 'add' && $canadduser) $ret = $extrafields->setOptionalsFromPost($extralabels,$object); // If multicompany is off, admin users must all be on entity 0. + $entity=GETPOST('entity','int'); if (! empty($conf->multicompany->enabled)) { - $entity=GETPOST('entity','int'); if (! empty($_POST["superadmin"])) { $object->entity = 0; } else if ($conf->multicompany->transverse_mode) { - $object->entity = 1; // all users in master entity + $object->entity = 1; // all users are forced into master entity } else { - $object->entity = (empty($entity) ? 0 : $entity); + $object->entity = ($entity == '' ? 1 : $entity); } } else { - $object->entity = (empty($entity) ? 0 : $entity); + $object->entity = ($entity == '' ? 1 : $entity); } $db->begin(); From 94a5f87bd8447397a6c2a21b33a0a1581a6412cd Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 23 Feb 2015 15:13:14 +0100 Subject: [PATCH 138/287] comment --- htdocs/user/card.php | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/htdocs/user/card.php b/htdocs/user/card.php index e8aae1b6af8..bc1b0bea09f 100644 --- a/htdocs/user/card.php +++ b/htdocs/user/card.php @@ -212,7 +212,7 @@ if ($action == 'add' && $canadduser) // Fill array 'array_options' with data from add form $ret = $extrafields->setOptionalsFromPost($extralabels,$object); - // If multicompany is off, admin users must all be on entity 0. + // Set entity of new user $entity=GETPOST('entity','int'); if (! empty($conf->multicompany->enabled)) { @@ -230,8 +230,11 @@ if ($action == 'add' && $canadduser) } } else - { + { $object->entity = ($entity == '' ? 1 : $entity); + /*if ($user->admin && $user->entity == 0 && GETPOST("admin",'alpha')) + { + }*/ } $db->begin(); From 4128c8603554dfd2972252edb36a6c8d2dcd1baa Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 23 Feb 2015 19:31:42 +0100 Subject: [PATCH 139/287] Fix: Filter on statut was lost --- htdocs/fourn/commande/list.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/fourn/commande/list.php b/htdocs/fourn/commande/list.php index 54cc7b1964a..69db321b72e 100644 --- a/htdocs/fourn/commande/list.php +++ b/htdocs/fourn/commande/list.php @@ -43,7 +43,7 @@ $search_company=GETPOST('search_company'); $search_user=GETPOST('search_user'); $search_ttc=GETPOST('search_ttc'); $sall=GETPOST('search_all'); -$search_status=GETPOST('search_status','int'); +$search_status=(GETPOST('search_status','int')!=''?GETPOST('search_status','int'):GETPOST('statut','int')); $page = GETPOST('page','int'); $socid = GETPOST('socid','int'); From 2ef654045b4f3f4f07fc34476826e8501c5a7f25 Mon Sep 17 00:00:00 2001 From: cla Date: Mon, 23 Feb 2015 20:26:34 +0100 Subject: [PATCH 140/287] ADD: new fields and relative filters in contracts list page --- htdocs/contrat/list.php | 77 +++++++++++++++++++++++++++++++++++++++-- 1 file changed, 74 insertions(+), 3 deletions(-) diff --git a/htdocs/contrat/list.php b/htdocs/contrat/list.php index b83ecc329b7..505c2d3e79a 100644 --- a/htdocs/contrat/list.php +++ b/htdocs/contrat/list.php @@ -4,6 +4,7 @@ * Copyright (C) 2005-2012 Regis Houssin * Copyright (C) 2013 Cédric Salvador * Copyright (C) 2014 Juanjo Menent + * Copyright (C) 2015 Claudio Aschieri * * 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 @@ -27,6 +28,7 @@ require ("../main.inc.php"); require_once (DOL_DOCUMENT_ROOT."/contrat/class/contrat.class.php"); +require_once DOL_DOCUMENT_ROOT.'/core/class/html.formother.class.php'; $langs->load("contracts"); $langs->load("products"); @@ -47,6 +49,8 @@ $sall=GETPOST('sall'); $search_status=GETPOST('search_status'); $socid=GETPOST('socid'); +$search_sale = GETPOST('search_sale','int'); + if (! $sortfield) $sortfield="c.rowid"; if (! $sortorder) $sortorder="DESC"; @@ -63,6 +67,7 @@ if (GETPOST("button_removefilter_x") || GETPOST("button_removefilter")) // Both $search_name=""; $search_contract=""; $search_ref_supplier=""; + $search_sale=""; $sall=""; $search_status=""; } @@ -75,6 +80,8 @@ if ($search_status == '') $search_status=1; */ $now=dol_now(); +$formother = new FormOther($db); +$socstatic = new Societe($db); llxHeader(); @@ -87,13 +94,13 @@ $sql.= ' SUM('.$db->ifsql("cd.statut=4 AND (cd.date_fin_validite IS NOT NULL AND $sql.= ' SUM('.$db->ifsql("cd.statut=4 AND (cd.date_fin_validite IS NOT NULL AND cd.date_fin_validite < '".$db->idate($now - $conf->contrat->services->expires->warning_delay)."')",1,0).') as nb_late,'; $sql.= ' SUM('.$db->ifsql("cd.statut=5",1,0).') as nb_closed'; $sql.= " FROM ".MAIN_DB_PREFIX."societe as s"; -if (!$user->rights->societe->client->voir && !$socid) $sql.= ", ".MAIN_DB_PREFIX."societe_commerciaux as sc"; +if ($search_sale > 0 || (! $user->rights->societe->client->voir && ! $socid)) $sql .= ", ".MAIN_DB_PREFIX."societe_commerciaux as sc"; $sql.= ", ".MAIN_DB_PREFIX."contrat as c"; $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."contratdet as cd ON c.rowid = cd.fk_contrat"; $sql.= " WHERE c.fk_soc = s.rowid "; $sql.= " AND c.entity = ".$conf->entity; if ($socid) $sql.= " AND s.rowid = ".$socid; -if (!$user->rights->societe->client->voir && !$socid) $sql.= " AND s.rowid = sc.fk_soc AND sc.fk_user = " .$user->id; + if ($search_name) { $sql .= natural_search('s.nom', $search_name); } @@ -103,6 +110,12 @@ if ($search_contract) { if (!empty($search_ref_supplier)) { $sql .= natural_search(array('c.ref_supplier'), $search_ref_supplier); } + +if ($search_sale > 0) +{ + $sql.= " AND s.rowid = sc.fk_soc AND sc.fk_user = " .$search_sale; +} + if ($sall) { $sql .= natural_search(array('s.nom', 'cd.label', 'cd.description'), $sall); } @@ -121,13 +134,34 @@ if ($resql) print '
'; print '
'; @@ -1790,6 +1790,7 @@ if ($action == 'create') print '
'; print ''; print ''; - + */ + // Delivery delay + /* PHFAVRE retrait en temporaire print '"; + print ""; + print ""; + print ""; + print ""; + print ""; + print ""; + print ""; + print ""; + } + } + } + else + { + foreach ( $tabbq[$key] as $k => $mt ) + { print ""; print ""; - print ""; - print ""; - print ""; - print ""; + print ""; + print ""; + print ""; print ""; print ""; print ""; } } - $var = ! $var; } From 4781707fa444f0b59d71621d3d43bd2ccbf97fc8 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 22 Feb 2015 16:01:01 +0100 Subject: [PATCH 116/287] Fix jodconverter can't work without the wrapper jodconverter. --- htdocs/includes/odtphp/odf.php | 15 ++++++----- scripts/odt2pdf/odt2pdf.sh | 49 ++++++++++++++++++++-------------- 2 files changed, 38 insertions(+), 26 deletions(-) diff --git a/htdocs/includes/odtphp/odf.php b/htdocs/includes/odtphp/odf.php index d4b79af8013..a13a3923eab 100644 --- a/htdocs/includes/odtphp/odf.php +++ b/htdocs/includes/odtphp/odf.php @@ -486,11 +486,14 @@ IMG; $execmethod=(empty($conf->global->MAIN_EXEC_USE_POPEN)?1:2); // 1 or 2 - $name=str_replace('.odt', '', $name); - if (!empty($conf->global->MAIN_DOL_SCRIPTS_ROOT)) { - $command = $conf->global->MAIN_DOL_SCRIPTS_ROOT.'/scripts/odt2pdf/odt2pdf.sh '.$name; - }else { - $command = '../../scripts/odt2pdf/odt2pdf.sh '.$name; + $name=preg_replace('/\.odt/i', '', $name); + if (!empty($conf->global->MAIN_DOL_SCRIPTS_ROOT)) + { + $command = $conf->global->MAIN_DOL_SCRIPTS_ROOT.'/scripts/odt2pdf/odt2pdf.sh '.$name.' '.(is_numeric($conf->global->MAIN_ODT_AS_PDF)?'jodconverter':$conf->global->MAIN_ODT_AS_PDF); + } + else + { + $command = '../../scripts/odt2pdf/odt2pdf.sh '.$name.' '.(is_numeric($conf->global->MAIN_ODT_AS_PDF)?'jodconverter':$conf->global->MAIN_ODT_AS_PDF); } @@ -620,7 +623,7 @@ IMG; public function getvalue($valuename) { $searchreg="/\\[".$valuename."\\](.*)\\[\\/".$valuename."\\]/"; - preg_match($searchreg, $this->contentXml, $matches); + preg_match($searchreg, $this->contentXml, $matches); $this->contentXml = preg_replace($searchreg, "", $this->contentXml); return $matches[1]; } diff --git a/scripts/odt2pdf/odt2pdf.sh b/scripts/odt2pdf/odt2pdf.sh index c7c768a1244..b44ab3e6d78 100755 --- a/scripts/odt2pdf/odt2pdf.sh +++ b/scripts/odt2pdf/odt2pdf.sh @@ -1,30 +1,27 @@ #!/bin/bash -# @copyright GPL License 2010 - Vikas Mahajan - http://vikasmahajan.wordpress.com -# @copyright GPL License 2013 - Florian HEnry - florian.henry@open-concept.pro +# @copyright GPL License 2010 - Vikas Mahajan - http://vikasmahajan.wordpress.com +# @copyright GPL License 2013 - Florian HEnry - florian.henry@open-concept.pro +# @copyright GPL License 2015 - Laurent Destailleur - eldy@users.sourceforge.net # -# Convert an ODT into a PDF using "jodconverter" tool. -# Dolibarr variable MAIN_ODT_AS_PDF must be defined to have this script called after ODT generation. +# Convert an ODT into a PDF using "jodconverter" or "pyodconverter" tool. +# Dolibarr variable MAIN_ODT_AS_PDF must be defined to value "jodconverter" to call jodconverter wrapper after ODT generation +# or value "pyodconverter" to call DocumentConverter.py after ODT generation. +# or value "/pathto/jodconverter-cli-file.jar" to call jodconverter java tool without wrapper after ODT generation. # Dolibarr variable MAIN_DOL_SCRIPTS_ROOT must be defined to path of script directories (otherwise dolibarr will try to guess). -#if [ -f "$1.odt" ] -# then -# soffice --invisible --convert-to pdf:writer_pdf_Export --outdir $2 "$1.odt" -# retcode=$? -# if [ $retcode -ne 0 ] -# then -# echo "Error while converting odt to pdf: $retcode"; -# exit 1 -# fi -# else -# echo "Error: Odt file does not exist" -# exit 1 -#fi +if [ "x$1" == "x" ] +then + echo "Usage: odt2pdf.sh fullfilename [jodconverter|pyodconverter|pathtojodconverterjar]" + echo "Example: odt2pdf.sh myfile ~/jodconverter/jodconverter-cli-2.2.2.jar" + exit +fi + if [ -f "$1.odt" ] then nbprocess=$(pgrep -c soffice) - if [ $nbprocess -ne 1 ] + if [ $nbprocess -ne 1 ] # If there is some soffice process running then soffice --invisible --accept="socket,host=127.0.0.1,port=8100;urp;" --nofirststartwizard --headless & retcode=$? @@ -35,7 +32,19 @@ if [ -f "$1.odt" ] fi sleep 2 fi - jodconverter "$1.odt" "$1.pdf" + + if [ "x$2" == "xjodconverter" ] + then + jodconverter "$1.odt" "$1.pdf" + else + if [ "x$2" == "xpyodconverter" ] + then + python DocumentConverter.py "$1.odt" "$1.pdf" + else + java -jar $2 "$1.odt" "$1.pdf" + fi + fi + retcode=$? if [ $retcode -ne 0 ] then @@ -44,6 +53,6 @@ if [ -f "$1.odt" ] fi sleep 1 else - echo "Error: Odt file does not exist" + echo "Error: Odt file $1.odt does not exist" exit 1 fi From 6e10dd3cce61650f330591b6ee48bdd1b1c6ebcd Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 22 Feb 2015 17:10:13 +0100 Subject: [PATCH 117/287] Trad --- htdocs/install/mysql/migration/3.7.0-3.8.0.sql | 7 +++++++ htdocs/langs/en_US/main.lang | 1 + 2 files changed, 8 insertions(+) diff --git a/htdocs/install/mysql/migration/3.7.0-3.8.0.sql b/htdocs/install/mysql/migration/3.7.0-3.8.0.sql index 4a71995133c..fb644e5b9a7 100755 --- a/htdocs/install/mysql/migration/3.7.0-3.8.0.sql +++ b/htdocs/install/mysql/migration/3.7.0-3.8.0.sql @@ -19,6 +19,12 @@ -- -- VMYSQL4.1 DELETE FROM llx_usergroup_user WHERE fk_usergroup NOT IN (SELECT rowid from llx_usergroup); +ALTER TABLE llx_commande_fournisseur MODIFY COLUMN date_livraison datetime; + +-- Add id commandefourndet in llx_commande_fournisseur_dispatch to correct /fourn/commande/dispatch.php display when several times same product in supplier order +ALTER TABLE llx_commande_fournisseur_dispatch ADD COLUMN fk_commandefourndet INT(11) NOT NULL DEFAULT '0' AFTER fk_product; + + -- Remove menu entries of removed or renamed modules DELETE FROM llx_menu where module = 'printipp'; @@ -190,3 +196,4 @@ CREATE TABLE llx_expensereport_det ALTER TABLE llx_projet ADD COLUMN budget_amount double(24,8); + diff --git a/htdocs/langs/en_US/main.lang b/htdocs/langs/en_US/main.lang index d7e82aa43b8..0b5347f6e38 100644 --- a/htdocs/langs/en_US/main.lang +++ b/htdocs/langs/en_US/main.lang @@ -141,6 +141,7 @@ Cancel=Cancel Modify=Modify Edit=Edit Validate=Validate +ValidateAndApprove=Validate and Approve ToValidate=To validate Save=Save SaveAs=Save As From b04682db4c66aa30a1555d58eeaed3eea1abdf52 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 22 Feb 2015 17:41:02 +0100 Subject: [PATCH 118/287] Fix Edit of extrafield on supplier invoice or order was deleteing other fields. Fix Missing escapment Fix new field delivery date was only into edit page --- htdocs/admin/supplierinvoice_extrafields.php | 1 + htdocs/core/class/extrafields.class.php | 4 ++-- .../class/fournisseur.commande.class.php | 8 +++---- htdocs/fourn/commande/card.php | 21 +++++++++++++------ htdocs/fourn/facture/card.php | 2 +- 5 files changed, 23 insertions(+), 13 deletions(-) diff --git a/htdocs/admin/supplierinvoice_extrafields.php b/htdocs/admin/supplierinvoice_extrafields.php index 79dc0637b46..755a68b338e 100644 --- a/htdocs/admin/supplierinvoice_extrafields.php +++ b/htdocs/admin/supplierinvoice_extrafields.php @@ -31,6 +31,7 @@ require '../main.inc.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/fourn.lib.php'; require_once DOL_DOCUMENT_ROOT.'/core/class/extrafields.class.php'; +$langs->load("orders"); if (!$user->admin) accessforbidden(); diff --git a/htdocs/core/class/extrafields.class.php b/htdocs/core/class/extrafields.class.php index 544619892b5..008dff0f019 100644 --- a/htdocs/core/class/extrafields.class.php +++ b/htdocs/core/class/extrafields.class.php @@ -1061,8 +1061,8 @@ class ExtraFields * Fill array_options property of object by extrafields value (using for data sent by forms) * * @param array $extralabels $array of extrafields - * @param object $object Object - * @param string $onlykey Only following key is filled + * @param object $object Object + * @param string $onlykey Only following key is filled. When we make update of only one extrafield ($action = 'update_extras'), calling page must must set this to avoid to have other extrafields being reset. * @return int 1 if array_options set / 0 if no value */ function setOptionalsFromPost($extralabels,&$object,$onlykey='') diff --git a/htdocs/fourn/class/fournisseur.commande.class.php b/htdocs/fourn/class/fournisseur.commande.class.php index 9051ab0bb27..5faba969755 100644 --- a/htdocs/fourn/class/fournisseur.commande.class.php +++ b/htdocs/fourn/class/fournisseur.commande.class.php @@ -887,7 +887,7 @@ class CommandeFournisseur extends CommonOrder $sql.= ", entity"; $sql.= ", fk_soc"; $sql.= ", date_creation"; - //$sql.= ", date_livraison"; + $sql.= ", date_livraison"; $sql.= ", fk_user_author"; $sql.= ", fk_statut"; $sql.= ", source"; @@ -899,12 +899,12 @@ class CommandeFournisseur extends CommonOrder $sql.= " VALUES ("; $sql.= "''"; $sql.= ", '".$this->ref_supplier."'"; - $sql.= ", '".$this->note_private."'"; - $sql.= ", '".$this->note_public."'"; + $sql.= ", '".$this->db->escape($this->note_private)."'"; + $sql.= ", '".$this->db->escape($this->note_public)."'"; $sql.= ", ".$conf->entity; $sql.= ", ".$this->socid; $sql.= ", '".$this->db->idate($now)."'"; - //$sql.= ", '".$this->db->idate($now)."'"; + $sql.= ", ".($this->date_livraison?"'".$this->db->idate($this->date_livraison)."'":"null"); $sql.= ", ".$user->id; $sql.= ", 0"; $sql.= ", " . $this->source; diff --git a/htdocs/fourn/commande/card.php b/htdocs/fourn/commande/card.php index ef78a9981c1..28b492651c0 100644 --- a/htdocs/fourn/commande/card.php +++ b/htdocs/fourn/commande/card.php @@ -69,6 +69,8 @@ $hidedetails = (GETPOST('hidedetails','int') ? GETPOST('hidedetails','int') : (! $hidedesc = (GETPOST('hidedesc','int') ? GETPOST('hidedesc','int') : (! empty($conf->global->MAIN_GENERATE_DOCUMENTS_HIDE_DESC) ? 1 : 0)); $hideref = (GETPOST('hideref','int') ? GETPOST('hideref','int') : (! empty($conf->global->MAIN_GENERATE_DOCUMENTS_HIDE_REF) ? 1 : 0)); +$datelivraison=dol_mktime(GETPOST('liv_hour','int'), GETPOST('liv_min','int'), GETPOST('liv_sec','int'), GETPOST('liv_month','int'), GETPOST('liv_day','int'),GETPOST('liv_year','int')); + // Security check if ($user->societe_id) $socid=$user->societe_id; @@ -144,8 +146,6 @@ if ($action == 'setbankaccount' && $user->rights->fournisseur->commande->creer) // date de livraison if ($action == 'setdate_livraison' && $user->rights->fournisseur->commande->creer) { - $datelivraison=dol_mktime(GETPOST('liv_hour','int'), GETPOST('liv_min','int'), GETPOST('liv_sec','int'), GETPOST('liv_month','int'), GETPOST('liv_day','int'),GETPOST('liv_year','int')); - $result=$object->set_date_livraison($user,$datelivraison); if ($result < 0) { @@ -780,9 +780,8 @@ if ($action == 'update_extras') { // Fill array 'array_options' with data from add form $extralabels=$extrafields->fetch_name_optionals_label($object->table_element); - $ret = $extrafields->setOptionalsFromPost($extralabels,$object); - - if($ret < 0) $error++; + $ret = $extrafields->setOptionalsFromPost($extralabels,$object,GETPOST('attribute')); + if ($ret < 0) $error++; if (!$error) { @@ -797,7 +796,6 @@ if ($action == 'update_extras') { if (empty($conf->global->MAIN_EXTRAFIELDS_DISABLED)) // For avoid conflicts if trigger used { - $result=$object->insertExtraFields(); if ($result < 0) @@ -841,6 +839,7 @@ if ($action == 'add' && $user->rights->fournisseur->commande->creer) $object->fk_account = GETPOST('fk_account', 'int'); $object->note_private = GETPOST('note_private'); $object->note_public = GETPOST('note_public'); + $object->date_livraison = $datelivraison; // Fill array 'array_options' with data from add form $ret = $extrafields->setOptionalsFromPost($extralabels,$object); @@ -1272,6 +1271,16 @@ if ($action=="create") $form->select_types_paiements(isset($_POST['mode_reglement_id'])?$_POST['mode_reglement_id']:$mode_reglement_id,'mode_reglement_id'); print ''; + // Planned delivery date + print ''; + print ''; + // Bank Account if (! empty($conf->global->BANK_ASK_PAYMENT_BANK_DURING_SUPPLIER_ORDER) && ! empty($conf->banque->enabled)) { diff --git a/htdocs/fourn/facture/card.php b/htdocs/fourn/facture/card.php index 26aeffad655..a10aa89ae65 100644 --- a/htdocs/fourn/facture/card.php +++ b/htdocs/fourn/facture/card.php @@ -1070,7 +1070,7 @@ elseif ($action == 'update_extras') { // Fill array 'array_options' with data from add form $extralabels=$extrafields->fetch_name_optionals_label($object->table_element); - $ret = $extrafields->setOptionalsFromPost($extralabels,$object); + $ret = $extrafields->setOptionalsFromPost($extralabels,$object,GETPOST('attribute')); if($ret < 0) $error++; From 1bba3a01e27f10685dee62c15b21cb4c7a7c893f Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 22 Feb 2015 23:41:34 +0100 Subject: [PATCH 119/287] phpcs --- htdocs/core/modules/expensereport/modules_expensereport.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/modules/expensereport/modules_expensereport.php b/htdocs/core/modules/expensereport/modules_expensereport.php index 641f1de9c98..7e40d9df1a2 100755 --- a/htdocs/core/modules/expensereport/modules_expensereport.php +++ b/htdocs/core/modules/expensereport/modules_expensereport.php @@ -54,13 +54,13 @@ class ModeleExpenseReport extends CommonDocGenerator * * @param DoliDB $db Database handler * @param Object $object Object order + * @param string $message Message * @param string $modele Force le modele a utiliser ('' to not force) * @param Translate $outputlangs objet lang a utiliser pour traduction * @param int $hidedetails Hide details of lines * @param int $hidedesc Hide description * @param int $hideref Hide ref * @return int 0 if KO, 1 if OK - * @return number */ function expensereport_pdf_create(DoliDB $db, ExpenseReport $object, $message, $modele, $outputlangs, $hidedetails=0, $hidedesc=0, $hideref=0) { From 25bb6a588f49dd7db6f8b5a22d117221c8323730 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 23 Feb 2015 00:57:48 +0100 Subject: [PATCH 120/287] Fix list of project must be restricted on opened status --- htdocs/langs/en_US/projects.lang | 2 ++ htdocs/projet/activity/list.php | 9 +++++---- htdocs/projet/class/project.class.php | 2 +- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/htdocs/langs/en_US/projects.lang b/htdocs/langs/en_US/projects.lang index 84624b219f9..52f4376d57b 100644 --- a/htdocs/langs/en_US/projects.lang +++ b/htdocs/langs/en_US/projects.lang @@ -8,8 +8,10 @@ SharedProject=Everybody PrivateProject=Contacts of project MyProjectsDesc=This view is limited to projects you are a contact for (whatever is the type). ProjectsPublicDesc=This view presents all projects you are allowed to read. +ProjectsPublicTaskDesc=This view presents all projects and tasks you are allowed to read. ProjectsDesc=This view presents all projects (your user permissions grant you permission to view everything). MyTasksDesc=This view is limited to projects or tasks you are a contact for (whatever is the type). +OnlyOpenedProject=Only opened projects are visible (projects with draft or closed status are not visible). TasksPublicDesc=This view presents all projects and tasks you are allowed to read. TasksDesc=This view presents all projects and tasks (your user permissions grant you permission to view everything). ProjectsArea=Projects area diff --git a/htdocs/projet/activity/list.php b/htdocs/projet/activity/list.php index 692e4ab08b4..af569d3351f 100644 --- a/htdocs/projet/activity/list.php +++ b/htdocs/projet/activity/list.php @@ -125,7 +125,8 @@ if ($id) $project->fetch_thirdparty(); } -$tasksarray=$taskstatic->getTasksArray(0,0,($project->id?$project->id:$projectsListId),$socid,0); // We want to see all task of project i am allowed to see, not only mine. Later only mine will be editable later. +$onlyopened=1; // or -1 +$tasksarray=$taskstatic->getTasksArray(0,0,($project->id?$project->id:$projectsListId),$socid,0,'',$onlyopened); // We want to see all task of opened project i am allowed to see, not only mine. Later only mine will be editable later. $projectsrole=$taskstatic->getUserRolesForProjectsOrTasks($user,0,($project->id?$project->id:$projectsListId),0); $tasksrole=$taskstatic->getUserRolesForProjectsOrTasks(0,$user,($project->id?$project->id:$projectsListId),0); //var_dump($tasksarray); @@ -138,11 +139,11 @@ llxHeader("",$title,""); print_barre_liste($title, $page, $_SERVER["PHP_SELF"], "", $sortfield, $sortorder, "", $num); // Show description of content -if ($mine) print $langs->trans("MyTasksDesc").'

'; +if ($mine) print $langs->trans("MyTasksDesc").($onlyopened?' '.$langs->trans("OnlyOpenedProject"):'').'

'; else { - if ($user->rights->projet->all->lire && ! $socid) print $langs->trans("ProjectsDesc").'

'; - else print $langs->trans("ProjectsPublicTakDesc").'

'; + if ($user->rights->projet->all->lire && ! $socid) print $langs->trans("ProjectsDesc").($onlyopened?' '.$langs->trans("OnlyOpenedProject"):'').'

'; + else print $langs->trans("ProjectsPublicTaskDesc").($onlyopened?' '.$langs->trans("AlsoOnlyOpenedProject"):'').'

'; } diff --git a/htdocs/projet/class/project.class.php b/htdocs/projet/class/project.class.php index 5c54cae4174..fbb35990954 100644 --- a/htdocs/projet/class/project.class.php +++ b/htdocs/projet/class/project.class.php @@ -56,7 +56,7 @@ class Project extends CommonObject var $note_private; var $note_public; var $statuts_short; - var $statuts; + var $statuts; // 0=draft, 1=opened, 2=closed var $oldcopy; From dbaef5ca6b450b3c6b70bf505b97fc8f3b71bf0d Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 23 Feb 2015 01:00:07 +0100 Subject: [PATCH 121/287] Fix link does not return same number that nmber into link --- htdocs/index.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/index.php b/htdocs/index.php index ebc6760252c..7e922c7059a 100644 --- a/htdocs/index.php +++ b/htdocs/index.php @@ -317,7 +317,7 @@ if (! empty($conf->agenda->enabled) && $user->rights->agenda->myactions->read) $board->load_board($user); $board->warning_delay=$conf->actions->warning_delay/60/60/24; $board->label=$langs->trans("ActionsToDo"); - $board->url=DOL_URL_ROOT.'/comm/action/listactions.php?status=todo&mainmenu=agenda'; + $board->url=DOL_URL_ROOT.'/comm/action/listactions.php?status=todo&usertodo=-1&mainmenu=agenda'; $board->img=img_object($langs->trans("Actions"),"action"); $rowspan++; $dashboardlines[]=$board; From 95f211775bb6628e223d4011616025402ba36c04 Mon Sep 17 00:00:00 2001 From: aspangaro Date: Mon, 23 Feb 2015 06:45:03 +0100 Subject: [PATCH 122/287] Move new module Expense Report in hrm --- .../core/modules/modExpenseReport.class.php | 28 +++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/htdocs/core/modules/modExpenseReport.class.php b/htdocs/core/modules/modExpenseReport.class.php index c82de294008..8690d7627f2 100755 --- a/htdocs/core/modules/modExpenseReport.class.php +++ b/htdocs/core/modules/modExpenseReport.class.php @@ -223,10 +223,10 @@ class modExpenseReport extends DolibarrModules $r=0; // Example to declare a Left Menu entry: fk_mainmenu=home,fk_leftmenu=modulesadmintools - $this->menu[$r]=array( 'fk_menu'=>'fk_mainmenu=accountancy', // Use r=value where r is index key used for the parent menu entry (higher parent must be a top menu entry) + $this->menu[$r]=array( 'fk_menu'=>'fk_mainmenu=hrm', // Use r=value where r is index key used for the parent menu entry (higher parent must be a top menu entry) 'type'=>'left', // This is a Left menu entry 'titre'=>'TripsAndExpenses', - 'mainmenu'=>'accountancy', + 'mainmenu'=>'hrm', 'leftmenu'=>'expensereport', 'url'=>'/expensereport/index.php', 'langs'=>'trips', // Lang file to use (without .lang) by module. File must be in langs/code_CODE/ directory. @@ -237,10 +237,10 @@ class modExpenseReport extends DolibarrModules 'user'=>2); // 0=Menu for internal users, 1=external users, 2=both $r++; - $this->menu[$r]=array( 'fk_menu'=>'fk_mainmenu=accountancy,fk_leftmenu=expensereport', // Use r=value where r is index key used for the parent menu entry (higher parent must be a top menu entry) + $this->menu[$r]=array( 'fk_menu'=>'fk_mainmenu=hrm,fk_leftmenu=expensereport', // Use r=value where r is index key used for the parent menu entry (higher parent must be a top menu entry) 'type'=>'left', // This is a Left menu entry 'titre'=>'New', - 'mainmenu'=>'accountancy', + 'mainmenu'=>'hrm', 'leftmenu'=>'expensereport_detailnew', 'url'=>'/expensereport/card.php?action=create', 'langs'=>'trips', // Lang file to use (without .lang) by module. File must be in langs/code_CODE/ directory. @@ -251,10 +251,10 @@ class modExpenseReport extends DolibarrModules 'user'=>2); // 0=Menu for internal users, 1=external users, 2=both $r++; - $this->menu[$r]=array( 'fk_menu'=>'fk_mainmenu=accountancy,fk_leftmenu=expensereport', // Use r=value where r is index key used for the parent menu entry (higher parent must be a top menu entry) + $this->menu[$r]=array( 'fk_menu'=>'fk_mainmenu=hrm,fk_leftmenu=expensereport', // Use r=value where r is index key used for the parent menu entry (higher parent must be a top menu entry) 'type'=>'left', // This is a Left menu entry 'titre'=>'List', - 'mainmenu'=>'accountancy', + 'mainmenu'=>'hrm', 'leftmenu'=>'expensereport_detaillist', 'url'=>'/expensereport/list.php', 'langs'=>'trips', // Lang file to use (without .lang) by module. File must be in langs/code_CODE/ directory. @@ -265,10 +265,10 @@ class modExpenseReport extends DolibarrModules 'user'=>2); // 0=Menu for internal users, 1=external users, 2=both $r++; - $this->menu[$r]=array( 'fk_menu'=>'fk_mainmenu=accountancy,fk_leftmenu=expensereport_detaillist', // Use r=value where r is index key used for the parent menu entry (higher parent must be a top menu entry) + $this->menu[$r]=array( 'fk_menu'=>'fk_mainmenu=hrm,fk_leftmenu=expensereport_detaillist', // Use r=value where r is index key used for the parent menu entry (higher parent must be a top menu entry) 'type'=>'left', // This is a Left menu entry 'titre'=>'ListToApprove', - 'mainmenu'=>'accountancy', + 'mainmenu'=>'hrm', 'leftmenu'=>'expensereport_detaillist_approve', 'url'=>'/expensereport/list.php?search_state=2', 'langs'=>'trips', // Lang file to use (without .lang) by module. File must be in langs/code_CODE/ directory. @@ -279,10 +279,10 @@ class modExpenseReport extends DolibarrModules 'user'=>2); // 0=Menu for internal users, 1=external users, 2=both $r++; - $this->menu[$r]=array( 'fk_menu'=>'fk_mainmenu=accountancy,fk_leftmenu=expensereport', // Use r=value where r is index key used for the parent menu entry (higher parent must be a top menu entry) + $this->menu[$r]=array( 'fk_menu'=>'fk_mainmenu=hrm,fk_leftmenu=expensereport', // Use r=value where r is index key used for the parent menu entry (higher parent must be a top menu entry) 'type'=>'left', // This is a Left menu entry 'titre'=>'Statistics', - 'mainmenu'=>'accountancy', + 'mainmenu'=>'hrm', 'leftmenu'=>'expensereport_detail', 'url'=>'/expensereport/stats/index.php', 'langs'=>'trips', // Lang file to use (without .lang) by module. File must be in langs/code_CODE/ directory. @@ -295,10 +295,10 @@ class modExpenseReport extends DolibarrModules // Disabled, not yet stable - $this->menu[$r]=array( 'fk_menu'=>'fk_mainmenu=accountancy,fk_leftmenu=expensereport', // Use r=value where r is index key used for the parent menu entry (higher parent must be a top menu entry) + $this->menu[$r]=array( 'fk_menu'=>'fk_mainmenu=hrm,fk_leftmenu=expensereport', // Use r=value where r is index key used for the parent menu entry (higher parent must be a top menu entry) 'type'=>'left', // This is a Left menu entry 'titre'=>'ExportTripCSV', - 'mainmenu'=>'accountancy', + 'mainmenu'=>'hrm', 'leftmenu'=>'expensereport_detail', 'url'=>'/expensereport/export_csv.php', 'langs'=>'expensereport', // Lang file to use (without .lang) by module. File must be in langs/code_CODE/ directory. @@ -309,10 +309,10 @@ class modExpenseReport extends DolibarrModules 'user'=>2); // 0=Menu for internal users, 1=external users, 2=both $r++; - $this->menu[$r]=array( 'fk_menu'=>'fk_mainmenu=accountancy,fk_leftmenu=expensereport', // Use r=value where r is index key used for the parent menu entry (higher parent must be a top menu entry) + $this->menu[$r]=array( 'fk_menu'=>'fk_mainmenu=hrm,fk_leftmenu=expensereport', // Use r=value where r is index key used for the parent menu entry (higher parent must be a top menu entry) 'type'=>'left', // This is a Left menu entry 'titre'=>'Synchro_Compta', - 'mainmenu'=>'accountancy', + 'mainmenu'=>'hrm', 'leftmenu'=>'expensereport_detail', 'url'=>'/expensereport/synchro_compta.php', 'langs'=>'expensereport', // Lang file to use (without .lang) by module. File must be in langs/code_CODE/ directory. From d0cc072a5855c4058bb28b40c7389ae404ee1631 Mon Sep 17 00:00:00 2001 From: aspangaro Date: Mon, 23 Feb 2015 06:49:11 +0100 Subject: [PATCH 123/287] Module Expense Report: reactivate conflictwith modDeplacement --- htdocs/core/modules/modExpenseReport.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/modules/modExpenseReport.class.php b/htdocs/core/modules/modExpenseReport.class.php index c82de294008..c03647993eb 100755 --- a/htdocs/core/modules/modExpenseReport.class.php +++ b/htdocs/core/modules/modExpenseReport.class.php @@ -84,7 +84,7 @@ class modExpenseReport extends DolibarrModules // Dependencies $this->depends = array(); // List of modules id that must be enabled if this module is enabled -// $this->conflictwith = array("modDeplacement"); + $this->conflictwith = array("modDeplacement"); $this->requiredby = array(); // List of modules id to disable if this one is disabled $this->phpmin = array(4,3); // Minimum version of PHP required by module $this->need_dolibarr_version = array(3,7); // Minimum version of Dolibarr required by module From 81130634d3c761a91a5fd77dea137561233fd102 Mon Sep 17 00:00:00 2001 From: phf Date: Mon, 23 Feb 2015 09:16:14 +0100 Subject: [PATCH 124/287] =?UTF-8?q?[CORE]=20int=C3=A9gration=20de=20incote?= =?UTF-8?q?rm=20sur=20les=20diff=C3=A9rentes=20class=20(#incoterm).?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- htdocs/comm/propal.php | 2 +- htdocs/compta/facture.php | 46 +++++++++++++++++++ htdocs/compta/facture/class/facture.class.php | 18 ++++++++ htdocs/expedition/card.php | 42 +++++++++++++++++ htdocs/expedition/class/expedition.class.php | 15 ++++++ .../class/fournisseur.commande.class.php | 18 +++++++- .../fourn/class/fournisseur.facture.class.php | 18 +++++++- htdocs/fourn/commande/card.php | 44 +++++++++++++++++- htdocs/fourn/facture/card.php | 42 +++++++++++++++++ .../install/mysql/migration/3.7.0-3.8.0.sql | 29 +++++++----- htdocs/livraison/card.php | 33 ++++++++++++- htdocs/livraison/class/livraison.class.php | 18 ++++++++ 12 files changed, 308 insertions(+), 17 deletions(-) diff --git a/htdocs/comm/propal.php b/htdocs/comm/propal.php index f044af50980..57ac3a8bbcd 100644 --- a/htdocs/comm/propal.php +++ b/htdocs/comm/propal.php @@ -1976,7 +1976,7 @@ if ($action == 'create') print '
'; @@ -1811,8 +1812,10 @@ if ($action == 'create') } print '
'; print ''; print ''; - + */ + // Shipping Method + /* PHFAVRE retrait en temporaire if (! empty($conf->expedition->enabled)) { print ''; $form_close .= ''; // Sélection TVA - print ''; // Prix unitaire - print ''; // Quantité - print ''; print ''; - } } $i++; @@ -1503,7 +1495,7 @@ else // Sélection projet print ''; // Sélection type @@ -1528,7 +1520,7 @@ else // Prix unitaire print ''; // Quantité @@ -1593,7 +1585,7 @@ if ($action != 'create' && $action != 'edit') // Validate if (count($object->lines) > 0 || count($object->lignes) > 0) { - print ''.$langs->trans('Validate').''; + print ''.$langs->trans('ValidateAndSubmit').''; } if ($user->rights->expensereport->supprimer) @@ -1611,7 +1603,7 @@ if ($action != 'create' && $action != 'edit') */ if($user->rights->expensereport->creer && $object->fk_c_expensereport_statuts==99) { - if ($object->fk_user_author == $user->id) + if ($user->id == $object->fk_user_author || $user->id == $object->fk_user_valid) { // Modifier print ''.$langs->trans('ModifyInfoGen').''; @@ -1619,7 +1611,7 @@ if ($action != 'create' && $action != 'edit') // Brouillonner (le statut refusée est identique à brouillon) //print ''.$langs->trans('BROUILLONNER').''; // Enregistrer depuis le statut "Refusée" - print ''.$langs->trans('Validate').''; + print ''.$langs->trans('ValidateAndSubmit').''; if ($user->rights->expensereport->supprimer) { @@ -1631,10 +1623,10 @@ if ($action != 'create' && $action != 'edit') if ($user->rights->expensereport->to_paid && $object->fk_c_expensereport_statuts==5) { - if ($object->fk_user_author == $user->id || $object->fk_user_valid == $user->id) + if ($user->id == $object->fk_user_author || $user->id == $object->fk_user_valid) { // Brouillonner - print ''.$langs->trans('BROUILLONNER').''; + print ''.$langs->trans('SetToDraft').''; } } @@ -1648,7 +1640,7 @@ if ($action != 'create' && $action != 'edit') if ($object->fk_user_author == $user->id) { // Brouillonner - print ''.$langs->trans('BROUILLONNER').''; + print ''.$langs->trans('SetToDraft').''; } } @@ -1659,12 +1651,12 @@ if ($action != 'create' && $action != 'edit') // Valider print ''.$langs->trans('Approve').''; // Refuser - print ''.$langs->trans('Refuse').''; + print ''.$langs->trans('Deny').''; //} - if ($object->fk_user_author==$user->id) + if ($user->id == $object->fk_user_author || $user->id == $object->fk_user_valid) { - // Annuler + // Cancel print ''.$langs->trans('Cancel').''; } @@ -1679,14 +1671,17 @@ if ($action != 'create' && $action != 'edit') * ET user à droit de "to_paid" * Afficher : "Annuler" / "Payer" / "Supprimer" */ - if ($user->rights->expensereport->to_paid && $object->fk_c_expensereport_statuts==5) + if ($user->rights->expensereport->to_paid && $object->fk_c_expensereport_statuts == 5) { // Payer print ''.$langs->trans('TO_PAID').''; - // Annuler - print ''.$langs->trans('CANCEL').''; - + // Cancel + if ($user->id == $object->fk_user_author || $user->id == $object->fk_user_valid) + { + print ''.$langs->trans('Cancel').''; + } + if($user->rights->expensereport->supprimer) { // Supprimer @@ -1717,10 +1712,10 @@ if ($action != 'create' && $action != 'edit') if ($user->rights->expensereport->supprimer && $object->fk_c_expensereport_statuts==4) { - if ($object->fk_user_validator==$user->id) + if ($user->id == $object->fk_user_author || $user->id == $object->fk_user_valid) { // Brouillonner - print ''.$langs->trans('BROUILLONNER').''; + print ''.$langs->trans('ReOpen').''; } // Supprimer @@ -1732,7 +1727,7 @@ if ($action != 'create' && $action != 'edit') print ''; -$conf->global->DOL_URL_ROOT_DOCUMENT_PHP=dol_buildpath('/expensereport/documentwrapper.php',1); +//$conf->global->DOL_URL_ROOT_DOCUMENT_PHP=dol_buildpath('/expensereport/documentwrapper.php',1); print '
'; diff --git a/htdocs/expensereport/class/expensereport.class.php b/htdocs/expensereport/class/expensereport.class.php index 84db5bd9ece..76534e94c2a 100755 --- a/htdocs/expensereport/class/expensereport.class.php +++ b/htdocs/expensereport/class/expensereport.class.php @@ -39,40 +39,40 @@ class ExpenseReport extends CommonObject ACTIONS */ - // Enregistrement - var $date_create; - var $fk_user_author; + // Enregistrement + var $date_create; + var $fk_user_author; - // Refus - var $date_refuse; - var $detail_refuse; - var $fk_user_refuse; + // Refus + var $date_refuse; + var $detail_refuse; + var $fk_user_refuse; - // Annulation - var $date_cancel; - var $detail_cancel; - var $fk_user_cancel; + // Annulation + var $date_cancel; + var $detail_cancel; + var $fk_user_cancel; - // Validation - var $date_valide; - var $fk_user_valid; - var $user_valid_infos; + // Validation + var $date_valide; + var $fk_user_valid; + var $user_valid_infos; - // Paiement - var $date_paiement; - var $fk_user_paid; - var $user_paid_infos; + // Paiement + var $date_paiement; + var $fk_user_paid; + var $user_paid_infos; /* END ACTIONS */ - /** - * Constructor - * - * @param DoliDB $db Handler acces base de donnees - */ + /** + * Constructor + * + * @param DoliDB $db Handler acces base de donnees + */ function __construct($db) { $this->db = $db; @@ -242,13 +242,13 @@ class ExpenseReport extends CommonObject } } - /** - * Load an object from database - * - * @param int $id Id - * @param string $ref Ref - * @return int <0 if KO, >0 if OK - */ + /** + * Load an object from database + * + * @param int $id Id + * @param string $ref Ref + * @return int <0 if KO, >0 if OK + */ function fetch($id, $ref='') { global $conf,$db; @@ -467,94 +467,94 @@ class ExpenseReport extends CommonObject if($user->rights->expensereport->lire) { - $sql = "SELECT de.fk_expensereport, de.date, de.comments, de.total_ht, de.total_ttc"; - $sql.= " FROM ".MAIN_DB_PREFIX."expensereport_det as de"; - $sql.= " WHERE de.fk_projet = ".$projectid; + $sql = "SELECT de.fk_expensereport, de.date, de.comments, de.total_ht, de.total_ttc"; + $sql.= " FROM ".MAIN_DB_PREFIX."expensereport_det as de"; + $sql.= " WHERE de.fk_projet = ".$projectid; - dol_syslog(get_class($this)."::fetch sql=".$sql, LOG_DEBUG); - $result = $db->query($sql) ; - if ($result) - { - $num = $db->num_rows($result); - $i = 0; - $total_HT = 0; - $total_TTC = 0; + dol_syslog(get_class($this)."::fetch sql=".$sql, LOG_DEBUG); + $result = $db->query($sql) ; + if ($result) + { + $num = $db->num_rows($result); + $i = 0; + $total_HT = 0; + $total_TTC = 0; - while ($i < $num) - { + while ($i < $num) + { - $objp = $db->fetch_object($result); + $objp = $db->fetch_object($result); - $sql2 = "SELECT d.rowid, d.fk_user_author, d.ref, d.fk_c_expensereport_statuts"; - $sql2.= " FROM ".MAIN_DB_PREFIX."expensereport as d"; - $sql2.= " WHERE d.rowid = '".$objp->fk_expensereport."'"; + $sql2 = "SELECT d.rowid, d.fk_user_author, d.ref, d.fk_c_expensereport_statuts"; + $sql2.= " FROM ".MAIN_DB_PREFIX."expensereport as d"; + $sql2.= " WHERE d.rowid = '".$objp->fk_expensereport."'"; - $result2 = $db->query($sql2); - $obj = $db->fetch_object($result2); + $result2 = $db->query($sql2); + $obj = $db->fetch_object($result2); - $objp->fk_user_author = $obj->fk_user_author; - $objp->ref = $obj->ref; - $objp->fk_c_expensereport_status = $obj->fk_c_expensereport_statuts; - $objp->rowid = $obj->rowid; + $objp->fk_user_author = $obj->fk_user_author; + $objp->ref = $obj->ref; + $objp->fk_c_expensereport_status = $obj->fk_c_expensereport_statuts; + $objp->rowid = $obj->rowid; - $total_HT = $total_HT + $objp->total_ht; - $total_TTC = $total_TTC + $objp->total_ttc; - $author = new User($db); - $author->fetch($objp->fk_user_author); + $total_HT = $total_HT + $objp->total_ht; + $total_TTC = $total_TTC + $objp->total_ttc; + $author = new User($db); + $author->fetch($objp->fk_user_author); - print '
'; - print ''; - print ''; - print ''; - print ''; - print ''; - print ''; - print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; - print ''; + switch($objp->fk_c_expensereport_status) { + case 4: + print img_picto($langs->trans('StatusOrderCanceled'),'statut5'); + break; + case 1: + print $langs->trans('Draft').' '.img_picto($langs->trans('Draft'),'statut0'); + break; + case 2: + print $langs->trans('TripForValid').' '.img_picto($langs->trans('TripForValid'),'statut3');; + break; + case 5: + print $langs->trans('TripForPaid').' '.img_picto($langs->trans('TripForPaid'),'statut3'); + break; + case 6: + print $langs->trans('TripPaid').' '.img_picto($langs->trans('TripPaid'),'statut4'); + break; + } + /* + if ($status==4) return img_picto($langs->trans('StatusOrderCanceled'),'statut5'); + if ($status==1) return img_picto($langs->trans('StatusOrderDraft'),'statut0'); + if ($status==2) return img_picto($langs->trans('StatusOrderValidated'),'statut1'); + if ($status==2) return img_picto($langs->trans('StatusOrderOnProcess'),'statut3'); + if ($status==5) return img_picto($langs->trans('StatusOrderToBill'),'statut4'); + if ($status==6) return img_picto($langs->trans('StatusOrderOnProcess'),'statut6'); + */ + print ''; + print ''; - $i++; - } + $i++; + } - print ''; - print ''; - print ''; - print ''; - print ''; + print ''; + print ''; + print ''; + print ''; + print ''; - } - else - { - $this->error=$db->error(); - return -1; - } - } + } + else + { + $this->error=$db->error(); + return -1; + } + } } @@ -580,10 +580,10 @@ class ExpenseReport extends CommonObject $num = $this->db->num_rows($result); $i = 0; while ($i < $num): - $objp = $this->db->fetch_object($result); - $total_ht+=$objp->total_ht; - $total_tva+=$objp->total_tva; - $i++; + $objp = $this->db->fetch_object($result); + $total_ht+=$objp->total_ht; + $total_tva+=$objp->total_tva; + $i++; endwhile; $total_ttc = $total_ht + $total_tva; @@ -594,19 +594,19 @@ class ExpenseReport extends CommonObject $sql.= " WHERE rowid = ".$id; $result = $this->db->query($sql); if($result): - $this->db->free($result); - return 1; + $this->db->free($result); + return 1; else: - $this->error=$this->db->error(); - dol_syslog('ExpenseReport::recalculer: Error '.$this->error,LOG_ERR); - return -3; + $this->error=$this->db->error(); + dol_syslog('ExpenseReport::recalculer: Error '.$this->error,LOG_ERR); + return -3; endif; } else { - $this->error=$this->db->error(); - dol_syslog('ExpenseReport::recalculer: Error '.$this->error,LOG_ERR); - return -3; + $this->error=$this->db->error(); + dol_syslog('ExpenseReport::recalculer: Error '.$this->error,LOG_ERR); + return -3; } } @@ -718,12 +718,12 @@ class ExpenseReport extends CommonObject } /** - * set_save + * Set to status validate * * @param User $user User * @return int <0 if KO, >0 if OK */ - function set_save($user) + function setValidate($user) { global $conf,$langs; @@ -752,8 +752,8 @@ class ExpenseReport extends CommonObject if ($this->fk_c_expensereport_statuts != 2) { $sql = 'UPDATE '.MAIN_DB_PREFIX.$this->table_element; - $sql.= " SET ref = '".$this->ref."', fk_c_expensereport_statuts = 2"; - $sql.= " ,ref_number_int = $ref_number_int"; + $sql.= " SET ref = '".$this->ref."', fk_c_expensereport_statuts = 2, fk_user_valid = ".$user->id.","; + $sql.= " ref_number_int = ".$ref_number_int; $sql.= ' WHERE rowid = '.$this->id; dol_syslog(get_class($this)."::set_save sql=".$sql, LOG_DEBUG); @@ -822,30 +822,30 @@ class ExpenseReport extends CommonObject } /** - * set_valide + * Set status to approved * * @param User $user User * @return int <0 if KO, >0 if OK */ - function set_valide($user) + function setApproved($user) { // date de validation $this->date_valide = $this->db->idate(gmmktime()); if ($this->fk_c_expensereport_statuts != 5) { $sql = 'UPDATE '.MAIN_DB_PREFIX.$this->table_element; - $sql.= " SET ref = '".$this->ref."', fk_c_expensereport_statuts = 5, fk_user_valid = ".$user->id; - $sql.= ', date_valide='.$this->date_valide; + $sql.= " SET ref = '".$this->ref."', fk_c_expensereport_statuts = 5, fk_user_approve = ".$user->id.","; + $sql.= " date_valide='".$this->date_valide."'"; $sql.= ' WHERE rowid = '.$this->id; - - dol_syslog(get_class($this)."::set_valide sql=".$sql, LOG_DEBUG); - - if ($this->db->query($sql)): + if ($this->db->query($sql)) + { return 1; - else: - $this->error=$this->db->error(); + } + else + { + $this->error=$this->db->lasterror(); return -1; - endif; + } } else { @@ -861,24 +861,29 @@ class ExpenseReport extends CommonObject */ function set_refuse($user,$details) { + $now = dol_now(); + // date de refus - $this->date_refuse = $this->db->idate(gmmktime()); if ($this->fk_c_expensereport_statuts != 99) { $sql = 'UPDATE '.MAIN_DB_PREFIX.$this->table_element; - $sql.= " SET ref = '".$this->ref."', fk_c_expensereport_statuts = 99, fk_user_refuse = ".$user->id; - $sql.= ', date_refuse='.$this->date_refuse; - $sql.= ", detail_refuse='".addslashes($details)."'"; + $sql.= " SET ref = '".$this->ref."', fk_c_expensereport_statuts = 99, fk_user_refuse = ".$user->id.","; + $sql.= " date_refuse='".$this->db->idate($now)."',"; + $sql.= " detail_refuse='".$this->db->escape($details)."'"; $sql.= ' WHERE rowid = '.$this->id; - - dol_syslog(get_class($this)."::set_refuse sql=".$sql, LOG_DEBUG); - - if ($this->db->query($sql)): + if ($this->db->query($sql)) + { + $this->fk_c_expensereport_statuts = 99; + $this->fk_user_refuse = $user->id; + $this->detail_refuse = $details; + $this->date_refuse = $now; return 1; - else: - $this->error=$this->db->error(); + } + else + { + $this->error=$this->db->lasterror(); return -1; - endif; + } } else { @@ -887,22 +892,22 @@ class ExpenseReport extends CommonObject } /** - * set_paid + * setPaid * * @param User $user User * @return int <0 if KO, >0 if OK */ - function set_paid($user) + function setPaid($user) { $this->date_paiement = $this->db->idate(gmmktime()); if ($this->fk_c_expensereport_statuts != 6) { $sql = 'UPDATE '.MAIN_DB_PREFIX.$this->table_element; - $sql.= " SET fk_c_expensereport_statuts = 6, fk_user_paid = ".$user->id; - $sql.= ', date_paiement='.$this->date_paiement; + $sql.= " SET fk_c_expensereport_statuts = 6, fk_user_paid = ".$user->id.","; + $sql.= " date_paiement='".$this->date_paiement."'"; $sql.= ' WHERE rowid = '.$this->id; - dol_syslog(get_class($this)."::set_paid sql=".$sql, LOG_DEBUG); + dol_syslog(get_class($this)."::setPaid sql=".$sql, LOG_DEBUG); if ($this->db->query($sql)) { @@ -931,52 +936,21 @@ class ExpenseReport extends CommonObject if ($this->fk_c_deplacement_statuts != 5) { $sql = 'UPDATE '.MAIN_DB_PREFIX.$this->table_element; - $sql.= " SET fk_c_deplacement_statuts = 5"; + $sql.= " SET fk_c_expensereport_statuts = 5"; $sql.= ' WHERE rowid = '.$this->id; dol_syslog(get_class($this)."::set_unpaid sql=".$sql, LOG_DEBUG); if ($this->db->query($sql)): - return 1; + return 1; else: - $this->error=$this->db->error(); - return -1; + $this->error=$this->db->error(); + return -1; endif; } else { - dol_syslog(get_class($this)."::set_unpaid deplacement already with unpaid status", LOG_WARNING); - } - } - - /** - * set_draft - * - * @param User $user User - * @return int <0 if KO, >0 if OK - */ - function set_draft($user) - { - if ($this->fk_c_deplacement_statuts != 1) - { - $sql = 'UPDATE '.MAIN_DB_PREFIX.$this->table_element; - $sql.= " SET fk_c_deplacement_statuts = 1,"; - //$sql.= " , ref = '(PROV".$this->id.")', ref_number_int = 0"; - $sql.= " ref_number_int = 0"; - $sql.= ' WHERE rowid = '.$this->id; - - dol_syslog(get_class($this)."::set_draft sql=".$sql, LOG_DEBUG); - - if ($this->db->query($sql)) return 1; - else - { - $this->error=$this->db->error(); - return -1; - } - } - else - { - dol_syslog(get_class($this)."::set_draft deplacement already with draft status", LOG_WARNING); + dol_syslog(get_class($this)."::set_unpaid expensereport already with unpaid status", LOG_WARNING); } } @@ -1026,7 +1000,7 @@ class ExpenseReport extends CommonObject { $sql = 'UPDATE '.MAIN_DB_PREFIX.$this->table_element; $sql.= " SET fk_c_expensereport_statuts = 4, fk_user_cancel = ".$user->id; - $sql.= ', date_cancel='.$this->date_cancel; + $sql.= ", date_cancel='".$this->date_cancel."'"; $sql.= " ,detail_cancel='".$this->db->escape($detail)."'"; $sql.= ' WHERE rowid = '.$this->id; @@ -1062,24 +1036,24 @@ class ExpenseReport extends CommonObject $result = $this->db->query($sql); if($this->db->num_rows($result) > 0): - $objp = $this->db->fetch_object($result); - $this->ref = $objp->ref_number_int; - $this->ref++; - while(strlen($this->ref) < $num_car): - $this->ref = "0".$this->ref; - endwhile; + $objp = $this->db->fetch_object($result); + $this->ref = $objp->ref_number_int; + $this->ref++; + while(strlen($this->ref) < $num_car): + $this->ref = "0".$this->ref; + endwhile; else: - $this->ref = 1; - while(strlen($this->ref) < $num_car): - $this->ref = "0".$this->ref; - endwhile; + $this->ref = 1; + while(strlen($this->ref) < $num_car): + $this->ref = "0".$this->ref; + endwhile; endif; if ($result): - return 1; + return 1; else: - $this->error=$this->db->error(); - return -1; + $this->error=$this->db->error(); + return -1; endif; } @@ -1123,10 +1097,10 @@ class ExpenseReport extends CommonObject $result = $this->db->query($sql); if ($result): - return 1; + return 1; else: - $this->error=$this->db->error(); - return -1; + $this->error=$this->db->error(); + return -1; endif; } @@ -1143,10 +1117,10 @@ class ExpenseReport extends CommonObject $result = $this->db->query($sql); if ($result): - return 1; + return 1; else: - $this->error=$this->db->error(); - return -1; + $this->error=$this->db->error(); + return -1; endif; } @@ -1214,12 +1188,12 @@ class ExpenseReport extends CommonObject $result = $ligne->update(); if ($result > 0): - $this->db->commit(); - return 1; + $this->db->commit(); + return 1; else: - $this->error=$ligne->error; - $this->db->rollback(); - return -2; + $this->error=$ligne->error; + $this->db->rollback(); + return -2; endif; } @@ -1467,7 +1441,7 @@ class ExpenseReportLine $sql.= " VALUES (".$this->fk_expensereport.","; $sql.= " ".$this->fk_c_type_fees.","; $sql.= " ".($this->fk_projet>0?$this->fk_projet:'null').","; - $sql.= " ".$this->fk_c_tva.","; + $sql.= " ".$this->vatrate.","; $sql.= " '".$this->db->escape($this->comments)."',"; $sql.= " ".$this->qty.","; $sql.= " ".$this->value_unit.","; @@ -1531,8 +1505,11 @@ class ExpenseReportLine $sql.= " comments='".$this->db->escape($this->comments)."'"; $sql.= ",value_unit=".$this->value_unit.""; $sql.= ",qty=".$this->qty.""; - if ($this->date) { $sql.= ",date='".$this->date."'"; } - else { $sql.=',date=null'; } + if ($this->date) { + $sql.= ",date='".$this->date."'"; + } + else { $sql.=',date=null'; + } $sql.= ",total_ht=".$this->total_ht.""; $sql.= ",total_tva=".$this->total_tva.""; $sql.= ",total_ttc=".$this->total_ttc.""; @@ -1587,9 +1564,9 @@ class ExpenseReportLine */ function select_expensereport_statut($selected='',$htmlname='fk_c_expensereport_statuts',$useempty=1) { - global $db; + global $db; - $tmpep=new ExpenseReport($db); + $tmpep=new ExpenseReport($db); print ''; } -/** - * select_projet - * TODO Utiliser le select project officiel - * - * @param int $selected Id selected - * @param string $filter Filter - * @param string $htmlname Select name - * @return int <0 if KO, >0 if OK - */ -function select_projet($selected='',$filter='', $htmlname='fk_projet') -{ - global $conf,$user,$langs,$db; - - $out=''; - - $sql = "SELECT p.rowid, p.ref, p.title"; - $sql.= " FROM ".MAIN_DB_PREFIX."projet as p"; - $sql.= " WHERE p.entity = ".$conf->entity; - if (is_numeric($selected)) $sql.= " AND p.rowid = ".$selected; - - dol_syslog("Form::select_projet sql=".$sql); - $resql=$db->query($sql); - if ($resql) - { - if ($conf->use_javascript_ajax && ! $forcecombo) - { - $minLength = (is_numeric($conf->global->COMPANY_USE_SEARCH_TO_SELECT)?$conf->global->COMPANY_USE_SEARCH_TO_SELECT:2); - - $projetid = 0; - - if ($selected) - { - $obj = $db->fetch_object($resql); - $projetid = $obj->rowid?$obj->rowid:''; - } - - $out.= "\n".''."\n"; - $out.= '
'; print $langs->trans('AvailabilityPeriod'); @@ -1831,8 +1834,10 @@ if ($action == 'create') print '
'; print ''; print ''; } - + */ + // Origin of demand + /* PHFAVRE retrait en temporaire print '
'; @@ -1850,8 +1855,10 @@ if ($action == 'create') print '
'; print ''; print ''; - + */ + // Payment mode print ''; print ''; // Project + /* if (! empty($conf->projet->enabled)) { $langs->load("projects"); print ''; } - + */ + if ($soc->outstanding_limit) { // Outstanding Bill @@ -1938,7 +1948,7 @@ if ($action == 'create') print '
'; print $langs->trans('Source'); @@ -1867,7 +1874,8 @@ if ($action == 'create') } print '
'; @@ -1886,6 +1894,7 @@ if ($action == 'create') print '
'; @@ -1918,7 +1927,8 @@ if ($action == 'create') } print '
'; - if ($action != 'editbankaccount' && $user->rights->propal->creer) + if ($action != 'editbankaccount' && $user->rights->askpricesupplier->creer) print ''; print '
'; print $langs->trans('BankAccount'); print 'id.'">'.img_edit($langs->trans('SetBankAccount'),1).'
'; print '
'; @@ -2033,6 +2043,7 @@ if ($action == 'create') $ret = $object->printObjectLines($action, $mysoc, $soc, $lineid, 1); // Form to add new line + /* PHFAVRE retrait en temporaire*/ if ($object->statut == 0 && $user->rights->askpricesupplier->creer) { if ($action != 'editline') @@ -2046,7 +2057,25 @@ if ($action == 'create') $reshook = $hookmanager->executeHooks('formAddObjectLine', $parameters, $object, $action); // Note that $action and $object may have been modified by hook } } + + + /* + // Form to add new line + if ($object->statut == 0 && $user->rights->askpricesupplier->creer) + { + // Add free products/services form + global $forceall, $senderissupplier, $dateSelector; + $forceall=1; $senderissupplier=1; $dateSelector=0; + $var = true; + + // Add free products/services + $object->formAddObjectLine(1, $mysoc, $object); + + $parameters = array(); + $reshook = $hookmanager->executeHooks('formAddObjectLine', $parameters, $object, $action); // Note that $action and $object may have been modified by hook + } +*/ print '
'; print "\n"; @@ -2065,8 +2094,8 @@ if ($action == 'create') $form_close .= ''; $form_close .= ''; $form_close .= '
' . $langs->trans('Note') . ''; print ''; + print ''; print $form->load_tva('fk_c_tva', (isset($_POST["fk_c_tva"])?$_POST["fk_c_tva"]:$objp->tva_taux), $mysoc, ''); print ''; - print ''; + print ''; + print ''; print ''; - print ''; + print ''; + print ''; print ''; @@ -1450,7 +1443,6 @@ else print ''; print '
'; print '
'; - $formproject->select_projects('', GETPOST('fk_projet'), 'fk_projet', 0, 0, 1, 1); + $formproject->select_projects(-1, GETPOST('fk_projet'), 'fk_projet', 0, 0, 1, 1); print ''; - print ''; + print ''; print '
'.$objp->ref_num.''.dol_print_date($objp->date,'day').''.$author->getNomUrl().''.$objp->comments.''.price($objp->total_ht).''.price($objp->total_ttc).''; + print '
'.$objp->ref_num.''.dol_print_date($objp->date,'day').''.$author->getNomUrl().''.$objp->comments.''.price($objp->total_ht).''.price($objp->total_ttc).''; - switch($objp->fk_c_expensereport_status) { - case 4: - print img_picto($langs->trans('StatusOrderCanceled'),'statut5'); - break; - case 1: - print $langs->trans('Draft').' '.img_picto($langs->trans('Draft'),'statut0'); - break; - case 2: - print $langs->trans('TripForValid').' '.img_picto($langs->trans('TripForValid'),'statut3');; - break; - case 5: - print $langs->trans('TripForPaid').' '.img_picto($langs->trans('TripForPaid'),'statut3'); - break; - case 6: - print $langs->trans('TripPaid').' '.img_picto($langs->trans('TripPaid'),'statut4'); - break; - } - /* - if ($status==4) return img_picto($langs->trans('StatusOrderCanceled'),'statut5'); - if ($status==1) return img_picto($langs->trans('StatusOrderDraft'),'statut0'); - if ($status==2) return img_picto($langs->trans('StatusOrderValidated'),'statut1'); - if ($status==2) return img_picto($langs->trans('StatusOrderOnProcess'),'statut3'); - if ($status==5) return img_picto($langs->trans('StatusOrderToBill'),'statut4'); - if ($status==6) return img_picto($langs->trans('StatusOrderOnProcess'),'statut6'); - */ - print '
'.$langs->trans("Number").': '.$i.''.$langs->trans("TotalHT").' : '.price($total_HT).''.$langs->trans("TotalTTC").' : '.price($total_TTC).' 
'.$langs->trans("Number").': '.$i.''.$langs->trans("TotalHT").' : '.price($total_HT).''.$langs->trans("TotalTTC").' : '.price($total_TTC).' 
'; - $out.= ''; - $out.= ''; - $out.= '
'; - if ($projetid == 0) { - $out.= ''; - } else { - $out.= ''; - } - $out.= ajax_autocompleter(($projetid?$projetid:-1),$htmlname,dol_buildpath('/expensereport/ajax/ajaxprojet.php',1).'?filter='.urlencode($filter), '', $minLength); - $out.= '
'; - } - - } - else - { - dol_print_error($db); - } - - return $out; -} - /** * Return list of types of notes with select value = id * diff --git a/htdocs/expensereport/document.php b/htdocs/expensereport/document.php index b8f3d02c8a6..86ff064db7d 100644 --- a/htdocs/expensereport/document.php +++ b/htdocs/expensereport/document.php @@ -1,6 +1,6 @@ - * Copyright (C) 2004-2010 Laurent Destailleur + * Copyright (C) 2004-2015 Laurent Destailleur * Copyright (C) 2005 Marc Barilley / Ocebo * Copyright (C) 2005-2009 Regis Houssin * Copyright (C) 2005 Simon TOSSER @@ -25,10 +25,12 @@ /** * \file htdocs/expensereport/document.php * \ingroup expensereport - * \brief Page of linked files onto trip and expenses + * \brief Page of linked files onto trip and expens reports */ require '../main.inc.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/core/class/html.formfile.class.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/expensereport.lib.php'; require_once DOL_DOCUMENT_ROOT.'/expensereport/class/expensereport.class.php'; @@ -102,7 +104,7 @@ if ($object->id) print ''; - $linkback = ''.$langs->trans("BackToList").''; + $linkback = ''.$langs->trans("BackToList").''; // Ref print ''; - print ''; + print ''; print ''; // Description diff --git a/htdocs/projet/class/project.class.php b/htdocs/projet/class/project.class.php index e1aa84f1f4c..0b80c7b9cd7 100644 --- a/htdocs/projet/class/project.class.php +++ b/htdocs/projet/class/project.class.php @@ -126,7 +126,7 @@ class Project extends CommonObject $sql.= ", '".$this->db->idate($now)."'"; $sql.= ", " . ($this->date_start != '' ? "'".$this->db->idate($this->date_start)."'" : 'null'); $sql.= ", " . ($this->date_end != '' ? "'".$this->db->idate($this->date_end)."'" : 'null'); - $sql.= ", " . $this->budget_amount; + $sql.= ", " . ($this->budget_amount != ''?price2num($this->budget_amount):'null'); $sql.= ", ".$conf->entity; $sql.= ")"; @@ -152,7 +152,7 @@ class Project extends CommonObject $error++; } - //Update extrafield + // Update extrafield if (!$error) { if (empty($conf->global->MAIN_EXTRAFIELDS_DISABLED)) // For avoid conflicts if trigger used { @@ -495,6 +495,23 @@ class Project extends CommonObject } } + // Set fk_projet into elements to null + $listoftables=array( + 'facture'=>'fk_projet','propal'=>'fk_projet','commande'=>'fk_projet','facture_fourn'=>'fk_projet','commande_fournisseur'=>'fk_projet', + 'expensereport_det'=>'fk_projet','contrat'=>'fk_projet','fichinter'=>'fk_projet' + ); + foreach($listoftables as $key => $value) + { + $sql = "UPDATE " . MAIN_DB_PREFIX . $key . " SET ".$value." = NULL where ".$value." = ". $this->id; + $resql = $this->db->query($sql); + if (!$resql) + { + $this->errors[] = $this->db->lasterror(); + $error++; + break; + } + } + // Delete tasks if (! $error) { diff --git a/htdocs/theme/eldy/style.css.php b/htdocs/theme/eldy/style.css.php index e83964949b6..ccf54a6f9b5 100644 --- a/htdocs/theme/eldy/style.css.php +++ b/htdocs/theme/eldy/style.css.php @@ -393,6 +393,9 @@ th .button { .centpercent { width: 100%; } +textarea.centpercent { + width: 96%; +} .center { text-align: center; } @@ -444,11 +447,17 @@ th .button { .hideobject { display: none; } .minwidth100 { min-width: 100px; } .minwidth200 { min-width: 200px; } +.minwidth300 { min-width: 300px; } +.maxwidth100 { max-width: 100px; } +.maxwidth200 { max-width: 200px; } +.maxwidth300 { max-width: 300px; } .hideonsmartphone { display: none; } .noenlargeonsmartphone { width : 50px !important; display: inline !important; } .maxwidthonsmartphone { max-width: 100px; } +.maxwidth100onsmartphone { max-width: 100px; } .maxwidth200onsmartphone { max-width: 200px; } +.maxwidth300onsmartphone { max-width: 300px; } .linkobject { cursor: pointer; } From ad3e91dc9fe2fb5b869bc7c882f962c39a59a529 Mon Sep 17 00:00:00 2001 From: frederic34 Date: Sat, 21 Feb 2015 09:44:03 +0100 Subject: [PATCH 104/287] WIP --- build/generate_filecheck_xml.php | 29 + build/makepack-dolibarr.pl | 11 +- htdocs/core/filelist-3.8.0-alpha.xml | 13081 ---------------------- htdocs/core/menus/init_menu_auguria.sql | 9 +- 4 files changed, 44 insertions(+), 13086 deletions(-) create mode 100644 build/generate_filecheck_xml.php delete mode 100644 htdocs/core/filelist-3.8.0-alpha.xml diff --git a/build/generate_filecheck_xml.php b/build/generate_filecheck_xml.php new file mode 100644 index 00000000000..47b15f4dec0 --- /dev/null +++ b/build/generate_filecheck_xml.php @@ -0,0 +1,29 @@ +'."\n"); +fputs($fp, ''."\n"); +fputs($fp, ''."\n"); +$dir_iterator = new RecursiveDirectoryIterator(dirname(__FILE__).'/../htdocs/'); +$iterator = new RecursiveIteratorIterator($dir_iterator); +// need to ignore document custom etc +$files = new RegexIterator($iterator, '#^(?:[A-Z]:)?(?:/(?!(?:custom|documents|conf|install))[^/]+)+/[^/]+\.(?:php|html|js|json|tpl|jpg|png|gif|sql|lang)$#i'); +$dir=''; +$needtoclose=0; +foreach ($files as $file) { + $newdir = str_replace(dirname(__FILE__).'/../htdocs', '', dirname($file)); + if ($newdir!=$dir) { + if ($needtoclose) + fputs($fp, ''."\n"); + fputs($fp, ''."\n"); + $dir = $newdir; + $needtoclose=1; + } + if (filetype($file)=="file") { + fputs($fp, ''.md5_file($file).''."\n"); + } +} +fputs($fp, ''."\n"); +fputs($fp, ''."\n"); +fputs($fp, ''."\n"); +fclose($fp); diff --git a/build/makepack-dolibarr.pl b/build/makepack-dolibarr.pl index c14fb86a104..3de531902f4 100755 --- a/build/makepack-dolibarr.pl +++ b/build/makepack-dolibarr.pl @@ -204,6 +204,9 @@ else { my $NUM_SCRIPT; my $cpt=0; while (! $found) { + $cpt=-1; + printf(" %2d - %-14s (%s)\n",$cpt,"XML Filecheck","Done in all case"); + $cpt=0; printf(" %2d - %-14s (%s)\n",$cpt,"ALL (1..9)","Need ".join(",",values %REQUIREMENTTARGET)); foreach my $target (@LISTETARGET) { $cpt++; @@ -297,7 +300,7 @@ foreach my $target (keys %CHOOSEDTARGET) { print "\n"; -# Check if there is at least on target to build +# Check if there is at least one target to build #---------------------------------------------- $nboftargetok=0; $nboftargetneedbuildroot=0; @@ -319,6 +322,12 @@ foreach my $target (keys %CHOOSEDPUBLISH) { if ($nboftargetok) { + # Build xml check file + #----------------------- + print 'Create xml check file with md5 checksum'."\n"; + $FULLDIRECTORY = cwd(); + $ret=`php $FULLDIRECTORY/generate_filecheck_xml.php release=$MAJOR.$MINOR.$BUILD`; + # Update CVS if required #----------------------- if ($nbofpublishneedtag) diff --git a/htdocs/core/filelist-3.8.0-alpha.xml b/htdocs/core/filelist-3.8.0-alpha.xml deleted file mode 100644 index d569096dfbf..00000000000 --- a/htdocs/core/filelist-3.8.0-alpha.xml +++ /dev/null @@ -1,13081 +0,0 @@ - - - - -675f04e532731cb5e0cdf17648ad095f -d41d8cd98f00b204e9800998ecf8427e - - -2c2799657fafc999e86d3a9823d9061c -70fb06ff7fb7e61644e7852213c00dec -59fd86d4a02ed3f788a6f32ca94b4fd5 -479aca46b8b848649e96c290319deff5 - - -1d00dfe3dd378ed263a943b10148ffb6 - - -1d8a8c14f623c3db37a02c7eccda33ec - - -ed84c415bafb8d11fbc3bd0dde0e5408 -fd40df0494061d527d1fc1ac4e42cf6f -d41d8cd98f00b204e9800998ecf8427e - - -9d267f46db9b35ccdf464db22f7a8726 -b9825fdcf1aa4eb465d00b452acda080 -b907ebcc9f13aa52a6089f8a3e27a8ef - - -e5cd7d817cbfe8c2b5e4f92a892c2de7 - - -7ca31b0a27342459839b0248cc2560cb - - -d41d8cd98f00b204e9800998ecf8427e -2fdff73e41250121b1ab8849901e0cef - - -062c91c56e9a1aacf0045ba9ef2d295c -664212857d2e3d234fc5af9e30bf78c3 - - -1351e4de8c5ad72c9a1c29c2d0ac9e19 -a60005bc1ec9d7d32bd3f20f41d3a5ad - - -cb26417ed98d172fa1fd331e1985d799 -d6d047f9389cde6f11b9175ffda432ac - - -4c1216c586a413cba81e46333c1cf23d - - -6288df74fb85f7c954c18bf614aafcd3 -18e1c0290c559c617aa92fb35dc50470 -7bd2acd718a001933d1b9723411d4371 -d41d8cd98f00b204e9800998ecf8427e - - -4a23c4ca3dd9fed9e8b50377c8d477cc -bde48870137975f1fc5bc2f00cd6b551 -509e5252fcbe2ceaf3da874d2b277861 -4a080fe78053666d2b23fd4759e3af18 -2a43f612f1f28c229bd6e9768baf8c27 -5917f7c3e28d25a68162575e72ee573b -d014f101c786925b6d34dbaed4953c83 -55cc97fa2026cc42b4771d975b45fedb -74c7d3f5175296a3a243b76a7e6c640a -6f745fb918c6b5d413a7de84c6e54521 -604e7f25ffbe27eebced54943e61beeb -a1033167badb7ecff1c5e71c21e0b7b1 - - -62ae9bf64fe11f60d5244ea2fd0ed4ec -cc9dfb6056adbdcf46540758d67979d7 -602da82cec31cf5a062cedd8ffdb0d9d - - -40fd56dcbfd9c50fa9735dbc0306e054 -946760ff06abcff5d8863b1e782893f5 - - -d41d8cd98f00b204e9800998ecf8427e -3fbbec362765a7d6cdb8c0be9d9cdc21 - - -91cf8da547bb0f98e54e75f2d21507f5 -595e93e44d846e5411686b4a0e74cbfb -1cc5902f4c6ee1798813175f9e19bd79 -2908a5c020820d6384f85a8161ec5626 - - -e854307851ae766249ef55a1552a2c6a - - -e40683c017da1b90fbef6b4df53a501a - - -cbf93873197cf6bdd0e36cd66d2a87c8 -d41d8cd98f00b204e9800998ecf8427e -86da383df93404580615782f4265bcb8 - - -af24157e703b5a70015f532d554711e2 -696135365bfc6df15c7363f284f1023e -2758f3882de560e1d11d208959c0627e - - -abcdf41603da0d617bee025c713adb41 - - -283ba8bf882edf12db8f134d79ce491e -d41d8cd98f00b204e9800998ecf8427e -e2e322bda8e0a19f571796b5ca46a266 - - -099c61f85742fec38c0e6fedff80d7eb -2f76a335578ef4412e9b3b4a222ccb08 -87ab6c05827eaa2db8236ca2c0262ead -762d623e34cb8c1d8b575801543027c8 -65306d3a5faf1ede100f0b433e707aa9 -04e84d93b6851156225d86b33bc68056 -848ba012f7bb08ead96269cac742157a -ab88360e0141e3ddb3c8be3ee745008b -b9a967a29731ccf78b3693d680e3790a -e99a525c7011b5cc748b27040716cfd1 -ccf2ea9b4262741181a0cff7c620146c -c7c981cbe885fadb6853ac3250aab799 -6fe5e34cc37004b4342377afa27fe78e -f15cbc07a79882808b31c59831725260 -748fa3c47dca5861db4a736455d0f981 - - -d41d8cd98f00b204e9800998ecf8427e -2cc99d72a8dbaa097c6e563b127bdad8 -76e6aec3a1262b7b199fd88ae651d049 - - -831e6575098342dfa342551494097a24 -d04b744c744cbe623194c2b644636543 -c156383280c428c267a095bf0befc7a5 -d5f05bdf9580ca4481bf1cc03d37f406 - - -56d1e0d53151eb953d2fe37604f540a8 -c585ad6e9c12a1f93a454046f42aeb19 -aa9359a83ab46ec261a694986c900461 -b0853ae9c443c345ecebcf3a9d53e9e2 - - -0d3c61fe782083a1c8e4de41caba7e91 - - -d41d8cd98f00b204e9800998ecf8427e -589b43d3f852eb2abbdadc7a7cfbb7f3 - - -dc8830ebc56b46f47b078a25cd929e1f -88d1c17e50db3f7e9ba44f6b39c3541f -af528677086b2c26806ac47af95d9d9d -fc9bde4001ef44e613b445c76a5a806c - - -3b4b2f05247661a59fb447dd6572ddb9 - - -543fe99f0aeb0e9aa7241f30fddffb16 - - -d41d8cd98f00b204e9800998ecf8427e -826ccffcb07667e711bd3bec250c0018 - - -fc343f95c06d15588c922ad8f32d2b2d -8c7c756f1961be336a5783d4c841145c -307fd9cd4c14821468bd0b132a661e17 - - -d41d8cd98f00b204e9800998ecf8427e -e346aba359cfe22287fc4e2d6c0da1dd - - -105834a4e145cd3717f34d795ed01677 -b12538bcd742e439ce6edd7afab19a45 -1a97a7e775584459210363a2a86acb44 - - -d160d6becd2eb7392c9c0383ef3d1970 -17e25907696911e40f93dcbef8297b0e - - -a6120adc19e0358a5e7be74b2ab341b8 -d41d8cd98f00b204e9800998ecf8427e - - -e099425ed1f339312a9cde737d9e645a -3f31801db3d9e624f653a75448637560 - - -cf7beba0674c611eca3eb40103a9d56d -31431bfb5d4f361b35887e63a0099655 - - -6d0f156645b7ce84c269ff3adb915803 -cf3df8807edf32bdf31d3d0d148cba77 -c61793fa62504e540c4c08fc387776f1 -d41d8cd98f00b204e9800998ecf8427e -d93f9826f6e8ef4bc66e8a92ae30020e - - -626bde3a24da0abdd179e086c615bf32 - - -03f893c7c0667770a66ed0fd11f1a710 -d41d8cd98f00b204e9800998ecf8427e -0d39677613072296fbda7f35c0ed9d70 - - -55b6fa30dfd9b7ddbcf58cbcc1202902 -289aeb68be3c5ff2a4cdd57a64257b8e -b5bf892046658e477a3d43a7ddf70daf -d41d8cd98f00b204e9800998ecf8427e - - -d60fa512ab394825284751728195161c - - -9f9938cb9fcea9544c62ae041158c44e -1da2f789f3450fc4af6002b84d30706b -6017a8fd4e63cc43cf24ab91886c991e - - -d41d8cd98f00b204e9800998ecf8427e -4c3fefbce8919598e7f04618a3e54ea2 - - -19ff8a52a9056fbaf0fcf50bd50ebe48 - - -ddc1ffd42a2f3351b9b14af6ebb35aec - - -4be6c1dd3aef6eb258ab4537cb331205 -d41d8cd98f00b204e9800998ecf8427e - - -1043bfa076d09c0b7ad7fdafe41db9bc - - -e50a2b68928dd49c7a5472f36ceee6db -7fba20d7d9af0b9ffbc9b96fe7700689 -7688c102038277d13cef57d81e6dc45c -bbe44bcb153a4d179a62233f871f1d7a -d41d8cd98f00b204e9800998ecf8427e - - -03e176252b8e5f80587e2d83e15911e8 -72827a746bfa3eb7431e69e0320e2608 -f27eb8254d7b1596f0bb8d0ec006be2d -5c2c1f531987e5f9b5c35e05a953a309 -dc6576493f80c2b1f45a11699c2dfc10 -d41d8cd98f00b204e9800998ecf8427e -5e9d738becb2303ff019772b11a2c339 -fb0a52c0f6e12945e2d1ea322e8e6652 -4f82208e0ebd681ce990d0da9153f7e5 -3725c8c2c95cc8ce3148b249ddbc0866 -1cb6fc6314f828721499b5e5b7724ece - - -e7ed09f884287afaf9411f78d8a625ce -5e13f22e6a67673acf02acde188a66ae -b507fea3f2bce3c80a2dc2724f8742b5 -d41d8cd98f00b204e9800998ecf8427e -1d48668ee19bae12bf58347357fd9a7d - - - - -3d9f0714e276834c8208515ae7cf1128 -d2184a0f868ac98f1976f53c60de9f19 -2cf26e24b1be8710fa2c48a87cc381b1 -a4d83ff8e98928aebb57edf3f9ef2dbc - - -d41d8cd98f00b204e9800998ecf8427e - - -14cf870bc89190b003d4b67d08399a82 -3b29a33fb5f50c27d39d0645b1d1d96b -b9866ad3e2a12514c3062cf74a711f6e -d41d8cd98f00b204e9800998ecf8427e -bda3f6f14b6ef2f298a116a9e5e4de47 -9b4cf41fd9e3065e1849aff895a0999d - - -3477c7fa74309e4d0519d696663df65a -df651b36e5b7209623d21da1fc2dd395 -d41d8cd98f00b204e9800998ecf8427e -4aa230c3bde0dac55d4019cd436b5d81 -281d687c04e74253d98b998733b08152 - - -b5084a3059667bdcb2a5b9a591f0f708 -48451fe44b83835898ec108b9d9bf866 -b0d093ebda261c4ac0a6bb982cfa41f0 -b7c27239e68ce6f51296820da50bfffa -a3d82ffdba8ca363be0353137e8523b1 -418334153f5b6a5543f6cb5a28f3c82b -5146388b914ad2a67ff419d124e12748 -8c8991fdd1f8a737640549006175fdce -87eae3bfbea127d8e90970cf3fe8a9a1 -d95dd0afca51ee1616ffe9550cfc1f93 -08fc6ae338f02d76f77339c8537012ba -dc02836368ba0678cfc7289e18edc4f3 -98fec0976eec22385c2b735cb80d7448 -d11569807aab1e77f9bcd96fe375bde9 -c7f8ee7a8d27fb0d86b5386b8cd9a6f7 -f5f165bb15c6391fc12ebac3e0a0f3e6 -7dcd96797a60b5e466e25990e534f588 -bc21f92e270cf99791a3fc593cea50f8 -10c2dcc555137e38039193ccedfc0cd3 -83a5a0b9fdc95c8f1647075e8c63c00a -0ec1da6e17dab4c77535ce765f6b32c7 -60d670dc85d029ed1c3f63693d0d4288 -186dbbf4b11a9684557157006bf2a232 -aa86f6cb23c2ae8294bcbd6f2315e8ed -db71e7656127c95fb902fc19efa94945 -7508982db7d5e9e5c7fec3f096de32b0 -6b1538d4b9683808221f30ddad0414d8 -1818aababec2539efc6cee74006d4d0c -a475fb087b707ca8fa0d87a0a7e38dbd -1b1c896eeb98ff295116453c0ea956c0 -021de63f1074cc73a6d83a3e83a5ae55 -1730063161bdb68161b1252c4baf13f7 -3262db34410c13ae4d777e263d779217 -f586fbc887f107945bcfb960fa82cec8 -199dcc4ae427c0d0e5fbde6c0d2d2f99 -e61deb16dd6421608631ed5c1f671c6a -c52a3fd956687b01a7767977926a155d -dd62bf79621c56e565feabc0b84574d0 -c2f72a6d3ee9b7e45506ead106bc8f86 -57da58850de2f4591fc18e23473ba8ad -78f2edd4512d3859d13e1c90618932ff -555145f760c70cf34b190b7214e3b5cc -b19954c856288b7fba6053c64471aebe -cfc96587347a77604730af23372d747f -16202ce23ad23f4f86fcbd0c5d16dea2 -769fa149d74c5645c53a89575a1cea0b -8e42376332e36c72edf33421d3f12bf8 -bac99d873d638b05891fda9f7c62d562 -cb73d7bfbdae912945ec4d98c0d1ec9b -f71ca57649aece8045b66345a612e20a -2da0a1995db50d0752d2e509a3bca37f -c56f3ea358f24bb4e820768e948b416b -c08f79985fa33fe026ef475f840f87b1 -7c8a83bee9be22e875c81d9fd80097f5 - - -5e05ca65e7644db5b2d14faf197bdc10 -fb4265f7f33760648e649d1afadcf377 - - -b013fe1cb4509ffe516d6a7d1aefb30e -0178ccd0294eac78322bcfb837883e9e -6a421190f518462e8f8bfc5f22da2b75 -fbd7c6eb7947061e1cdb26596aa97f7e -f209f3bbc245afc75bf1fe1c2b74317f -de30767cf0a5d454269ab9986fce13c0 -6f225dc643f02ed2509b857ca08a1695 -68633b9a396403744b2f3e762bbf5a19 -f1f34d8c0f864daa5e8ab56801027430 -e9e437b0e54d0b0f215555a8a0aa3691 -d3a94f5738d82056ea2efafb91108df5 -512699b0027618a3031685da1faf9210 -81ef576837cf88973f407a18f2bc1594 -af56ae8f3240a1cb51bf1a10154a81ab -7d5368b1bee0e7367f815ebdcb1ec139 -baf38b4ec10a43d12a333a1c2a28224f -f50022077f0dd202d6e2b9f04c9e12a5 -b37aafc497f4d18671690df0e9c89f8d -5f93e31d32cd99d38e3d59c80b4137ff -240b11fcb5dcc2be6227a51c45701f86 -11f6ca263fcfb41af8c4d7bf36ed99a8 -e078e6e155aeadfdbd41beaddcb80abe -e1161971bb06488cabe9066c8e827741 -3cff0fca31b6bc15881e15137184a92e -f326d01ea1f9cb89d96aafdbf65dfcf7 -7353c73dcba6a3beb03620ccb68802b3 -6ddb05883d36f3d515a76733d4973a0b -61bfc817d2b654aaf31d48b07ba0fef3 -8cc192424d2a8a3a8439cf6c9e9c866d -f07928593887f8dba4b9570f79f39997 -96580781af2e64271588ef6d49f05d89 -1668f8a3a4b4b453e9510fef09cb1603 -9e04b2cd1b93f421705034d5206749d8 -d9e5975cb7abbf8cc23b9ae0909c1291 -1ca4e724a542dd90368a4612a878aa7a -c93c4c89173fc683504c599a41e8c128 -37c8cf292316d659b712e3e792776e3f -01edf46ab8cc0796e5dafd51f645d229 -b518752ccaeea156acb4450b5263c2ae -74f49c52ba746096316a8fabfdd197cb -68d377f9e5f75e719df27def2d880fd5 -4b2f37e2efbc07cb96a3c17df7f132b4 -8ad7dc8c62da0c98fdac28dfda1db0da -b8c0a0b89f697b6e2cded307c88d06b1 -d303c8174006e885937802b900be3eb7 -a42be7db361dd5993f28868e4a3f358f -e1cd0083dd8b6104b2814cb5fc8c2ec4 -5760d742e1868b44dc2f258accaf066e -f67bbb49377ad41691a2560e5db59c8a -ba9fc8cb488b591ac546ac6a5db57ca4 -7bc61a1f1daf334bc893dd1f0b05ca37 -14284138d5f94467eb25db3495ebd96d -a886ae14055bd6191498cf46e1e21848 -d32aa2e1c7b5bd07001c90bc13dc7b50 - - -9f571b2628894bebc827633dd59dc98f -53c59830c0b8e21669bd450638a0aa24 -7d9fbc5051b690698a9d26ccba110d2c -ccd92d7fe7e97e7a33bada943b287470 -ef72a74ee0e4262f1064a0c1dd2251e4 -1ce85d3ec8bf4020aaa4e5e1adef393e -f941b0dd2760b7fbc53b3ad0e10e50d7 -3a4777f67a135a1cfdf7a47069d350f0 -6ad1e01b6d442e0d1300992628e095fa -f3d9b693dd62c347b2c6cbeef1f7d1ba -e45d1e768769df5282df82d16740515c -7d3f325b8304bddfc92dfc67d6b19f17 -484dd371d8fc5567fffecefa657d06a3 -e79c6e7285b5106095a07e4cccbf406f -9fc71331760b7752c84f504143fc78c2 -e131a7ffecf41104dee00ebbce281fab -ba31b0d364ce9d08e5dcdd154a5c07b0 -c917f91833ff8142100e4b8badcb176c -953b6481373f49567196fa44c135b46e -c37c443a0d9233a543b0c421a6b01630 -d4d34062194fee88417c72ef0d8cb87b -62c441d4458ff63d8e88d1ae56bdaf21 -299d941a9f02e17c8b02434fa9e8030f -7b02fd714f4e617b52a592f866acdac7 -1b7f4ed47e2733ed7daf1f068dc5a43a -a1b4f1a132ee1c2910d45a3ddf0b116d -083db641c997ae5c8d487d9b04e824de -f9f8c3fb160d2937acde467f520ede7d -87286fa247ed09647335fabb2a9ea2c8 -b7abf9906af10dc5fd4ba91cd417799d -98b5f31a54bd68f5efa9ca2e8e580ca0 -ca93051d790624d7b8201ac34f585aba -8a54b70546ddfb4c37311eed7fe97f37 -d4bcb45cede4f90f42bce9cb382f4189 -ac2e49c27102ae56b3deed5e8d7c4175 -2af5ad2127c07806695f56e96142ea7a -caff61b2f2d74c3b1224049158c71564 -e87ac956a8e9005dcc4d88b2cfe0ec2e -86d9f65d7d02769aae605272eafad1b7 -bae9be49ff5bfbc4d914b027f5ca4970 -827e24df22814a8944c48039c2731a91 -b5410e21769b5290b1eba238dff65ce4 -873b92d53e67d087fd795c9ae488d80f -67a8f1e3a74c585f1a968cc91050737d -18a504020c06f590d4d3a6f0d53c3efd -184f8b89087e7c5bf304a8fb05056c81 -de0ecbc9edb63dd04e37b313d2232249 -3e9c513679a5d00daee458e8074af060 -5ff52a96336d9b2720308c109e067018 -e5be118732781f7e32a1bbda3cc7136b -ecc6587f01a3e2b2fbb938a01ed61ff6 -c4430027f89011992d470f7fc4ed1ba1 -b0c36f511f37195cb7dc1931e8a8a708 -0b44cc53b25de22d65ec652eb81f2709 - - -0fbebde407a51315a2d98cac08ab312c -acaaa13e10f6147efb78c7b55d53c4a6 -3df54967dc360ed1a72d7e4f9936355d -1c902208e32692968de5c26908ee0dd9 -14aa28cdd295a64b2e0d4bbe0baa7c33 -b96c1540a488d5de96d40a6d9cc52ed8 -4404ecf29a07974f4cf843216d86641c -2b39e01ef2d55c7b3a24671fcd570e59 -1e261eaa004ceeffa908ff6569fc2119 -e9e437b0e54d0b0f215555a8a0aa3691 -f9e1cfceb1be7ea486093f225cd54980 -368454fa3e073fa35b2e9345d79bff0d -4de903225426d7b38514fab4fc79b526 -17cce633ece3d815462391f998080acd -e7dbbbb84a113066900d6ea69cf4a778 -db6c98d5d67b4033e5b2c0669a0defcb -9defbd09e323f332703375da65bca495 -b327f3e31781d3d0f2ff722370896072 -c101b90fd10577eafb85a1e9adb6c0a5 -db2ab5c2057abbb910dc0690669821ba -395ec972c9be2779c654a0876e63477c -6cbd781ebecac429afc832daa0c14539 -e1161971bb06488cabe9066c8e827741 -1bf727c6a0cdbeee4efbd448e0bc6654 -0b5290b5856769452f96d8557ae4af4f -7353c73dcba6a3beb03620ccb68802b3 -cae932031c73d0dd6a4be280d70c54e0 -191a982ab7b579fa76f3c5e132da883d -eed8a78914dc69097046ef05aaefbc39 -789c45a497d6ce7f80954beec8882c8f -af99bf138a27d60144895c6230c31c13 -c09856e4cdafd5ade31d188dd4b4b279 -218bda40807aa861161c930953c7ba11 -191c0d03a039f0d36aa55ad2efc4dc19 -976e6f39654ffd979a1633da2107011e -7cfb04237de67a2fc3cf26a9723dac9c -37c8cf292316d659b712e3e792776e3f -01edf46ab8cc0796e5dafd51f645d229 -9fead8788e57a27012f3b3aca41b5bd9 -a11d51a97a3ff7edc6c4709cfcc1b4f1 -f7f4807d9ee50d2e1146fe48b88eaca7 -2a22928cc7f56983d441f117b4960e91 -7bd380b51bf2a243c136730220c3a2fc -4f2f8f830b84973e80355d10cddeb3ef -444d4bcf3144b554c40758c7d77d4f26 -8568e4d03cdcc1874f6f39e21f994007 -f00bdca37228a584e878f0dab5f8b22d -7d311ba4bf19c7ffc5fced0e178b75cd -1657d9bb1a7159da2f9804c85b58dff4 -6b69d9ca5c92ad146f3680178793788e -418be20b4d4d50ff450dfb18734e4722 -48f08d8f3d2ead8c5083d39370b1aeda -c06091aae80e76102024ec5272e3738f -1f1976a8a42bad235f1ed009fbc606ff - - -438c176002fc11950e59ee67f4c9d971 -fc5fd6bd64fadc4e8df9a77c258e4b54 -6e7619dd0996afa42c3845825f1e2548 -e97efd98e27d982e1d60fa7c310cdd71 -8a4cf10303a03313c80b83dd2585bef5 -ce3e0a1e4503033349fe525f5bb8711f -d74248250355b90443c5340490731dcf -1db9e49d446f770d60dd8d133b654b4c -c597e7c79c9357960e0b8ab1f9f7e6f3 -0dbfb7b5ba0e1e0014419ec151f97515 -90da8a398529c9194ef26197023ef479 -68f9cf0517979f5c5d39b38fd127e9ee -2908e413398485bda9de37c988930ce7 -38dc204d5ee157d9e55e5fc10b9df0fd -22136f109804c7805c3fb45304c10107 -3509f62c9752bbac4f9bde2df2c7c8f0 -92f3a1acc688a40818ed192a9ffaee79 -a6394d613d4b29f539d2dbbd6c3fe107 -6f11fdfa4b04669635edc07ca6efeca4 -15d0c2df93015f87c2ce97bb28692d35 -81ddb439091a37636e74aaae613465e8 -d0a4371ebe59dc22789e075dbb2477ae -a6bfd4f6d8ebdc770a9f310e7760a7b1 -c0ed66438514f4d168012039a10dbe8d -4941939fc3ea3906cfe30989e3c07431 -deeb2efd1d832ede0766d2c71f293c49 -95863c457a525878f5c0ba0a9b0a3791 -1112e6e8e02ae8e6fb03a6ff5c12b9fc -285145b8adf6d1d7e53a1c102b25c177 -5740969422d02dc69ba133385f4ab4f2 -5bd016e3b7b8e53f6ff170fbf35d4e18 -5dc1394b3ce3cbc3b309909fbb255081 -dc2cd95b6531d5b5cc7d52251523506a -48bff4fa8487449bdbe989e53a90504f -838ea08d95f65f9a06957a7d066f0891 -c27b884db8da737a72e976b86945343c -14d77414d8f94acce800baabd8c240ca -bb2295842dea794d554724091853c908 -ab6bebba1db585128b15907e2575942d -2be626d00517b65c00275695f1bb4072 -d0a8291ffda1ebe1c347e110b1b4124a -464491101ec0e54ed35bed7b4a514e44 -922ed41e344ba7eb9a665dbb0e3f458f -3aeb0bb955d966af8406506605547e1c -f77f6005796f224d98f040792ddf6854 -8cf92051189b85e0435008dffa152285 -36c799089633b3a4d376767cbc01a804 -a547fa8ac0b49d743a07be34f8a1f80a -4b3416e5ad27f1623f5c9222cf93f491 -d7054e46baeb846c67f554fbaded072a -117c192253c9e8e32b273ab4d801c26f -673f3e0c4062e13cdef27b581fb66461 - - -fab14e1ece001f18e03308c4abd5d7b6 -9d95d44e6045f242b1ad717ed35f195b -8453f00f699ff8c76db82202dce0538a -b50591f99fa324afaba5e4e1d15829f3 -57e889b845da31e6487290d76a2ee969 -9e542ca6be712dc1134411f391f2ef6c -b8357efaf2331cd36af04b80256e3181 -be736921cf578fe796803738bcc7c06e -af1f4c3b96562f5bf2f6a74c89f86c30 -54b0579451c267a77b8d793e21540be2 -3bdf42551cfc7490ee50be1fa1a43a8a -3085719cf550230628a2323239f90058 -cf750bc5baeb59198423a8ba9039fccf -dd721bafae83a93e9edc1955926e6f31 -9ff187bdce93767cf2f24dbb5b0a34c5 -206e00a72ab802591b922003ede1a397 -094e6c7f3663a5537fa5c043980aedd6 -3bb797554b6eedd86f67a0c36e9918ec -7a0cedeb2e3c160aa33e736ebba6059e -7db02bd09836446eda5edf8ae120cabc -7767ff394313f1229871b8ee58c26a99 -d98e38cacdacd9d7c74df773358d6e6f -349416524f35254fa72144bc7e08f9a6 -8c6845892177aee173dbaa73e8cd8ddd -ab86205f57305fcb3082cdd74c322e75 -1008cbc1e61ed90dfd79c57cd620c92b -c336f582881f9f5ee8c96bbc8eaced3d -bf17f85b9a301749c310ea52feb41c40 -9afb68804040e5f7d92d7c308b79f770 -2bac51be88c59c5ee21511836859e221 -46f6b55d98da9ef1ffec9b1d1a6125bd -a62baed5e31f7048c3a29f3e02895a10 -5a0de7d0f34fd6f63ae32d20e0a32b9d -a7a17bad11811e39b0164573964f3c18 -9f7dc7764ae8426026aabe1dea8b4271 -7e597768c3c03c500ade52792b2cfee6 -5437aca264069f35e46a3fc46f04c2d9 -a1fe9c904ea0bd6d6ea490b977432ffc -7a35302fc4f38830f93e515b9ba74c36 -9ed02a80ad8488553e593a4d126e9e57 -12603b2b8bc782adb794478213a4dd96 -1329a894f6462f689f2db06875f5cb39 -fa8e0f7bba38c31294493c647e897ee1 -e4e03fc7d82d2da0126d8445f09f61c2 -d80451231c86c2884f11e09893c09f28 -d7d2fd96c741b616945e848ade9f9539 -70e166ce8c734b2c4b6215bef0875c3d -67e2f3ad372e14f9854889779cb77a31 -a43179ff95cf512102b83c59e1750325 -ed60154cc61545d8e209e9bf72a6ab16 -e1ab564a46023b3e6c436d370658ec1a -3ce3789f8edd183f821951c1a8d61e83 -df962d37596dbd1a3142fae9eb418bdc -c04364a46b55ae75b65db731f040dbee -0889424a15f7ae4d5147e680d379e3c0 - - - - -86edd8b14802f697dde804a0b134a9f9 -e8db18a3758a6660f1760d5a86a01d77 - - -35213de7f44313882389fa97a536d204 -8102364333a2bd7789a348e5115a069e - - -5f5e1f71ef91392a3edee6cdf5e03408 -0178ccd0294eac78322bcfb837883e9e -6a421190f518462e8f8bfc5f22da2b75 -fbd7c6eb7947061e1cdb26596aa97f7e -f209f3bbc245afc75bf1fe1c2b74317f -de30767cf0a5d454269ab9986fce13c0 -c95d9dd5cdb6d9a6824a6bdbefb48531 -4e186ea8084c33de3fec3182f57150ec -f1f34d8c0f864daa5e8ab56801027430 -d3a94f5738d82056ea2efafb91108df5 -512699b0027618a3031685da1faf9210 -1f319794fd0c473af4105da7eb800395 -af56ae8f3240a1cb51bf1a10154a81ab -7d5368b1bee0e7367f815ebdcb1ec139 -d976f528676688719bb4ed9da722c798 -f50022077f0dd202d6e2b9f04c9e12a5 -e39395accdb3bcffd52f2518788728e5 -5f93e31d32cd99d38e3d59c80b4137ff -240b11fcb5dcc2be6227a51c45701f86 -ccf43b38dc670c1a539500a2c0cb5dc0 -e078e6e155aeadfdbd41beaddcb80abe -3cff0fca31b6bc15881e15137184a92e -fb5913e34a812d5fdf9e25b8ca8c9fb2 -e06f49e34ab23b7a238092f0949959f4 -8cc192424d2a8a3a8439cf6c9e9c866d -2c739e0c5968cac73cc93286aa8dcd3b -96580781af2e64271588ef6d49f05d89 -4ddf34ed8a507480b8e987e8a56a18b3 -c3e50ad0d4c93692a2810e136ada70d7 -d9e5975cb7abbf8cc23b9ae0909c1291 -92ac14a3dd5307e6bc4429f625ac3f5b -c93c4c89173fc683504c599a41e8c128 -b518752ccaeea156acb4450b5263c2ae -74f49c52ba746096316a8fabfdd197cb -8d43131041f3d3667982ff5fa6227d1d -4b2f37e2efbc07cb96a3c17df7f132b4 -e355739b38707e595924a2aae63d78d0 -b8c0a0b89f697b6e2cded307c88d06b1 -d303c8174006e885937802b900be3eb7 -681bb6760c742ae699ed900dca34241d -771c74b2230182471812f2cf4a5b63ee -33a07b8f1c6f7231f2a1e2d5c36dd79c -f67bbb49377ad41691a2560e5db59c8a -76fca7d3f096bd5736ad5130e020c137 -eead927af63207df007d30bbefa0bb40 -14284138d5f94467eb25db3495ebd96d -a886ae14055bd6191498cf46e1e21848 -228b0316d26bdd36e56a9158eea64ef6 - - -c14feb8dad0700988ae6f703f0ea89c7 -43eee6b5058a3c2e177ac50a918af332 -e77b7551332dab6835edc3a2da25379a - - -633f443fcc0c09a326a7d58c1e95285c - - -f135465130fca1966eae06b57a3192d7 -f3dc7bbde140ac9260f4aabe219e874c -7be23572a2abd91a63b7b0164215557b -0bf4d5e2e2dc108c9d7bf4709c95c1c1 -d06039f65616165ceb95e9a140e017e8 -1c1fc0e217e32c5e5f6b7288e162a651 -f7261490003c49efcba34cb82f632fa8 -02117a18e23e6d3fa6af33209fb0e6b4 -381fda47b3c28be5e86909a54ecf6f72 -eabc62c20f3380e78359bf942b5657d1 -bc51599a08ae4696329d8c96cbff6cf3 -506035c575faffff4df76ac0cbd0e672 -c75c6cded8ea2c764ac158c3d233cb3b -88d5cb60dbe10ed6fa96e68b6edb6918 -de6049d388af2f4e8eb601b34c636ad5 -426904859bbfa17b03832bb45bb04199 -fc2d28b6431a119e3a372a4ef381ad4e -ff2e90b1e82d1f359b64a5b256343f6b -e9ad12e8ccc33746292e9e23f1b8f140 -9e1403314ef294502c325a847e94e007 -470d873434141ab51cff2a3be3c688a5 -8f4b79b39959181ea70b9c231bb9ddbe -a4f7de71fffb7fe66bbe1ead04e43890 -2c2fcf84edca5a188faa53a08c2ccb35 -491fa67114d3c382ca11c8beda1d2481 -2bad6855dcaaf4b18c3c92f32d94893f -c5a47d84317264dffb6a23b278af27e3 -345f98a0f72eee4efeb8305a5e6b57c5 -f0b4dcb4ff338aae365219b7c90568c9 -9fe0cffb3ac84e5b1b7b79e2951f711c -356004b343737cb05194e021dcc61caa -e505d0ba7060f00c05df1c7f63461965 -c4000c3a5f961950001bdbf0eada3ea1 -318fe97b75c67ca76a381dcb2fa8c235 -2a5e5c20e225efad5f6b841ad0847617 -29ad231222dee6ac3012844d12f578aa -bd3097dcdf63e182214dda4005b47019 -0d6c28195a3e67b97ba1211fbe041c49 -f8a9ee9349754eca7dd8fa4a3b30923c -097c39ff445ff49f14e4e7aebb2cd990 -349e9aa9ebc8c00330015e3e81b93df8 -5c10d604a0e4afa89950b5c8ea4e682f -19bdb34ebc6cb393aec07df216ff5065 -348843a224b0ab55e3d51c0ef701c55b -362c6615b18d54cdd83844e5bc153adb -d287970d52ccb6489601cd57b50945ad -d2eecb1e8e4fb988dda81bbeb97746c2 -7b0e15f3fe86826a144056261fdb1390 -62dd799f728e0b9780bf13b3994e0b36 -9934607ec9f1d4a65082ed20f36eef7a -98e71577877984bd41f18fc1b640068e -dba59ec36d373ca112d6392ad83b0006 -20f45c49e3159e93486848672ee4650b -e27a20dfdc6f5fd27bb498a0ccb6a355 -0495a2ce04fae425dc6a1d880ceb1dbe - - -5f5e1f71ef91392a3edee6cdf5e03408 -90a76b121fb7fe4b51daad580591cc8c -3222e8667905ffdb07a756fa25a26bd9 -e337dc8e080a86ce2e187cf3a38d0b10 -bc8b10dd8cc1f841662dfdd87868197c -c59c6ceb009eb2e3c935cc90b786974e -de30767cf0a5d454269ab9986fce13c0 -59b195fcff4d3877045fee21c364d524 -239bcb951d596b8d3481caaf19bf8fb7 -924c656e4301df08646901c0ff6971ed -0adfdd38f6adbebe6dcf6c7a82205695 -d3a94f5738d82056ea2efafb91108df5 -983e638c62129d2eb308d63d89402654 -ef12ff29adae2685e120e58aa04e23bc -ab274a62d5a3a8ab5f1e745725b83dfc -f59d11b726bfbb72256b13b9e6472dd7 -d9472c4c816f496c95e5f408e8465767 -6ec9a9a11b06059192bcf4a71a34dd22 -504c9ed23e76b187906db570ad37ce81 -75fb4c310c4f0554d3ac9859d0c5b646 -1a6980f79392b14b3a7e00db58f915ff -8d2578f24429a8c9863f267bd792fb16 -311cb7d4bf06cb181cfffb6e44ed5826 -e1161971bb06488cabe9066c8e827741 -4e26f62fce604bfd6b0735bf7c61d0e6 -fb5913e34a812d5fdf9e25b8ca8c9fb2 -7353c73dcba6a3beb03620ccb68802b3 -f28164a5a95f0a8408bfa00f4a40680d -a171ba167ab22bbfd25e570f28bd8483 -8cc192424d2a8a3a8439cf6c9e9c866d -3c801db51ff672838b9306c63df460e0 -34be9245428cb84ae31c992eb21f33d3 -324f3b1c1afefe3296f76db472cbc9f6 -c3e50ad0d4c93692a2810e136ada70d7 -3d3824b2934300c588713599638fbd53 -6f3b6f771da549d8e22263e795ddecaf -462f3f2edf24c9118a0a6df7f00765fa -8d6f552cc37b4deadd43afb4fe774baf -41369b5804ee02727851331fb655e171 -818898664cd363370ff725a187fc35a0 -3ffecf278a6c726e6b1cef69940945ab -4b2f37e2efbc07cb96a3c17df7f132b4 -51a8ed92619d4857e0eaddd369a14b38 -50e280b15354597442d9b87089700647 -6ec5331e77a0eeba25a9e97667902b12 -681bb6760c742ae699ed900dca34241d -90086ae0090269082c6221cdaff54d9c -b84cc0bb32567be3d521af1a1d2b4cce -4573107d98f6599ed40b01012378fa81 -f7daf29214b4d38debb4d3ffc9d012b2 -eead927af63207df007d30bbefa0bb40 -4ec9196673fd4aebd525032a6b450584 -c4e9cd5c18af616969894e4dceb95f97 -228b0316d26bdd36e56a9158eea64ef6 - - -4d8f5946cc3cdbd8dab61f6581942107 -ae4941e6a3fa8b6d8d65146bbb99dd65 -8f226949f2f1dcc2d543fa55217d2e01 -dfac692419577626a3d4ac26b8aee5b1 -b0fa6054c4127dcd888c56e4500dfa6e -3f805e4b34c62fa1471efe04d89304fa -f54250f7ea8799aa8cf77d1e0a09ee1c - - -e46061d2ad151668fbd00edea86cfbac -9f0b0c6a5186ab5c5da48172ae76194a -5d22af2d16433442fc36311329ba9d8c -a1af09f345b98fac90247a072dbdd78f -0322f5bdc95433d78adaed428a0234dd -1c33df12eb82b93867d4c8acaa2e24de -323b8740b1b8878cdc58c7e24896882c -e65a52cf4d36941cd248253dcde969c5 -5197d029a3997bbb53042f1542bedac7 -f29bed8e6fd1c99c7ac41a24fafa9245 -19f4a42d4fb2adeefca97d8e25419e08 -6494487996f49d70fba56c3ca833ebf1 -ebdd4f294db2f8213d891402300e656b -fe93b7b0d56abc3a790bb13850ef4033 -2b30da3ff0c32ac08a5c37f4321027d4 -f9abd5bb8297bda46368bbe8393a2058 -827a5e657827104b2565cfbab31ecfe8 -2882689c7d3e5e0c95852b4309f127ab -f179873e459544a3907d05e44d8ad70b -ebd6de6f38a691c7eee2982f0722884d -c566aebe8e1ebaa5cc90bb7b39f2fa28 -73805d6dbbbe72badfbb00781710cb5d -d64014b1606f6cc0d87d76a2153954fd -f02782ff85db88073c2177159be252cf -3285f8a7c9e4d322a2068067f1fed85a -0dce8f99073b5b1da5a7430e1175d09c -ed5b68c154af9eb3b251b8de2b929b8c -c4abfd085229f64c2e3c7a6ff445ca31 -66a468eae09e46ab811ed2ac43f7baca -b1bc9232fe15e486a24eec37b583bcfa -3ed38182bfbeac7199bcfab093a2e0d3 -10b082ab22eba4b151b5323769629e4c -fbfa69af145d73c89398e4970a9bd2dd -b44cece9acd980fa9296541427b3e5f3 -f4fe0457c05827125dc44587afcfc721 -10d13de263c10784da8c24dbe9f58a1a -2557c289537cf6b04060753a3e0b0274 -4ec416a711b43858d609a95b741b8a70 - - -ddcef9ecfc22c54d86118c173267b2bb -62b8ce27076238e3c5d0f6f6d24f49f6 -78bfe9d3be2ff976970544de41772eff -ded3497d6d9cc18818fa96922af3e70f -e4c281fa45cf7c9d93f1fc22ee305408 -46279dba7432975139fdb024b5b10c4c -15f741742a192add51c3939832f47ebb -477ae995b637ffb03cf6a191cce1725e -9fe347f867d80653131d51a9e5046dbd -e9e437b0e54d0b0f215555a8a0aa3691 -8d3ba8a390e8b769061f56c83c422ac9 -0070e172ed877ebb42c0ce5a76455c2d -a9b9b83a6e961815e077fe1ad5f3e904 -9d2d9f9c6caf457c693c1193d7136b4d -c5fb1cf72f14c5438641b0f5b02cdd55 -44a4a6953997a93c2f489833faee59e0 -42f1574d30f086bab59703b503707cb9 -450bb0e387a8e51b85a34034ebdf6952 -40f2ba1ead0948ca2e654abd30e3fa9f -d88c639d5fecab50aa948a7b11b7ca3d -b3a01f38a068960475328820be38df52 -8541e3783dcff662e7115e27604d7a87 -e1161971bb06488cabe9066c8e827741 -7b3f2ef8f1c9a3eea21bcd95300c846c -f326d01ea1f9cb89d96aafdbf65dfcf7 -7353c73dcba6a3beb03620ccb68802b3 -296e524bfaf83707ad65714c26964bed -61bfc817d2b654aaf31d48b07ba0fef3 -50bf0381abc0f8619095cfba9e2a8584 -72eda87d6dd40fbff726d08f56c3237b -e2098dc82a558a1ddc64bd0070a215f0 -6b67cbae27301cf6caef06697668953b -e321a919bf6a416fc5225d6e9c3bbac7 -a8040639d1093019d49318557e854cfc -febf106ae20c652084d6e2accdf168db -7ae6bd8e56ea18f94efb81913b1eb329 -37c8cf292316d659b712e3e792776e3f -01edf46ab8cc0796e5dafd51f645d229 -03bdd99193e0b45f059ec8ab43b58770 -51ca3c2a24208f226906c2a055addf59 -25c7a83826317b15d895751e11446fd8 -7e3197ce47be5c2e36bac90a9bf063b4 -2fe4b977ba405e3e85b0f36544ac7840 -3d6277015d1de07ef4d0d5b32d738d3d -a250f47bd4b44fdcb637a14c85833b16 -b39e88d2e9c83f2e3e231c0b4709134e -d7df0158e09210e45d4de8f45e2c3a9e -83e92fd0616bc81a989e933048439bae -0b28b44f643e672a9badc00525fa681b -10bc1ddca03b2af96dae69ad3a25e06e -467a3e47bc4afd8cf96b9611a27e47fd -ce4995cf90dd19e55ff44698f47035bd -77fe938ececda11bf8dbc014d63e6002 -441e0f2ccdbec200a6056f9fdc0c3c97 - - -eb42c1cc4e30c00a4b3fc8008341536c -cbb75070c31c07f654d25ba0762f1c61 -367247d45a1052b44b57cdd4e2df73a4 -bd32d62609178e9424f26a7abe08da79 -e00d04017034fd4c9c002a32436be092 -55b3ad324fc70a0e655d2138b117e56e -64cbf57e30411b123cad22aecdec8857 -5c3fca1a0fe9b4eb6ffe3c9d9f8f7062 -aae9d37af7193f531dd6b5ad8adadd3f -13ad60b128af08f990d4de64967f413f -d7acd7be0f4a0f400bf396771c0d794e -1a53e9a039d23bc5a129653bd03a7778 -96c10b9c8d2fcca004a00c083d8d6e95 -612ad9adca6f0639bcebc44b4d7bd123 -64b759e6c8bcbd840ec812d9ef6ca6d4 -79089255158765aeec5fcef88335c136 -241bc126cfebae42bbbb14dd512beb65 -82dbee18794b8b5696c634599a5a3cf7 -19e47714f4bbb927bde7107edc730d9f -72f497542576eac0f918c49520a146e1 -90383b0faa3272d28ca32ed25a20b0a8 -54f03c6e63643662e133293007fcc8d1 -e1161971bb06488cabe9066c8e827741 -33f229381f8245e15c1875ffaad47108 -f326d01ea1f9cb89d96aafdbf65dfcf7 -7353c73dcba6a3beb03620ccb68802b3 -a05dd1a5f7c030c74e4593fb8f18f0cb -61bfc817d2b654aaf31d48b07ba0fef3 -2be4d4a4c067b0e7d6abb9364ac01a7f -6ac0f7d847c757aacd45145f1a0f72e0 -b1e823b7426e0e0982ebe3467edb9440 -33ff1fc9faed5451dcc59e2b33e21f59 -2da9b931d17ade2a435827c23455e872 -bebf878f911b09b2b84a359406ff23fd -15587334eaa9a54668859526ef2a173d -664efb749c849ac113f4a51ffd3c47e9 -37c8cf292316d659b712e3e792776e3f -01edf46ab8cc0796e5dafd51f645d229 -76d0aa5bb60a03e95e66b81a958fe8b0 -bba6591821833b5cc66dec5f6468a913 -bfaf1fbd860ad549188d71cd85e982ae -2908d9dfd261bf97f63ca0c4f431f1dd -c3a184cc20b828b91a1a10eec15d9f1f -d62fba4ab91fa5bcc4095ff97a6c9fe8 -67cf4ad56867f153e85ffda277f01799 -7b38146af31c9a2d81c95b41efd3855a -415e75e991b01242469cd33d7d09e326 -7d152726bbd7b3b150d084f61099e7af -3c137145525cff48fbc6db4a5140452b -4869e52407ffdfefbea97cc46f576d20 -a7fa3d4ce82fda303db4c0e92a25ff8f -3d23b4ffe1b853309ecd0b759eed52d9 -81a6d0147fe8f0e6fa2d3b3983c6cb70 -64d8c175fbdf22de3a58f0fe7a5d568d - - -cc72f40a56021a8dfb917af798a0f053 -4d3cee00481c7ae0bb359e0350ae9998 -7ebcb8ba156c42fa939d725c74263bbe -df70da4e6b594d272466009a0805c781 -247a029b7ddc571ad7c32ee7c7c3bd9b -91d23747969a9a433bd083b7238b20b3 -9a2353991fa9c9eb24f8a542ac8bd396 -0b2ff41b32ddac3abfdd5615b520392d -ad72b32fa88b149015f6e9e0f8fd9411 -6f4a8eac062a712115422039b36c0fa6 -73e4194b6f864e4aa40d050701cac744 -7d1e66b229465c0a5803e21b89c588ad -15244510a8a8d2975d9415fc162c09c3 -2753a6b04e03bbe0d90253a41ca328de -47bea4b1193eca7b0bc61b6ec6134076 -ba8c8ff377003a9e4debb6092bd7cef6 -37ec4fbf4d91e91e704fd6ad126bef65 -4cb8973f5d163980e75092f1a46a74c4 -57160d6901b4fe33370e429c4cb06aac -a18eab1b21b296c22be7ab16725e7070 -bcc80798b175c7483f1e317d4f6c5013 -111adfb91bfad1aff8452398fa4d94c3 -e1161971bb06488cabe9066c8e827741 -2c0aec3fa67d9f058c72bbf8980af06c -4a64102233f5cc6a326d74c738ed1333 -7353c73dcba6a3beb03620ccb68802b3 -4caf17ea984ad2ae9543ccd808608657 -488c207a47c487177bd0daa244825ba2 -a2176e70d49f029e4ef345e258cabcd2 -5f6ec2197770062adf2c60d8b5daa5f8 -a451f2d5998e70bfdb9701c10e88787c -1b1e7a275fd686cbcf0e9cb3a365f717 -63b148030256683a2847c15ca0ff97f9 -0f98b1f68cb968ba79071becaae05ac0 -1f2dfe32a45c0cc407b1e41483875c6d -36a41f0c293500e03ae060c200694f68 -37c8cf292316d659b712e3e792776e3f -01edf46ab8cc0796e5dafd51f645d229 -4ca616e0d6c5670ecd96c95f87c0556c -ee9d219e267ef4d8c10e50903e01519d -74e40bd84a91dca58cd3254eae209778 -9431dac878f7cbd1faa44c7b1e9df9c5 -4665d1a3d64f9139e3baaf973d5a69bf -72c3cac168a19a773c5c91864fe03dc2 -8d1ce4b7737e2aa076652e2f2ebc74a8 -b5ac41b2d7993ff82acb9a8358a17202 -cf835eb765d8133ec1837f6b6abd84e0 -517a808449770e37ef5574f7df9072c3 -67f1164671a8a5309bbc81f8ce23ac70 -ea7814c2ed2c559a4a3e1e26717cfa5c -c3666f4bf323f11ef7117f2952a0d6dd -6416c58b52a9d2a2ef47e7d43aa655f9 -e9e8da8d47da8fe64219b0bcc638be8e -1ec82f780ad10ccf1017f53ad0a982fb - - -bf4755dcad4fa5a295dd87944ea59531 -0178ccd0294eac78322bcfb837883e9e -6a421190f518462e8f8bfc5f22da2b75 -fbd7c6eb7947061e1cdb26596aa97f7e -f209f3bbc245afc75bf1fe1c2b74317f -de30767cf0a5d454269ab9986fce13c0 -c95d9dd5cdb6d9a6824a6bdbefb48531 -4e186ea8084c33de3fec3182f57150ec -f1f34d8c0f864daa5e8ab56801027430 -e9e437b0e54d0b0f215555a8a0aa3691 -d3a94f5738d82056ea2efafb91108df5 -512699b0027618a3031685da1faf9210 -1f319794fd0c473af4105da7eb800395 -af56ae8f3240a1cb51bf1a10154a81ab -7d5368b1bee0e7367f815ebdcb1ec139 -d976f528676688719bb4ed9da722c798 -f50022077f0dd202d6e2b9f04c9e12a5 -6b43b9d8bb99cdff24204847f612bf01 -5f93e31d32cd99d38e3d59c80b4137ff -240b11fcb5dcc2be6227a51c45701f86 -ccf43b38dc670c1a539500a2c0cb5dc0 -e078e6e155aeadfdbd41beaddcb80abe -e1161971bb06488cabe9066c8e827741 -3cff0fca31b6bc15881e15137184a92e -fb5913e34a812d5fdf9e25b8ca8c9fb2 -7353c73dcba6a3beb03620ccb68802b3 -cd6b592800ffee965a5a3c733483e778 -61bfc817d2b654aaf31d48b07ba0fef3 -8cc192424d2a8a3a8439cf6c9e9c866d -2c739e0c5968cac73cc93286aa8dcd3b -96580781af2e64271588ef6d49f05d89 -4ddf34ed8a507480b8e987e8a56a18b3 -c3e50ad0d4c93692a2810e136ada70d7 -d9e5975cb7abbf8cc23b9ae0909c1291 -92ac14a3dd5307e6bc4429f625ac3f5b -c93c4c89173fc683504c599a41e8c128 -37c8cf292316d659b712e3e792776e3f -01edf46ab8cc0796e5dafd51f645d229 -b518752ccaeea156acb4450b5263c2ae -74f49c52ba746096316a8fabfdd197cb -8d43131041f3d3667982ff5fa6227d1d -4b2f37e2efbc07cb96a3c17df7f132b4 -8ad7dc8c62da0c98fdac28dfda1db0da -b8c0a0b89f697b6e2cded307c88d06b1 -d303c8174006e885937802b900be3eb7 -681bb6760c742ae699ed900dca34241d -771c74b2230182471812f2cf4a5b63ee -33a07b8f1c6f7231f2a1e2d5c36dd79c -f67bbb49377ad41691a2560e5db59c8a -cbc3240e761eb9eea5e365334290643d -eead927af63207df007d30bbefa0bb40 -14284138d5f94467eb25db3495ebd96d -a886ae14055bd6191498cf46e1e21848 -3122c8015a2583d254fbdead8e4fde52 - - -83d729372d5e39fa3939beef0927b2bb -44bc85f4400feb9f9e22e31fd2d4df38 -a3843ab046d736a72d29280094d0d8dc -16c302814db822af5f1288b34c975005 -6d9dff9101358275572a828c358fbba6 -bfafa0c286495a0e401960ae8af27916 - - -8132df66fd38270c43de7d9a97ae5ec1 -c46178f7d6d683783ef1a6a9c4464c58 -b0532613e4b25e1451fd0d40c4026b74 - - -c18aa39b4d00d5c28c1cc92c65637656 -cbce7ddc8f712d5cdc633b218088e0e9 -acebe8fb0a4058a0189ba67d512d7053 -4f35b4efaea2857d66755b9f424c308a -58f84881daa432f7d10f2f01bcbcdebf -66310e1e4309c85eb4e7ac7018339c8b -48fe291591d6ec39ba47ad755a85894b -826d9f074ca77b3526c14c2c1d88c00d -be05aa1b12e3b558de747e470b5731c8 -36c0c9a9f2a666ccc7bd01403a7bbdae -95c5b1570a88524189d63dd0f571f89a -f3688fbb4fa58a9e6c16046e41bf57c5 -b2c0507286c5c8a4fb7564c31e3a27f2 -88d275ae3123e0caae031524e549486c -b61f4154ff299794f52a5e7153946e3c -e8de10e869e6f8f1f6d78e14b2ba169e -077d8c715feec232bc38e4a127d3207e -dc7fc2233794b9cf74f52735313a9370 -6fba8e10504ada973f491364821733cd -e36e04a9498275e7535f9e8aaccd7584 -f9a3aff9cc0d7be225433a36d9961089 -c2db6705a7227c99b57e4af0ccaf1298 -e1161971bb06488cabe9066c8e827741 -7a66ec6eb910f0de9ef05707d40e12de -f326d01ea1f9cb89d96aafdbf65dfcf7 -f8f96ff7d44cbfc3936eb112c11a2462 -76a0613508a5a10c24593f42b4e912c0 -61bfc817d2b654aaf31d48b07ba0fef3 -13c5ddf75492c68962c91afab763ab5d -ec84361b95f9daa20c8cc82ec757c928 -7f93088127b98cafd60d4759df22511b -d8299b684c3e4302c94d428be5b75544 -01053996c184a56d926bfd6df317503d -2d76dd786b831b6e2876a467fbeb84f5 -018a5012f674cce072b298478ef0a9a7 -737c817ef5b28ec06cda6e8f315c5f5b -414e0494ccd20f84c7fe6e6a1717a9d3 -01edf46ab8cc0796e5dafd51f645d229 -cdd9ee8a04fcf483827b3c483356c0be -6520ef400620822c7913c598547eb446 -60e431172a3368d8372405212ea4079e -f8c93ce8c3fa1efb737d70304751ab72 -e6d9b3ec9b59b75a0f34d4a21c5ad112 -21bea4fd9b25c03b4363c3a09eddbb40 -a8de25e1b102e7b0a25881de92f9b30c -3e3f45be57bcb65cafc6165966deafcf -947661e8c8209827f0a3ec26654f8d7b -8ed590932c87df8358d789266a08814d -c1e50d178f389e4221ac9a8471136d95 -ad64e8e776e53b04771b562631350144 -4041f76e2fefcbe27def47ad7d3b8d9f -e84b5e1984f705f673821ccea796c0dd -5b57a2f3ec88af3e1df6e20700f171ad -dd058ec36bc52e02067790a0ea65b47e - - -906adc49584042461b20f130732ea9e8 -0178ccd0294eac78322bcfb837883e9e -1c8caf0658dc96d6ef1749213e7a91b4 -fbd7c6eb7947061e1cdb26596aa97f7e -2557b24410d1fb00de290259c8102fd9 -de30767cf0a5d454269ab9986fce13c0 -464e3cd1b9ccd7bb22bfdffb69ecf33b -68633b9a396403744b2f3e762bbf5a19 -f1f34d8c0f864daa5e8ab56801027430 -e9e437b0e54d0b0f215555a8a0aa3691 -d3a94f5738d82056ea2efafb91108df5 -512699b0027618a3031685da1faf9210 -81ef576837cf88973f407a18f2bc1594 -af56ae8f3240a1cb51bf1a10154a81ab -7d5368b1bee0e7367f815ebdcb1ec139 -87204bb4bc4b2de9530578fce343498a -84db5ed2fc6ee433b8d41b731d4d5cd7 -130648f855cb06b04808b8deea64caa8 -5f93e31d32cd99d38e3d59c80b4137ff -240b11fcb5dcc2be6227a51c45701f86 -ccf43b38dc670c1a539500a2c0cb5dc0 -e078e6e155aeadfdbd41beaddcb80abe -544d1e567d9c598375d0b2d08cf632a1 -3cff0fca31b6bc15881e15137184a92e -f326d01ea1f9cb89d96aafdbf65dfcf7 -7353c73dcba6a3beb03620ccb68802b3 -df9268b2d0dc39ac9d7edf21773e98e9 -590d0712e9890163d5f0e2899cf5ba12 -3e3baa2a47af2ba7525ad71522d6ed85 -2c739e0c5968cac73cc93286aa8dcd3b -96580781af2e64271588ef6d49f05d89 -e40e2e3fb51aa7bcb4d737a1079f7f7d -9e04b2cd1b93f421705034d5206749d8 -d9e5975cb7abbf8cc23b9ae0909c1291 -1ca4e724a542dd90368a4612a878aa7a -c93c4c89173fc683504c599a41e8c128 -dbe76f9c3c57b312b0d6e217b9f2a1b5 -01edf46ab8cc0796e5dafd51f645d229 -b518752ccaeea156acb4450b5263c2ae -74f49c52ba746096316a8fabfdd197cb -8d43131041f3d3667982ff5fa6227d1d -4b2f37e2efbc07cb96a3c17df7f132b4 -8ad7dc8c62da0c98fdac28dfda1db0da -b8c0a0b89f697b6e2cded307c88d06b1 -937ea10985785243f5af05fc8c2f6158 -a42be7db361dd5993f28868e4a3f358f -771c74b2230182471812f2cf4a5b63ee -33a07b8f1c6f7231f2a1e2d5c36dd79c -f67bbb49377ad41691a2560e5db59c8a -57b84394f368bb400dad3591d8ceeaa8 -7b66369f2447bf5361d9460cd162a092 -14284138d5f94467eb25db3495ebd96d -395e11cf3a9af41ed0012d435f5a8d88 -3122c8015a2583d254fbdead8e4fde52 - - -941286dec9631202d8c809fa73c4bac9 -0178ccd0294eac78322bcfb837883e9e -6a421190f518462e8f8bfc5f22da2b75 -fbd7c6eb7947061e1cdb26596aa97f7e -f209f3bbc245afc75bf1fe1c2b74317f -de30767cf0a5d454269ab9986fce13c0 -6f225dc643f02ed2509b857ca08a1695 -68633b9a396403744b2f3e762bbf5a19 -f1f34d8c0f864daa5e8ab56801027430 -e9e437b0e54d0b0f215555a8a0aa3691 -d3a94f5738d82056ea2efafb91108df5 -512699b0027618a3031685da1faf9210 -81ef576837cf88973f407a18f2bc1594 -af56ae8f3240a1cb51bf1a10154a81ab -7d5368b1bee0e7367f815ebdcb1ec139 -87204bb4bc4b2de9530578fce343498a -f50022077f0dd202d6e2b9f04c9e12a5 -4507af4962ab9c28d54a18608feb7335 -5f93e31d32cd99d38e3d59c80b4137ff -240b11fcb5dcc2be6227a51c45701f86 -ccf43b38dc670c1a539500a2c0cb5dc0 -e078e6e155aeadfdbd41beaddcb80abe -e1161971bb06488cabe9066c8e827741 -3cff0fca31b6bc15881e15137184a92e -f326d01ea1f9cb89d96aafdbf65dfcf7 -7353c73dcba6a3beb03620ccb68802b3 -e06f49e34ab23b7a238092f0949959f4 -61bfc817d2b654aaf31d48b07ba0fef3 -0ad67108567f99662f7dabc9585331da -2c739e0c5968cac73cc93286aa8dcd3b -96580781af2e64271588ef6d49f05d89 -4ddf34ed8a507480b8e987e8a56a18b3 -9e04b2cd1b93f421705034d5206749d8 -d9e5975cb7abbf8cc23b9ae0909c1291 -1ca4e724a542dd90368a4612a878aa7a -c93c4c89173fc683504c599a41e8c128 -37c8cf292316d659b712e3e792776e3f -01edf46ab8cc0796e5dafd51f645d229 -b518752ccaeea156acb4450b5263c2ae -74f49c52ba746096316a8fabfdd197cb -8d43131041f3d3667982ff5fa6227d1d -4b2f37e2efbc07cb96a3c17df7f132b4 -8ad7dc8c62da0c98fdac28dfda1db0da -b8c0a0b89f697b6e2cded307c88d06b1 -d303c8174006e885937802b900be3eb7 -a42be7db361dd5993f28868e4a3f358f -771c74b2230182471812f2cf4a5b63ee -33a07b8f1c6f7231f2a1e2d5c36dd79c -f67bbb49377ad41691a2560e5db59c8a -76fca7d3f096bd5736ad5130e020c137 -7bc61a1f1daf334bc893dd1f0b05ca37 -14284138d5f94467eb25db3495ebd96d -a886ae14055bd6191498cf46e1e21848 -3122c8015a2583d254fbdead8e4fde52 - - -8b3710699f69f77af106a7076ab2432b -1abdc7bdc807167558b363ad209cde6b -826f390e791a08be2b7fb6bfe4df179b -2889e30d30c097b279bde50b5b969552 -bc1c92bb271b1483e018dc2ecc4a1bc9 -c2f9d05dde63be9e766580c186f14790 -770e2ab7f25b3e472aa802e6c28ec618 -c2d7742f87130bde6c3b91332f04c837 -a8aa564bd6533fd41d89c882044ecf12 -26aee2b928cb7c730be4e3f341505ce2 -784e8b81afaab9108514472162532414 -873792794d37040095e03b2f706c5e88 -9a13db56e8d33a3225e5a034d45e1fa3 -dc464f0cc88ec03965837243ebaca8cc -f79cf60e6fcc037e4db1847f2cf3c39a -299a289cdfd2821625e55b24022798a9 -bc9bd785b725e6207b5686094cf75d43 -9218a6ca6a221631ed3df2bf8b86e69f -52617af5059503ff1f2e342f6f64b729 -52f55c471841f57fc90e8cec05cff235 -e87c1b421a5ebd90d2c4489335243122 - - - - -ede4afcf04f50d96d280201986127377 -bc71e5fc00ccb87cfcca91e37872be45 - - -fad9ffebf9d9ebfc6be41e9ad00869ae -7864745b6e16ddc5251920c7a15f4f14 - - -4ced3dd080fc4f418c459a4449041825 -bc2b70b940bc312acc65a02f2c1c638d -82ca8eb243f0887294bd91eca809be3b -34fee74890b73a52abd12cfe1b850a48 -fc357b2047442442ce84d3f1904556ab -e05eb5b94f52139e50c47a559ccb4297 -b3ea4105cec2b19d69aa8e72ea483525 -ce9447e5187596bbbc50d0906cac35fb -3afb85eee792fc054a42df621767b520 -5cdfe2af14a59731ac7d27ae796c538d -ea31b7312a74a5dda3fd2a9f237e9c93 -f572354a10ab0376a20f8f27a39fcc07 -1c2e7835ea5e226f6fc25bf952e640f7 -39705d060c18f97b4c7f4948437812fe -d92e2124156e3a61a173338214039b5e -31f372c93f03315c680f0ccf7d1df897 -8b69572abd8ad6f82eceb16af43ee0d2 -581027137813cea8a8e2aa1a5f725169 -bfdffc1cf6e42979f52384d3125b72ad -d95bac487dc8b05c0a44f86e740d382b -8e2cb39651670c4118da75ffd8a17f4d -84514130dbb4737c23c7c9ef98c8cd4a -978c57249da23e3f3d93de87b2c135fb -10cab97d744e06765b4e1b4421677a8d -c35de5bd5cec0c5e363104a2e2e4bef7 -3f6ddb2794572f52a73c619c80734390 -736a66ca7f239176808e27b9ca0bc913 -52faf19e9059289d04b5d5beaed681ce -17835e9b0f75e2f6dcc0345f888cdf4b -693e906d984c65092685a29f2dcbbede -70b34e253b55713b85f8b2e0e46030a0 -5c453f172b1754133316a71bac9e2573 -76391c0def140fedc6931ffbf18ab295 -9e080704858538797c4e4e79402c64d2 -c7e70b20d22458e1c7625cde28fd7c3a -15ea4565daa48c716649049e0ea1db78 -877c106bc57e270722a5f361a06ab714 -f4bce47663370838d1543355d79963d1 -26f01264f0d4f2022d8d4aa66218023c -66eebce929c0e1313b636ef7a9f5fb02 -e6480ef4d95c891a7b1bd330e7cd8098 -e88ed127337ee404580fb0800352c21e -34e9b8c9933f92c532b9cf91942762f6 -d15c124f360597bb9378072bdb318596 -3d358f98fbf611ffb785d039a9e80eb9 -e296aa7dae0e0d5d91a2a7cab148a042 -cd8c1d21b83bf043226c29095760af9e -5503a5d591df2240f214dfa56a500ce9 -c922025046a1ced888957386802b7a1a -8f7e27d5fdd078d147dd5f8243a9c8c0 -68bdddeadf40d3061dd009fe77eec5d2 -8d5faf8e36b5e4b4da158ff2d6bd97e9 -1cfb457b21fb0cf994e6bbc661ff6ade -5a04b74b0d1c7b3fa3e064f0dcb61208 -5d8da5928c310fe821026ff6eb52477f - - -b057ed88c68f66ceb4fc3f7c4ad8e61e -83390246a5a15a70c0115927b6ce6392 -811d2f2fabf672d37861d4cda118784e -536d1e5fc0c0db495a44906b959abe87 -b862f2f6c8261be10f3c18faff22fd22 -102163267365402aa9b5bc6f2c5d163d -a84a45468793af4fd1090872ee93d0f7 -e0a2135bf8ba78d71c0162491021d9bb -98e1082970a865bf1264472c0367b2ea -639ec4b2d4e24fc69f96928831a2f9e8 -df4d1d873a80aea2f31d76b818e366fd -a2e1832c57b19513176a741530684c87 -d34fda783a6fc6820896dc90f1a5c0e2 -7883b003313ff4acf806158e7821e206 -53edf5b4cd1685a65cad0836a910d044 -f8e9d0e2f7ca86f855a1fe6a39eab4d1 -372bc71f7dc03daee0e49d8599e4ff4f -716392958d58abff5ff2b04aa8a3c256 -7f1cf10b121b601826c8160b97d9201a -72811bdfd0ece6be95ca95d087084c00 -0ad294e13b73e36581d61c6c7ab7c712 -689b03714c6aca65c47031f4da01ab2d -86b10d96c3a969dbf3a625859ee245fe -989a0abb9001a25c1ecdbe3fa083e001 -ae2a39ed84e9a8b31e97d34efd50bf79 -7a75cd5ac5590263657b0fe81c2e9686 -c0a56352bc124341ab96489d00a5167b -2f5aa1a7a5d62c667da6954402e22796 -2ba914ba1f287a51e96117c8734d0370 -665469b73e3a416dc601213cb4e8b9e1 -2c8bcfd130f75c11098a1a143e256dc5 -560ad01d1554b6347a51e2341c05fc9c -c9310d0a5a4f7e1f6b85201c0dc2fc5e -1f80e739843212120c61324f88ac8b0b -bf1409395306f2b2924a67beac05dd56 -582d3840b57ac01071e79b054ec3443b -599dc37a15c362ea63096dfbf7f57bf1 -ae825bd177c0c93c475c0ec7d9d6aecb -571f14e856b08e7dfbc7252be9a2dbee -714f717823a5c35cbf5be6a60dc600bf -415710f6d8f8caa5326a56688a20f3f3 -47f5569a8bf751eaa70fa105edd2293c -cac02982af1a016e225fba5f78dbaf9d -a056b5b1b9e60d4566ccd0ef2aa73a03 -254fe8bf07d0ce1583e99261f873a52a -4bfee5904f91bea7f89e69b65d84edef -e57926cda04d8b129ade51ccaa0647d6 -22aa8d4af78e8c2cf1a2c578b1a32607 -700573e20f246b9d31d1484172c6253f -8991edb708de7a411b42d99147475b40 -ece08cb7ed6810cdb3f0c1c917ec986c -7b99c6b195af997027c07bd9348c7b1c -a2e506c143037c5bb6add7d49bebc772 -98035fec612b1dea0f11fa299377d2bd - - -1267c262e4d4a11353de05ed39414cff -e3075d612e92094a4134b11ff66e4e9e -dc739b6022b376e25d86610e888b794c - - -d3afd148684ee2162cd15d37ae73f583 -54c1893b5e27e3345d78bac145ba272f -cd97b8dfda3edd10f62734b89289ff30 -02bfe9c8f1744e69021e7f1e2ebaaf4c -0729ac12981fdf358948ea82e6c3cb2b -f5ab530eb3d883a6900ac867162e452e -9db68f434b6113836433bb3a671e71d0 -2af14f6c4b858b8816b24c596aaa0888 -f249c5416780b6370b92514232af8da7 -e9e437b0e54d0b0f215555a8a0aa3691 -5f90fe1cd3fcfa8948a5c614d1985e80 -cb73a3a2e7e141686435b9b7ec22067a -75d801291bfd8b682fa6eba87647eb57 -8349f371a2e2d9097bced4723a9eaf31 -f16dad9be9b87ea0337457070a2a333a -7e2ccffaf9bf9dffea7c800c687a3a6c -7cd78d94616577efe415d8fed3dd61ea -1bcc17e7b57fb146e43bfff515a3d9e8 -69a140a13b73949262053829615d06ef -6f7eab4dfec30d7e589ad53e7cd3bf96 -5d6d088a5d66ef22a67016cdafab726c -1a5852f4d4002925cb7fd54937bf3a20 -e1161971bb06488cabe9066c8e827741 -6bd6137f9227e13c53eb1df958aefe3f -f326d01ea1f9cb89d96aafdbf65dfcf7 -7353c73dcba6a3beb03620ccb68802b3 -ad61c77963552f376bba351d8cf351b2 -61bfc817d2b654aaf31d48b07ba0fef3 -d9f11c2cc6a7b5929a915d7a998e925a -479e94a0a2997a8b21f4360fd9ad7795 -5150b8d59527ebc9e74ed87f3f46a237 -3979c94575e56cd6509f49921b29e6ee -afaf8c79e4a90aa57382f99ed2d40f1c -9e4be8088054e25f29fd9490486059c3 -d35a21763c1765d888ce5e9f7192d161 -58dbc78a3d7f35e6123ce263f3c2bcb2 -37c8cf292316d659b712e3e792776e3f -01edf46ab8cc0796e5dafd51f645d229 -f3de494a87b03cd6db09d4f8483a7618 -87d324b30d4aee35c96aea613f766336 -d50c405aee4bfe5af080cb061afd77c3 -e4534f9c018442d67ea08de411aac198 -b21434f3e86f7387b373697f21bacac4 -865c92f8da49ec76788260ec46483d39 -f8de27562d6bc47c4b3d88cfda992908 -6373b95c48af4f71972938535912fc8a -6abeed47fcd585f2a32ed3a00125e753 -8518c823cbe55bea733955ab01550f89 -1594f44126856c91144ca801d38252fc -2ce826b576519666c1879130bda4ec8e -1a5e128366cf4e045d2679f34f956be9 -cc7ce504ebbf3f1c869b43e2a291ab49 -444d2820d5981f9f720ea7e4e08ae5bd -ef8d5f107a66b6aacb79a8a4f5d01757 - - -5e1ee36447ce06030696225dd064d41b -fd05d84bb7a972dfd7d6b479817d078b -6265e79d2a9576edb5f13566803499bb -5e1163c3cd079aec50b898a1c76cc8e5 - - -8a6466c371e807254cad642d6f3d50b5 -573b949f75c5a9f9f7b2c6d1f45cf175 -ba5ce4b6a48b32acfc7b42b719836cc8 - - -179eb7a9b3e9b67b01a36c8ffe84ce87 -0178ccd0294eac78322bcfb837883e9e -6a421190f518462e8f8bfc5f22da2b75 -fbd7c6eb7947061e1cdb26596aa97f7e -6347092f90b7e44ae61df59af8552bb1 -de30767cf0a5d454269ab9986fce13c0 -6f225dc643f02ed2509b857ca08a1695 -68633b9a396403744b2f3e762bbf5a19 -f1f34d8c0f864daa5e8ab56801027430 -f18bae68f60655dd11f792066b6d45a7 -d3a94f5738d82056ea2efafb91108df5 -512699b0027618a3031685da1faf9210 -1f319794fd0c473af4105da7eb800395 -af56ae8f3240a1cb51bf1a10154a81ab -ced606faf1fe20a17eb7862061f86f27 -87204bb4bc4b2de9530578fce343498a -f50022077f0dd202d6e2b9f04c9e12a5 -4507af4962ab9c28d54a18608feb7335 -5f93e31d32cd99d38e3d59c80b4137ff -240b11fcb5dcc2be6227a51c45701f86 -3e9db96fe72455a7dfe37afed01c3e7f -e078e6e155aeadfdbd41beaddcb80abe -3d553783df165b8fbf3ebee134c980dd -3cff0fca31b6bc15881e15137184a92e -f326d01ea1f9cb89d96aafdbf65dfcf7 -7353c73dcba6a3beb03620ccb68802b3 -d3967ecfab9f1069abf1d8a676c38719 -453381dde1a557931af6bf3d85c3f361 -8cc192424d2a8a3a8439cf6c9e9c866d -eb13c5e78c9fc9918ac64766171a967c -96580781af2e64271588ef6d49f05d89 -4ddf34ed8a507480b8e987e8a56a18b3 -9e04b2cd1b93f421705034d5206749d8 -d9e5975cb7abbf8cc23b9ae0909c1291 -1ca4e724a542dd90368a4612a878aa7a -c93c4c89173fc683504c599a41e8c128 -37c8cf292316d659b712e3e792776e3f -01edf46ab8cc0796e5dafd51f645d229 -b518752ccaeea156acb4450b5263c2ae -74f49c52ba746096316a8fabfdd197cb -86eba190302f1d2ffa2342cd0a181be0 -4b2f37e2efbc07cb96a3c17df7f132b4 -8ad7dc8c62da0c98fdac28dfda1db0da -b8c0a0b89f697b6e2cded307c88d06b1 -d303c8174006e885937802b900be3eb7 -a42be7db361dd5993f28868e4a3f358f -771c74b2230182471812f2cf4a5b63ee -33a07b8f1c6f7231f2a1e2d5c36dd79c -f67bbb49377ad41691a2560e5db59c8a -5615db79ede9dac702571bd948faf99b -7bc61a1f1daf334bc893dd1f0b05ca37 -14284138d5f94467eb25db3495ebd96d -b59cdee2b1ad7bcae09ae224faa8f858 -3122c8015a2583d254fbdead8e4fde52 - - -b92c9d0ade3690e8f665b0e20178cc62 -91dab87a0fb357d8d128e522314eacdb -67996c02cf0acd62a27207505b08ffef -99566b75c482deb67d4e470fb41769a1 -68c6243871fb84c1a39f341cf21e7822 - - -ca74892ab17898b5c68a005ec826680c -c3646e03f2df786dfa2ec31ee3ab80d2 -de0566221f5134a643eb1ee0e4e40d5a -8f06a045e1f9439c132eab7b0ec1013d -1baa54f74183b5589cc0eb4e19bab976 -a8174bf1f86230ba7afb78aad699c4e2 -b99f23c57218db693329dea5e53bdaca -c6aa5d300ad94789a9f2c4cabc6cd8de -cdfa3838283c176556fd986e1d077a37 -e9e437b0e54d0b0f215555a8a0aa3691 -d3fb1b726d230cd1d7bbf2f47d3e95cd -57c33544439cfabb45532ea670afb002 -06d37e1e8b0a905c10c67cfc352a3b41 -261d2325e97f1947dfa1715cba5d739a -7df666dbdfe89fcd5bd9547cbfb9b981 -d24bf4b9a4393542069015b77065f59d -607d3bb04543ec6ac54ca7fb097be17c -a8702e6efb19edbd4e34275d803b7ff0 -d819c152ecb177c120f1e3c9eaabc2c6 -7230de6d9826ad0e0877a1f4f86cc181 -c365dd9338d9be33d005483b108ed0f9 -fbb442be183b6171ba2aa760e37e2990 -e1161971bb06488cabe9066c8e827741 -672cbf05c892245a778a1478d6abf6e4 -f5e9da89cf45e535117232b359317405 -7353c73dcba6a3beb03620ccb68802b3 -aeeb81c897bd44557e92f5205eadf9c8 -61bfc817d2b654aaf31d48b07ba0fef3 -1d7a55d13ebc889af056ef71120d26ec -29340550ee1de8205f4ce8698f5b7401 -b64a703248595261d97b96416e8fe66b -1173ae5f768e9451b438fa9abe518d81 -737685ba123e361bbd63da12001d1853 -4155fad171a9e5ef17663b83b38b0400 -a631db566a79774fd71e1e4733990636 -9b0318dbcf0f27edb2511461b2bba071 -37c8cf292316d659b712e3e792776e3f -01edf46ab8cc0796e5dafd51f645d229 -071a3ee176d252b170c161a00272700e -59028d068b1ae9dfb8c12b1e005f607f -8619d6f678b5c35f529442dc6240d6f8 -2c3c0e44d963da70631ef5845245c361 -eff46a7ef7fe0f9948f9b1ccc306e52d -d3b1b0f4d1358656e7e2960e749fab1b -f1f41f8ed3c32b97e30ceb1a9f2de2a6 -a1314605a33f143e8730909f6688403c -5c8304d15cf5e937417b4a584e9b3760 -8dd366d96e74d9675892df3399191503 -ab35e946907310d95b8bfb3745604400 -6453cb1090676cad038531e097bb5389 -bbf6109af99a85f4492dd98a94a6f7b2 -6b5e849f3d43ef3fef1ac53d781febda -aefc559232e19c9b1c24aada36d13944 -0b789429faca1afa1608764e198e08a2 - - -16e1ea08ccc5c0175fe35a45c19a08dc -f5fa6dbb09ad1dd809a37ec0b63e8e75 -ca77e8f0feaba3291cf67e156b720b98 -fbd7c6eb7947061e1cdb26596aa97f7e -d0e18a85d792c8e18a7f4b26aa5b228c -2857f25afc99e3d86d2977087075989d -f9f034777e38a444b4bde55bc7e37b1f -262b3b0bc7533232290f81311955da86 -efb80873052a0acac270873400da3e43 -4945ef66c3f2e96f728cf01953d25417 -fab339dcb69a0b5f71fded661154ba34 -2e409823b76afae887f0cd1ef103f36b -0ad959ff84515eade55d80d902cdbae1 -1c6130fed29864cb803e50a64f57e8c1 -29a7d47016217cc8e5aff8639d494ca3 -c0c0cda5b564e56624844d49d7592502 -53369076a748560882abaa4a97e3d8c4 -fd96b4988a14b826d476b8b2682791e0 -5f93e31d32cd99d38e3d59c80b4137ff -458de02f34121d8ca3c60daf22aa32b4 -ccf43b38dc670c1a539500a2c0cb5dc0 -53a2102f21d7bf43ebab081a73feeeef -e1161971bb06488cabe9066c8e827741 -967d54ceed8feb8d6530eca8e47319e3 -f326d01ea1f9cb89d96aafdbf65dfcf7 -7353c73dcba6a3beb03620ccb68802b3 -c76d9c5a0a9f881bc29850458bd6461e -61bfc817d2b654aaf31d48b07ba0fef3 -71976afc3ec5e0f9c2e3711d8261e0b4 -2c739e0c5968cac73cc93286aa8dcd3b -bf4ec112c5d4979259e78a1af923da05 -bcdb462afead49580440751a345b2ba8 -223494e86e72306be4f941b847db565a -d9e5975cb7abbf8cc23b9ae0909c1291 -1ca4e724a542dd90368a4612a878aa7a -c93c4c89173fc683504c599a41e8c128 -37c8cf292316d659b712e3e792776e3f -01edf46ab8cc0796e5dafd51f645d229 -c948c70c2b4c8bb924a24cce7d4686f7 -6e1185d7c47c5a7dfee00cc6cf7d12c1 -8d43131041f3d3667982ff5fa6227d1d -734c487d6d93236287f3a0630d59e1d5 -40c351e5b7ca32e0a4e4dc2054a4803a -8fb29d938cdb4cc1ec38d55885c60bb5 -7079ebe8f20dc40ee9e54c78683fa429 -3d8ba71a2cf2af3c2a9e9bda1cba64e4 -91d0b66ebc6f53d0c6760225f33bc0ab -33a07b8f1c6f7231f2a1e2d5c36dd79c -db6ac20a78a21670a36ddcd802c9a82b -b3f56d6a2eb46826cd2562d084ddcddb -2fbda69e2a3f012225508714b51c0f89 -14284138d5f94467eb25db3495ebd96d -daa4f8a70b7e13c1991b8a9da448c68f -5dc4c70ab6811882ea50d20e2c4ea6e5 - - -3ae0051d35a74c5cb5c85db03ceca6a4 -841d4baad5be8f3de6dd7c9051b40c34 -75b6a084c92b49515b4fd151aa2c3c73 -6969d474da7d13c1434c89cf5c9c2838 -5d222f38a78007d686d4a1dc6f6f1afe -75ee81e361ace4b02e1e3568f0719ea3 -db18fa6d13acfd83d28575f83a3f395c -49bb3d81ae611eb1f8b7868143b2c6e0 -ccd8e25db8a9a768172fcd2e45b95162 -3766597a5f2202fad338cbe2d019a11c -354a5c3f51b7fde095f52ddc271d1763 -a023346e9b002262de3fae4567c18f88 -2439b6a6e9cfb796be84ea37c65a83cb -f6efdae4466869ca2012be4bf1e11784 -5928b7f32df60d1c2db504beb0f20137 -0d0f009398a7487d59b485e07c6fbc73 -f9ed7521031b29d6f4679bed14592fa2 -3aa3b3856de6dff4f1e55275a7c1ecc7 -0fc0876df57f7f77cc4ea959f60cde11 -eb50f3b26831ecc43b90fcd04bfcd511 -6d7e814cbda77b625ba63f4581d809f2 -d3626e710c760f03bdc31e17888c3c9e -39015974e9a1c6c4589591ae58a154d7 -06406c3ec4ebc8cb487ba4c093dbbf34 -32e21134466b972be3ac1268599f9b5a -a5affc357e84c82d0cb507e7d977faad -4f8f6c973355589eba3a090c3c8aec52 -ad72d84e7560d12210105da113b93784 -9cd23f8d97fddad9f3408b5d5152cdcf -0df1934283388fac3535b496754ae97c -19570912158afc8695c0f75def576275 -e74cb6bbfd2894743b0016a19a7a81ef -c33b70522a404b984b8ce226a6525842 -7194e924928c65375208da2a2f5792f3 -686ec6633c3b45fa9982eb392deabb4e -e982618b3c34e368a95fe2389ce416b4 -1ad93e8ff72d26fe0659a76922d853bc -4ad06a8887cc1743ee622fe28c03f87f -817e3122945ecefbc4ce8abe613858b3 -35bcd6995a2e4c081dc92502a88a5d4e -8343a78522b9582417fbbb8bbb41a7e5 -690a8b00f42150a94e4583a17975d1ca -3ebba88a951b29597da0b2b617e9d9ed -821ff4cdab2f33e5905258f8d211479f -9e236a10d22c8510bc2ef6b3da313f7a -f10e590fd9631bd90f850e78391b5787 -86c9af02e6afad6b682cab386e7ea8c9 -629375eed0f99fb51ed834a913fdf063 -4a32d7adcca55a80c1da9a8f6bd96b0c -88b1c47f0edec66b8868b6c6d8e43384 -3589f4ff07db11ba17067863e44af09b -ca230378c005d57c9f47107543615064 -2915a53bd07481deba02d6cd6f8b961c -fbd2774b2f969638051b2df47561fdd2 -578c7ef90ce4f50122f14d6630079c47 - - -c359b646b2d4d943a311927b568d046a -0178ccd0294eac78322bcfb837883e9e -6a421190f518462e8f8bfc5f22da2b75 -fbd7c6eb7947061e1cdb26596aa97f7e -f209f3bbc245afc75bf1fe1c2b74317f -de30767cf0a5d454269ab9986fce13c0 -c95d9dd5cdb6d9a6824a6bdbefb48531 -4e186ea8084c33de3fec3182f57150ec -f1f34d8c0f864daa5e8ab56801027430 -e9e437b0e54d0b0f215555a8a0aa3691 -d3a94f5738d82056ea2efafb91108df5 -512699b0027618a3031685da1faf9210 -1f319794fd0c473af4105da7eb800395 -af56ae8f3240a1cb51bf1a10154a81ab -7d5368b1bee0e7367f815ebdcb1ec139 -d976f528676688719bb4ed9da722c798 -f50022077f0dd202d6e2b9f04c9e12a5 -d4e3b60b743d6c642f6468c323814566 -5f93e31d32cd99d38e3d59c80b4137ff -240b11fcb5dcc2be6227a51c45701f86 -ccf43b38dc670c1a539500a2c0cb5dc0 -e078e6e155aeadfdbd41beaddcb80abe -e1161971bb06488cabe9066c8e827741 -3cff0fca31b6bc15881e15137184a92e -fb5913e34a812d5fdf9e25b8ca8c9fb2 -7353c73dcba6a3beb03620ccb68802b3 -e06f49e34ab23b7a238092f0949959f4 -61bfc817d2b654aaf31d48b07ba0fef3 -8cc192424d2a8a3a8439cf6c9e9c866d -2c739e0c5968cac73cc93286aa8dcd3b -96580781af2e64271588ef6d49f05d89 -4ddf34ed8a507480b8e987e8a56a18b3 -c3e50ad0d4c93692a2810e136ada70d7 -d9e5975cb7abbf8cc23b9ae0909c1291 -92ac14a3dd5307e6bc4429f625ac3f5b -c93c4c89173fc683504c599a41e8c128 -37c8cf292316d659b712e3e792776e3f -01edf46ab8cc0796e5dafd51f645d229 -b518752ccaeea156acb4450b5263c2ae -74f49c52ba746096316a8fabfdd197cb -8d43131041f3d3667982ff5fa6227d1d -4b2f37e2efbc07cb96a3c17df7f132b4 -e355739b38707e595924a2aae63d78d0 -b8c0a0b89f697b6e2cded307c88d06b1 -d303c8174006e885937802b900be3eb7 -681bb6760c742ae699ed900dca34241d -771c74b2230182471812f2cf4a5b63ee -33a07b8f1c6f7231f2a1e2d5c36dd79c -f67bbb49377ad41691a2560e5db59c8a -04dbf7922e7127a66b32ed38f7f57171 -eead927af63207df007d30bbefa0bb40 -14284138d5f94467eb25db3495ebd96d -a886ae14055bd6191498cf46e1e21848 -228b0316d26bdd36e56a9158eea64ef6 - - -a7f24d33406ebc61b7639babb8619186 -0178ccd0294eac78322bcfb837883e9e -6a421190f518462e8f8bfc5f22da2b75 -fbd7c6eb7947061e1cdb26596aa97f7e -b9d6e13e227b0cd7b338e5fc10d8e605 -de30767cf0a5d454269ab9986fce13c0 -5b30fbe3329f2544372a731e50272392 -309215b54637ec841c73ad9cb60c92c2 -5e857db1c2b2f3c5b49fd68ef1fbad23 -e9e437b0e54d0b0f215555a8a0aa3691 -65a6eb25bc54efb008b3c590a39581f3 -c631e13dca383449727f5406a9840e3f -b5da502be0ba50ad0f30c4596d98177b -af56ae8f3240a1cb51bf1a10154a81ab -7d5368b1bee0e7367f815ebdcb1ec139 -87204bb4bc4b2de9530578fce343498a -70a55b87918d801a8018d6aaabf25490 -44a8855614544c8c15c9ff7b6bd20690 -5f93e31d32cd99d38e3d59c80b4137ff -ab15fe0f61f91e8805b18506f044936f -ccf43b38dc670c1a539500a2c0cb5dc0 -e078e6e155aeadfdbd41beaddcb80abe -e1161971bb06488cabe9066c8e827741 -3cff0fca31b6bc15881e15137184a92e -f326d01ea1f9cb89d96aafdbf65dfcf7 -7353c73dcba6a3beb03620ccb68802b3 -826390c0c8bb5b74e4d7752f777e5ab0 -61bfc817d2b654aaf31d48b07ba0fef3 -3c262e53abae368513df941815512cac -2c739e0c5968cac73cc93286aa8dcd3b -96580781af2e64271588ef6d49f05d89 -4ddf34ed8a507480b8e987e8a56a18b3 -9e04b2cd1b93f421705034d5206749d8 -d9e5975cb7abbf8cc23b9ae0909c1291 -1ca4e724a542dd90368a4612a878aa7a -57be7323a4ec7d4c1cca87ee723d33a3 -37c8cf292316d659b712e3e792776e3f -01edf46ab8cc0796e5dafd51f645d229 -492f5f2477e6f0e03e3f6e9c8ae965fb -74f49c52ba746096316a8fabfdd197cb -8d43131041f3d3667982ff5fa6227d1d -4b2f37e2efbc07cb96a3c17df7f132b4 -4d321f312bd44b67152064696a58ad8d -0c4087fc445c8446d20ae55d2e51f269 -d303c8174006e885937802b900be3eb7 -a42be7db361dd5993f28868e4a3f358f -771c74b2230182471812f2cf4a5b63ee -33a07b8f1c6f7231f2a1e2d5c36dd79c -411334c8b92ac56b78d9c26a64c6977d -a75b3f1ae8c368d2284a5b61ce2ade70 -7bc61a1f1daf334bc893dd1f0b05ca37 -14284138d5f94467eb25db3495ebd96d -e986bc80c8b91cfe802bbbaeeafcf8e9 -3122c8015a2583d254fbdead8e4fde52 - - -d27472f5adfab0a1bc7265aba3535046 -4f7d780a21c597470d534dd0172b7f06 -6b865a60dab5e0cb1e49ac13e6e94b66 -43f5b491c84e1930aad9905708a4d294 -94650657c28678a9af723da999195a1e -bde1ccc10056a34c0c2c33b4909bd33e -d5f04bbafc19b4c2ca7df2bbd29c44d3 -3533fdfc61408e851bdb68653ea870f0 -6c1987133f9ff41562c17276f703beda -e34d4805ac8549ee9db28012c671bf8f -59c8a8cfce22f05267fc3a23a5a1438e -8700c93b2fbd9b9253c933ab44c5cb40 -11d062615e92ec655d17e5c569da8301 -6df80db36a8139ab065ff313f8904e0e -2abbf6168bc4fd809a7e773db8ee2b1b -94bb9cad9889690d55670af89e832ee8 -3d34aa8e561ca7f64372272f16e24403 -ed7500c42c6ee6f2a4f8bd36aa6bc42b -64d4f3497d67b4e8da246b865501955a -f35be93ec2bf38821ab07d1d117e382e -74e42985dec595aa8c7c25c2681669ad -7610c304b9736f8f8ec09d1e08b26614 -97cc211d1f644d84b1c64d80857830fc -bdcac13d704caed565435868f2fd8132 -ac3af87ad173e577196c12e2fbc6eeb9 -c36fa900ef2e082506bccd1fa51eed31 -eabaeb9f00ac6dbb94f27cc702b8048e -6e5dadac3fd4d20d8dca800b686a8d51 -04116a7f8e902da1f3391a34649ccf5f -ed906322b4edfef7d01d7a60df295e29 -0003ea4f9dff322501b983baa95d1552 -4681f0150b8cd3b70326d2402b157dd3 -179fb835c4f72373484a106ee4d0ca09 -8528fed3a7fc90688590a041ae575e71 -3ab25479398b7ddda72e2f2094b5a453 -4e43d75a564806a4ed447b4e738e363c -b43766d46c0c896da22215c352d0620c -bf21df5e0b05b24a5a564e5e5e60ead1 -cfe01c3aab920e7a22ba49b52d240bb5 -f5cd3678ffaa97ffd79f44ecf11c77b1 -e1f6580b93af6040addf448b40de21c7 -3e4f3f70b46a284afca9c9abdb9cda83 -5bfd4193bfb0fcdd301fb1a918af7f90 -1364dbd1bc08297b25d2d77861ad997c -9794247d9b70ca2a7154bdd109b6a0b4 -3080ff9fdb247eaf98b234710abdc34b -3b9eebe3fa01da100d1813d7172e5870 -41079c0dfcb430b62e712ef426ab0d66 -35986421f26e7fe9263aa1a0220b8a41 -ed6377ae8b66973d58346a732d642efe -4764ffa4f88e609a9404cb6a2e6beb5f -030c1ea07719cd702afc5d57b7f7046d -787fbba1342ba6717ceaec14156296f9 -8f8b08ea0127e8dd80c06c9e79896a61 - - -e5b06e3d2ea500886c0e1b93907cca80 -d59b4be8bc285c485b30ebe26419f5f5 -9251990a3d21e9764cac81f97b85f831 -49f825806b792e6d4c75ab71f8d2fe11 -58c44a16d972b5b1687fdcaa0c7ccdf6 -23e7a74a7165a4bca479847a51071481 -17645bfcf4473c061cffa6613cc4626f -3caeaa1071c0c238662aa44dd4e6ba7b -2a02d65f7ee53f1a006212dd415343c4 -ff434c70f1b072c13160abaed4d503aa -f79c0f4ec8c808361ddc39924fdcf473 -5ad579a54f61113cb76d3a2c98c58eea -594feb74a790cecb9c63f791c290f6ed -51b9b2a06a86026aaef9c6bf2d79bbe9 -182e51c2471f09d5e8502c7f48796609 -007da2b3bc701f7be0efb50a99d72e98 -f039c2bb1d9fce227fc031541016023c -dcaa8d33715dabe9d5e7e9e4e29f7220 -1099de7c892403a38bcb3f388002b114 -3c59f80b529af5d858d5a28fd4c19fed -b606626772d975583387a52738c5ad41 -f9b9690bbb9436afd6265a51070fcc28 -b4dc1d5d3383cd97553fd3ba3df420b5 -4033036004878a7ff0b93ff30f114d18 -df6baaf86ed9f3d0e4b94c391d77f33f -d3988891f5f080e84de28bbfde083477 -cfc224a2681d691700e034776fac540c -85a1049ea3a1c1cefeea47a8315aa0e9 -641f630490eb384acbc5e03e4cac55ae -54eae8fdb336ae9c5f8456ee891b9d37 -59c564b68ae5724f0b034477b9bcd810 -7c327e24c882a9f62801df1e6ca833b9 -ac16b396be4bae4e72ddb087f590c2e2 -6c8c352a8cce688009449a8997549f73 -0bd9d42b67a73a9b4df222e4245a5fcc -29cc6daa29c5cf64fef17c44cfe84ff0 -ceba8c6ff078ab8eb79134c5fbdf1ecf -5c0ef00ef8f8f6023887a5d0fe062f9d -1f362adf76ff1be15effe58fd7dd23ee -461a5138bc27360b53f04d76fe77e071 -90f285e93cc4545f6ec0b882b6d16876 -3dd9452258ee6d6db29a4d653e502c0e -05baaeb7f6a9a1a00e3ad00bbdd9bbfa -42b451988b89e38bca9280f37ef8289e -d518bdbabdb9716f6f4c4945c81dc756 -9f887891e44e6ccd4160a5863c49cc26 -82261a40fa775e22e0e0f09fffc7e05f -3a12d437c6ae223220dfc2ef376fc600 -7c991fe976d4f6c8aa4339b2e335e9a9 -ac8ee0077317269e528200e0d3bcd579 -bcb7d212efff9d2f016db69793c8fa33 -5bf202e3d88a7efec5e540ed70ad384a -13152996538ab4d39e72e31e1c589281 -a14311660639a521042796c468a23b1d - - -b5e59a83744fd6b618f56ba398af7288 -c59f3755e493691ef602a83c33b749d1 -f267c0803d9bd649f0867e503e6cb4d5 -4f4326d61f48fca9ece148e741ab4573 -e8ee6b053bbd5aeb5c73f0d49e8a81b3 -157b00e3ede4a493aff1ee281c57cb17 -00c1fa26858fa3699d6e0e6d0d2d0c4a -b58d52a68ccd700ad9669ff69b689fbc -607480487eb63befbc75dc76b3db9c9b -e9e437b0e54d0b0f215555a8a0aa3691 -986d2852e5149b2b475ea70913de9018 -523e539d7242fad6681e8cfb120812e3 -d11d7858db5d484357f8379a1ad0d63a -c2194cfa2ffaf90941c5505f7a35f56c -49cf499aa1827de76f99e14d7db477ec -ef3b8f2d379827209d56fbacb1dd0292 -e75fdc0f1d392ba538950d95f849166d -d703cb45af3d0c1b05eb12d775a2c1a2 -4b64a670806426b390dd182edfa2a814 -6e88ba6789c07fc00539e1d1027c8d08 -c41c16df906f1c562668a31eb50d0189 -5f25e3e848fe4b7db3a78311e8e97d89 -e1161971bb06488cabe9066c8e827741 -eff13dadfd141a3c39f6f1c558c72744 -3f924c148e0c0f512570e1a1c65d81bf -7353c73dcba6a3beb03620ccb68802b3 -7032305dcef35175038a6154c5376397 -61bfc817d2b654aaf31d48b07ba0fef3 -4d96011de54501b073ca0dc8543778ff -8c19cd415be1cf3e116abfa2ece382cd -7c489cdd73ebbe5eee8df7439c784a8e -4fc36e29e91b8151b0a6df85a002cd44 -b67ea1d6fd056e1eaab59fa8e242ec78 -1ad370429518054b68f0a9135e85293c -f57bf287027019026530e37db01d2b54 -4c5bec2e65c96210db6812e599c41bea -37c8cf292316d659b712e3e792776e3f -01edf46ab8cc0796e5dafd51f645d229 -c26f82669624e77cd4196ca984968b99 -85d01a283866ab0b3ff0cd7011b60507 -64ef3f97f9d75128dda5890fbcdd8447 -7802216fdd2b92c025ff2aa060aac7ee -d475e320b2b96e82ea417775a87177c0 -ce68fb04a64bcd388c2e4a803ae33baa -ab0e27fd617e0d3ebfee018778d3b77e -db53803710393c0486f2e99c7029bfca -c89db1920e33b2523dd10f6ec41b8492 -ae27eea987dd7161bf121f48f7b86fb4 -73c145a746d2ef2ebf86d803b65a4ba2 -aeea2fc1ca5e921e080a6864d58be098 -5ffb6a54b7cb00a3b3094b84c0d76053 -c168417448d16dbcc16ff7cc29367c9a -b0f5c4ce40cfd36ebd5b8d7789caffd0 -0e1a650c3666abf86528bfd3562aa763 - - -85086256e7de8ee29545bcd5c1063a55 -c6b98844e586d53b8f9a4b5c7cc05399 -ed92d742de3415fde0de3efc2b84e990 -53660a54f13d65683276b89655b93493 -7e99379d64b67784419dbe4472109e8a -831a02dc86edbefea1c6c98d810254b2 -82a6941cc4dc14b88f1053af0b499e4e -4a208b83b250a5fa06add548e5f4675f -8db88368767449b61ad48b02ca40d8b2 -f8c35e3878a1834751fd9ceaf8e6bb7d -d2a16e475bb3d3501ca097eccf16f3f5 -5e5684f776f1a7354578715682f38651 -b5ecca54092aecafd5a65dc0d95b9739 -420760f1972b026edca932195d6528de -f47f15a53c307b7b6b14ce44989bc3e6 -e5dabc12813a485062ab5b77b5426679 -1fac7e50ce5772a8edf909ab13f18ef0 -c1f61d4c7d7ddbfd6d0c3e00dfa7c91d -fedf292cca2809a18d78f474c1334447 -8f869a6b5f96d3638f00d087f9b1f2ee -5695f95ab75430e71ca7e91b1d4a7993 -59addea31dca998c1b712c1ed87d3f9d -5707af36b38fd6a63cc64e6852320ac9 -5a8e27edd39a5d187e866ab28240d571 -0f4cabd5c702824c0432a5b16dedf3ef -ece14744728e3aacfd919b616af33e13 -af3e9d69a4cf87a7fc578c4982f62a33 -48774123b922c982e9db9735f78cb033 -13ea1e3d78db1beb3e50c8af9a08ab29 -616c29b85368aae480120bb30455f2e8 -428baf81a8ef213be49b3f9096a78fbb -dcd4b0caa14caf886102e9aca04e8b7b -467604093e3127dfaa5690fc4497f4a3 -f02aa204b8f08a2b24b5259e84d3ab65 -8da8b58b041069c238c92cc6f7a25377 -f77f8d163b2e86cac266899dacaa9a9a -10d13de263c10784da8c24dbe9f58a1a -b1d9c0b57b93cd0b5584fab53a6c227d -705804045c7055bb142911f56140b36d - - -5f5e1f71ef91392a3edee6cdf5e03408 -0178ccd0294eac78322bcfb837883e9e -6a421190f518462e8f8bfc5f22da2b75 -fbd7c6eb7947061e1cdb26596aa97f7e -4865ab7e4d789a51075d4f780c3674ea -de30767cf0a5d454269ab9986fce13c0 -59b195fcff4d3877045fee21c364d524 -6448daf1b06217c7dc989bed6f3709a2 -f1f34d8c0f864daa5e8ab56801027430 -e9e437b0e54d0b0f215555a8a0aa3691 -d3a94f5738d82056ea2efafb91108df5 -512699b0027618a3031685da1faf9210 -ef12ff29adae2685e120e58aa04e23bc -af56ae8f3240a1cb51bf1a10154a81ab -7d5368b1bee0e7367f815ebdcb1ec139 -d976f528676688719bb4ed9da722c798 -6ec9a9a11b06059192bcf4a71a34dd22 -58fe7c897e58dee622ad01cb30a4d6a1 -5f93e31d32cd99d38e3d59c80b4137ff -240b11fcb5dcc2be6227a51c45701f86 -ccf43b38dc670c1a539500a2c0cb5dc0 -e078e6e155aeadfdbd41beaddcb80abe -e1161971bb06488cabe9066c8e827741 -3cff0fca31b6bc15881e15137184a92e -fb5913e34a812d5fdf9e25b8ca8c9fb2 -7353c73dcba6a3beb03620ccb68802b3 -e06f49e34ab23b7a238092f0949959f4 -a171ba167ab22bbfd25e570f28bd8483 -8cc192424d2a8a3a8439cf6c9e9c866d -2c739e0c5968cac73cc93286aa8dcd3b -96580781af2e64271588ef6d49f05d89 -4ddf34ed8a507480b8e987e8a56a18b3 -c3e50ad0d4c93692a2810e136ada70d7 -d9e5975cb7abbf8cc23b9ae0909c1291 -92ac14a3dd5307e6bc4429f625ac3f5b -c93c4c89173fc683504c599a41e8c128 -37c8cf292316d659b712e3e792776e3f -01edf46ab8cc0796e5dafd51f645d229 -b518752ccaeea156acb4450b5263c2ae -74f49c52ba746096316a8fabfdd197cb -8d43131041f3d3667982ff5fa6227d1d -4b2f37e2efbc07cb96a3c17df7f132b4 -51a8ed92619d4857e0eaddd369a14b38 -b8c0a0b89f697b6e2cded307c88d06b1 -c9432581cb013f3ef7310de9ce213beb -681bb6760c742ae699ed900dca34241d -771c74b2230182471812f2cf4a5b63ee -33a07b8f1c6f7231f2a1e2d5c36dd79c -f67bbb49377ad41691a2560e5db59c8a -76fca7d3f096bd5736ad5130e020c137 -eead927af63207df007d30bbefa0bb40 -14284138d5f94467eb25db3495ebd96d -a886ae14055bd6191498cf46e1e21848 -228b0316d26bdd36e56a9158eea64ef6 - - -fdcbf9eb91ebef8c251c7ae7d0f74b18 -ca46a3b415ed7087ebd20ea11c9a376e -715fe9569ea1c14a9429bda25614cb8c -684ecc4df76ea5f854393b91fc97d51a -5469cbf0a4979c5748c7cb74336b61d2 -3d8c8b3c771ab778c0b6a80b94b0116d - - -274fb8aa5310894da8490379c70106d7 -3c39d19275ebc7bc7be1f9e4a89d04fa -bb803131fe2e0f7cf009fb1dca6c4a64 -76925cfb76c182fad1b21250e61f0fb4 - - -5f5e1f71ef91392a3edee6cdf5e03408 -0178ccd0294eac78322bcfb837883e9e -6a421190f518462e8f8bfc5f22da2b75 -fbd7c6eb7947061e1cdb26596aa97f7e -f209f3bbc245afc75bf1fe1c2b74317f -de30767cf0a5d454269ab9986fce13c0 -c95d9dd5cdb6d9a6824a6bdbefb48531 -4e186ea8084c33de3fec3182f57150ec -f1f34d8c0f864daa5e8ab56801027430 -e9e437b0e54d0b0f215555a8a0aa3691 -d3a94f5738d82056ea2efafb91108df5 -512699b0027618a3031685da1faf9210 -1f319794fd0c473af4105da7eb800395 -af56ae8f3240a1cb51bf1a10154a81ab -7d5368b1bee0e7367f815ebdcb1ec139 -d976f528676688719bb4ed9da722c798 -f50022077f0dd202d6e2b9f04c9e12a5 -9d20165c7fee59c3454f8e883776147a -5f93e31d32cd99d38e3d59c80b4137ff -240b11fcb5dcc2be6227a51c45701f86 -ccf43b38dc670c1a539500a2c0cb5dc0 -e078e6e155aeadfdbd41beaddcb80abe -e1161971bb06488cabe9066c8e827741 -3cff0fca31b6bc15881e15137184a92e -fb5913e34a812d5fdf9e25b8ca8c9fb2 -7353c73dcba6a3beb03620ccb68802b3 -e06f49e34ab23b7a238092f0949959f4 -61bfc817d2b654aaf31d48b07ba0fef3 -8cc192424d2a8a3a8439cf6c9e9c866d -2c739e0c5968cac73cc93286aa8dcd3b -96580781af2e64271588ef6d49f05d89 -4ddf34ed8a507480b8e987e8a56a18b3 -c3e50ad0d4c93692a2810e136ada70d7 -d9e5975cb7abbf8cc23b9ae0909c1291 -92ac14a3dd5307e6bc4429f625ac3f5b -c93c4c89173fc683504c599a41e8c128 -37c8cf292316d659b712e3e792776e3f -01edf46ab8cc0796e5dafd51f645d229 -b518752ccaeea156acb4450b5263c2ae -74f49c52ba746096316a8fabfdd197cb -8d43131041f3d3667982ff5fa6227d1d -4b2f37e2efbc07cb96a3c17df7f132b4 -e355739b38707e595924a2aae63d78d0 -b8c0a0b89f697b6e2cded307c88d06b1 -d303c8174006e885937802b900be3eb7 -681bb6760c742ae699ed900dca34241d -771c74b2230182471812f2cf4a5b63ee -33a07b8f1c6f7231f2a1e2d5c36dd79c -f67bbb49377ad41691a2560e5db59c8a -76fca7d3f096bd5736ad5130e020c137 -eead927af63207df007d30bbefa0bb40 -14284138d5f94467eb25db3495ebd96d -a886ae14055bd6191498cf46e1e21848 -228b0316d26bdd36e56a9158eea64ef6 - - -6e9a688096ef98348c81a27d4a79f1e0 -af5b09289e634577a1a228725bfa6855 -6b68f856bb848eecbabf671c034a55c2 -d0a6b786bd6f4089500e5ce4b5823164 -4c8b9a119834f5802ac02f8bab914bf3 -f8b7c904f5476cf5519f9c87f9bde6b5 -2a2a453e6e536c61788f5ca14441925f -974acfa15f73f607a0f4c34cc5f54b43 -f8f33045b76d228fbbd1f3431fa3779f - - -49575eaa463695e2b9d36d0d7178a896 -ec8ce242fd76f4d419233b1e4c65b745 -7ee6b855402c106e4146e44756df80e7 -ee353097d2121cc7e1f36e2402c4af90 -1976cf87682a67b3a453046f78f8d732 -dfb9f3894a8d4eedd5269461ba73b613 -abffa393ae08d5867b30e2b23c686fae -e2590b64c46acd99b18bf01068bda97f -ef990f1dec41193b1367ff9ff985ca67 -e9e437b0e54d0b0f215555a8a0aa3691 -36356b34b3a725cca161313bac3c80be -f521a4107e74b62b2d21e97ee0dafb1a -aaab56c70c755b321ce63742ea8b5e76 -3f0d25c580c941efa2d6554fd021fe96 -1eed84901b495303c7482256c682657b -54ee3269dc7dc1a5ad6b8e105b6d1c4a -8571969137be464407ffa873bd78fae8 -f2b4c6e82c9efb8a67e74092b5b74d59 -5f249fd236d741add5cd1989e73a179e -340206e2f1b9e16a1dc49a34202ddd80 -0491956cb19671a286fe68771007f214 -f81fffc1c919c91ec4fbd998ad571989 -e1161971bb06488cabe9066c8e827741 -263b5ec14e9dec310d47f6771793a630 -f326d01ea1f9cb89d96aafdbf65dfcf7 -7353c73dcba6a3beb03620ccb68802b3 -0ef4172aafe603bdbc2fb7697d41ef36 -61bfc817d2b654aaf31d48b07ba0fef3 -14de703774957e32462615ce075e168a -d70d3a1c5809439c71ada51f48958982 -39fc2d8ae07cc976e812b7d3b2b9c7ff -ccb9fc97d797d909a93b2a50c2fcb5c5 -150ef0a3188079477ca03d406201c48b -0e382fcdcf4ffc8c497b6e40e4c98a61 -30af1f1daa6808bc69afab5eef6d8777 -f69fac9e16153c3acb8fa4888e9f46e4 -37c8cf292316d659b712e3e792776e3f -01edf46ab8cc0796e5dafd51f645d229 -752ff849b3e642a30370371a37e414e4 -4769da6e55bbc8678f19dc1b68dfdada -683506bfc5c86f0014878d8e904c73a2 -2b8fe3b9befd458de64b2be818fb038a -62935f9a39e2525b3e434a981830f02a -312190f506e4a6bfb54edf83c627d70f -3e36b1655686b8aadef324aeb474da8e -d4a4ee924ffb170772d19d8fb868d8b5 -0764f4330a3ab8d489776e2dc48d58f2 -07001ab0c611e2dff9fc99882b4d465e -e457aaed656cd73521f6134f1a50c7ab -c8f4a5753f271bfbcd5d1c7684cf7a51 -369a11697afc5fc08c9d9a119312befc -ff657da941a0ac497a561afdd1deb932 -8bc082b237308b341b106e8ec4b2b074 -d7076d1ba0b16124aa157994fdb7ec3e - - -faa2995204f2d7fa690071468d5cca0b -30146d788fb36f38cf9bb7c9cc2fa45a -ebd2cc37ecf6d07bcf09d8be25a54cb6 -f73b1da5514876526feca98957b769a0 -42d457fdac3acd77c0a324361820c298 -a6a7e62112de7f893f377bf4d5cc7ae3 -94071a967896cb76ec03034a3c0021bc -b15ae44116433535141362a3b730b45f -cc7cb55fcd10093b51653f527584159b -e9e437b0e54d0b0f215555a8a0aa3691 -7edc2579a44cf11a6590b6a56de20751 -ef16cb08bd0f3ad2c442ce05a55328a3 -626a134bad2e9f8a862220c32e2ab416 -7575aaa5cb1c801db431e3d7d6b4446f -66553924d038ec668ca5b46d255e7e0a -abdc5b264864f9054c2bd3582aa7f290 -2ef522d6cc1c739ac79ed1a20ba843c9 -8f10ac953936bc4623f3d41580bf8473 -bba14bbbda547b0bd1750fc47d66193a -639806e9dccf7a901582d3909a16c68a -8d88a14352d5c7b05f212dbec4eb1f25 -8e49cc0daead5830960facb5ea2b5281 -e1161971bb06488cabe9066c8e827741 -0e9467229e826166f553c1274746cfac -9bc9627697f6507eaac340ce462ea48f -7353c73dcba6a3beb03620ccb68802b3 -4df936634ee1c5ac60537708419854c2 -61bfc817d2b654aaf31d48b07ba0fef3 -4c3b11586abcc5df7e395609ee7131be -72ab7f6acfbe2a0482f1815b71969222 -d6463f576eb9b6827cb151c7ab651790 -a3b41a323ed11ea41894550e79a6198d -36d8c10a2ce5713bc959bebc6b9bb3af -36d3538ff1c7f12c2bb0a4d9d102e0f6 -93d774d6b836aefe17651d661cb94ee4 -28073f574e86f78328641803546c28b1 -37c8cf292316d659b712e3e792776e3f -01edf46ab8cc0796e5dafd51f645d229 -277b0af8103ac5f600cf95f5d525cf8c -af05a1fe3715626ba296c555d800b2a6 -72250ac3aec56486761a3340d5c292de -55524e29fcf3ea59269779097753c3ae -c9d5cadd5b283418c5aa85203a74aa2b -6f51fc0d3af07819e5829d6ad6e02d04 -bca0b3e6712fa4c12923b2fb07e3f46b -97af8c6ef82a0f244fc815e6e16ccf90 -20bc209548a48b3c27a03ca806196327 -0cf82703e6c6d783ea91a4605ac528db -34e1c37fb13396cfd00099eb82a819cd -e5dd6b1b358e3272090f1048086a5bc6 -171adcd57eecc43d8ebea5bd3cff21dc -c98de14aa386285d059b14a65f94277e -e550661f181c2a1cf9f1a6717942e90d -45bc4e783f1c8f3b4cc8887ff320ac8a - - -f40a6855e6a861fd2c7c004c9b290385 -f8357aebb6d24dfc870ddb4ef63d4fa1 -a34b020fae75857b35e82c53197e38aa -7099bf85294f531cbdb56a95961492c3 -b7cbb01f27803c44288d26309ca45973 -fba9860bfbcea0b33d10f393420e321b -e3a663c28cda435414f95b1683b36d3e -306523293000765d47944a1d49176227 -96c57fcb231c8ac82ea65c0892a50555 -e9e437b0e54d0b0f215555a8a0aa3691 -ef35a51a63a765e705cb8fe6f1310c2f -ae1696c13871513322a5f7a37ef7d5cf -24e906c5c641996285edfd8abb40322a -e0d0388f6ee033647320ede72dc63735 -67a9145e62cf896181712572df065399 -49070aa4eba7e3e1b439d12caaee9952 -919cdebea5c5ffd230928fa9179e1bc2 -4b8761f12f4c432c76612805b6b1b17e -a0057248da365d8652f6b193da290302 -3f4209e34d83edd797e1a29e728f1036 -cbdaabcf63b8933cc42e87eabd8e6e4d -d626f61d727893fdaf13395d3bf09e45 -e1161971bb06488cabe9066c8e827741 -d48e0ff7d0b3984e9c748dce29cab113 -f326d01ea1f9cb89d96aafdbf65dfcf7 -7353c73dcba6a3beb03620ccb68802b3 -154030ecf6da9733e3995f8ea18b3b01 -61bfc817d2b654aaf31d48b07ba0fef3 -dd0c0d28fc4a2ed9db92b4ba84a9a561 -9288a4a00a32c0bbbd2528519b70d804 -5225a59901d5398e50a3d02f04c7186c -0b5f02a9d656a87180e6392953396221 -632d62425fd80b2ae185fb09da005b35 -384edeff0560731bea7d71b6f7fee1a9 -cd19eae6497fdab036c304d1de48166f -7664370ef500a0b5cb2e25175318d095 -37c8cf292316d659b712e3e792776e3f -01edf46ab8cc0796e5dafd51f645d229 -3c8d1e8787ff0b765064e1a27a8ee940 -b033a2d3037fe189c5d6310c5f7d9836 -21ba353a9e2fafbe322df761ee7e3b0a -787b405c8c6d3946a464df04ba694797 -4c3fe05f72b2d8c24f241ea8d3ad9731 -7e672998211ec6468729ab0a25949c4e -ea939cefa5cb4f9153c0c089ea14bf6f -83fef6c66e36ad20cb4fe764f9f68e06 -b1f6b28b2f8d338fe2e71589dd12103c -61320ada24d1eaf2d249bf2b3ee5c092 -fbe0cfed6c15897baaeb745edd13a26a -ce741d03c6fd771179281dbfa14d39b3 -effb241913bf2477516477291789d0d7 -23b283c2a11223316c1b2d99e13a03bd -6ef4ac33fb4a6784e63e5570ff94ba35 -62412b0b947b92addce88be9b0d465c1 - - -2812e35079d5b3152e9af32c87abeaf0 -e2e02df3d70ee069610c91c01b58f9fd -e4db6e579229e5a09187cf34ba3b680d -6200232eb997d2423b448f01886b2cd6 -9404a8ad606c742d450d0e6453cb89e4 -480649eb32df3e359b5d0ee343afbfcd -607e87ee590ab6b6e3c1f2017f310bb9 -6c85e1b7c3071b7b02ffc45894c49d19 -69fb85ac30660331b5ac561d1a885d0b -e9e437b0e54d0b0f215555a8a0aa3691 -095369f2251e8e55e7145aad26dadc0e -0a5d03d3353fb41864eb8e4d54626624 -abb2167a9ce243f9e99fe3fb51235fda -c9ddcd58c067a81cb797a22327eb9e9d -d68cb120db7b4a19e062207fa08ede7a -12ce44e31ac8915d825d317ae75ade29 -dc0832a7958eaae7cf4e423bc578f3a6 -4ed0ef2836195c941d69077c1441f060 -fc591b6dcf00663001336aeb2459e123 -4af0397309a414beb84a05a21fe963bd -f8e129f6639f1438ec6f104cd0fbd19b -a26efc9340e9d49d7cb1e77bf5209503 -3418d50e2adfabf40c3272735e88bb53 -3d2827f1743d8cb221924c2d3fb10c83 -a72a089766a7cf669f6b68270ce8f5ab -2c24fce2ded9cac44faf21c4b92f4d20 -7de0af0a42df53860e39ecb7ddcdd750 -61bfc817d2b654aaf31d48b07ba0fef3 -4900f43900b2677888e3f7ec9a376c99 -0f3be298d7900f5de3c59f71e8e139dd -f36f7f708ea209d9b74902e9a4035cdf -9e66d8ed4aed4cd0232745d064fb5877 -59c457c3403be06b525dd7b8c427701b -4bf9745278c2144f2fbf7068266329aa -0f18fd5af1f9ce788f5053e652842feb -08104b039c63219c3d9cc87e3a9c50f4 -37c8cf292316d659b712e3e792776e3f -01edf46ab8cc0796e5dafd51f645d229 -51028eb63c941a363212d26304482443 -dcda1481b5c89ed0fd1f7628b8e8eb12 -593254c67ac4f2a951b747b973f2f9ce -4e84d5946737440c459dda7fb3de8cd1 -a3a0d19574f8e53491fbf4f43dd16783 -fc93c901c2f354acecee3df36e4183ac -f3ad2a89b6c2467b1e40c0b8f21174f7 -5bb64010fefff4ea7f80e1ab6a6e0122 -0dbf0ef8aa513a98ac57db52cf1e8475 -889559e9ea97f65ce01b88af64a35834 -908393b9498ca852b3ff2bcd7b51fb7b -83e0a56fd0474c5f74abe04d97fab566 -7952397f4d6f94f800d8c6d06b4067e7 -047c5ce175245236274011b316991875 -2feb47d5971e591c7c7bec5c73375f9c -9c8629c3110dac7a00b21c554e869282 - - -639e1e59ea49f8f9b1bff40cf3404c64 -1b77a01be8677a6f6c86911225f42fdd -0329d5abe59198c1d8786f3fd7820846 -6e96bbf2b6474ccf323e4af3dbb91d83 -5704fbd24a98790ea0d56b4cb443391b -452c2f46a752ae7039d79e525adca108 - - -ce4878e523819bdbf53429123e7f815e -a2ff8b3df32118f73d1878f0a2f33593 -4d3b7e70e7f32db67b1311349d689790 -bf0a23492645c5a983f7c71f63b786ef -7b1ec84ee854edb251afec2f1489d472 -06a8fc6223f19856aba6e4493637d558 -b86122de22bca131f7b1e591d0ad05d9 -d9f0c52c0880cd2a167ea745276e7d34 -fb318dd514da9a7e91e4835a22a8b317 -a2335b6d52059adb0365213a82258ee1 -b4f1dc4050b120ad1e3562da7afd2b92 -8653d9e0bb13430d74e1ef13d4fbba93 -42a0dd9c730f89c8010010a1d33dd8f5 -fe3477177a63330945e4ead28104e233 -be4b41ade8443d0112aadf0582fe32d3 -0c3ea1ed6f3bef86e72457af9d477b22 -8cb74c863279160fa7b15339ec07d66a -c89654c4082766e7c7d308041a45cd48 -5a6bb3c42b5a0bec8c86824f1975083c -8c61ec84093ef3496503ff1b87698eea -120cb4111496c69e8fc17c9c2d62e159 -c3814a0c44395ccb7a7fa8bc1cc93abd -2d07e3dc90596e3bf5815017b9fef1cd -ce952abcea808bc4f982b15535585072 -f89420ea2cea158b44d851d13331691b -f10cedbccc9475f55d46269a683f0cf4 -84cd94b454769667780d7673b5341c0a -aaca3f24307cee9df9b59a953020be18 -354a01f32d385c5166d852822ad9d471 -d840896ede7dff5e0b188cf1d3a142ff -00269fc24641e5d36d70c5c8ef6fc209 -d771da5dcb9da1876af5589f8a2086a9 -cf956add0c79021627f8d296bd9c0bee -35d7a670fd58b89b1927a524bd74357d -abeec7cab968b8b816c16b0dea5dd6df -f4c518a2e831d32a20311eded74ebfa7 -1c203659d8fbe2117d8da349a757ad8e -d521ffdfdc56b7df468651c6f93b1aa3 -c66dd0f9f630f411f524d9afadd6fe55 -1839a9a8d5acb647fecd736164218fd8 -7114d694d059d0f7eb949d83012e4ec3 -a920d82f372b341e3ce9b736ff9711cd -88a03a09be0856616b2f86faa08aef5e -10699a4b525332caf77fd70a75f92785 -f5f62c73ed9e39ce256471120746468b -8cd714c35a68b56c9190c03579baf70b -4bab6c6dbe6dba72eea63344b1b725fa -db649236b72d5c78d95b5730dcec549e -b5cf52bbf33d35674407bbfc3b13368b -3319e81b708c815574b97d7a4093e51b -16ca8987db92c91d71d494e4b4721d5c -4f4d173435d76648a581bbc19df4a435 -fc628de5a36b7c13afd89f072a81d83d -02e5e0d91e8cc1b008004845a60230d7 - - -b4d6315de3110705a6e624a11d78d872 -f02bb86d60036f5b291b43da59fa4a88 -a18992eb18869c3e2d3d126c43a3b69e -698983da0fdce081f4d1bca3a399cd46 -245b7b5f25040fb19ebaa98f48842c4c -1f3bcbeb76bd3beab87548f5d82b9aab -90d24d0196c4f08a95dca839ad18aa08 -ce7a054e6395f10c07302e131d423dfc -338d9c56e6653c910dac441e3a519d25 -e9e437b0e54d0b0f215555a8a0aa3691 -3324468e48b189f208e48fdb75ddec2c -665e5d0c3f1ba680add3fa4ee8ec8ac7 -cae8c75d9a03b56eeeb73cb5ab30ab0e -25afeceb4591ddebb4e87b139e67f21d -7cee25d95fcd12dd9f7f717f055ba596 -d99b7ed121c50b6b1cb0d9ccbc65bbc8 -a6baba8bc577b7c3cd822a72eb37bcd0 -f75e9eedf0ecb0b94e5e13badcbf3ee2 -592390249828efaa7ec2504c95443f6b -acd11fc17de431d151ba507c7da0c945 -5b83ebdbace1542e40a18420123ef94e -6f4a759d77f6e5934dd630cfa1e1d13a -3096e6efc0f60e8072255213788ecab9 -a310b65f122ebf1ed5626db731662244 -5d2f947356ad2e627c7f561215b0eb6b -7353c73dcba6a3beb03620ccb68802b3 -1fe8c016faf2b45b93dd68e1da52376b -0ef185c1540968b65504846f079f902d -116c07ff8a67e2cdc94c62376e4290aa -a3081373de56ecb0e2d109534162b480 -aa4289a4b2a40e945d8fb97a36d8cb35 -76547b492897ceb39b7ddd6980e69481 -3b58c0a4ac2715b915aa50ac61c05048 -4d3d7a0033773f9616359d082bacd1b6 -55d24007a85eb0d6649e589f8b7c2a69 -5ad5cd314dde9ef4e4e20e55f6439a7a -37c8cf292316d659b712e3e792776e3f -01edf46ab8cc0796e5dafd51f645d229 -c53eebc72f2a473a4cf9eb791467f6d7 -4ae8b171fb58edc6ecf2b989f80f7f82 -354659fe434004a563efac3f7d7bc383 -699d854be6075ea30a977dae0c981cc4 -81a766001a796c1a674b07d74c6af5c9 -82010fb9373dcb9cfbe181827be1999f -50557d6fbc52731e332d6e12b04c4a19 -0314cfeae04a5fe2c53b979688e15fe2 -f0235ede716c0e3d2e349d570709b6ea -cb553c2818b8a0c7d5491b176aa1d078 -8f964ed9e1d9d85693329cd4b161c761 -51135a71f735bc70185154fa78eb7523 -f6b053852fb105d2ea5213ba6dbd9055 -6c845639a0f7d75104c6841b9a90f934 -42c1458be4d89e761b4ab1f94544d7af -da0fb653b20f60acb1b32e763c94ee84 - - -339f0a142477e11932a52309ef39132e -120f110346817209a75f91e2ad6768e1 -720d30f0821e90db18ea8fc426ed49b8 -0bfe6d33ab9e711efeddb3dd96a1e82d -3f0cb6ba394a86cf0336df967eb3c0c7 -8e37c7fa9059a72f2aa60e4c15c9e97c -ecc8a0bde690b00e0836ea7764a2fb4c -1364b5c7f6f46e8a9d5fe21a4aa0b8fe -7e2d917c34973b82cd21c55635057d46 -71447d62d4cd620a20ad4781d6add66b -7413a2b2042814b48304c12cc83309be -943a1c51b1f92a4263138c7d60ae79b4 -763919c179d578786c214bf6126aa0c1 -2ce348df9fbc81f316ebda901c673a2e -e0ce965610621ebcae718cce77fac1c3 -9f8037a9a12a3775f77152459d1d56eb -83f1129fc2c84d6c8c95eb0c7b125187 -483c66aecf659f68b16f0b28dc666720 -2c27edeee3a6e7883ed719fe44d6d145 -333bdebd970556adc25ce3fc2da4f1c8 -38752b632fd39de4d2873e29a9a95900 -be5d82281f411cbfa5dc10fe5ee4aa4f -e1161971bb06488cabe9066c8e827741 -815c17a65c7320230a1053af02cf39fc -f326d01ea1f9cb89d96aafdbf65dfcf7 -7353c73dcba6a3beb03620ccb68802b3 -f3721a08b89b802dc341a3fe9840ba79 -e0b04ac47f5d5e76b5d204c50018d59f -44090991e2c1fd2d2fa0df9a85dc239e -04efd2f270cc99079814de6e3fa9f9fd -3e5963883aba5a640ef12cceb8c8ab02 -046654462316a1cffb3d3db261917013 -fd401a3ffaf6041c661604a3b8829433 -0d2c31d7789e5bc07bd6603c70767da6 -791d08fbdcfe6f2029c0c400d4f3778f -dbc9673a5c976c7beb59388384fb9f14 -37c8cf292316d659b712e3e792776e3f -01edf46ab8cc0796e5dafd51f645d229 -fa476ab10e0021686cbca62a37590073 -58575ddeae46121cd633a8f07153786c -13a76289383f2cee91aa326ecb2d3e3a -3e5b88253e668dadb7bb35266683719b -21a16ad96278005dbdd81c4025a9eb01 -43c581c321c303a3b59011b37a558ef0 -315cc47a7a4dfe139e37f181d9495ba6 -8533867c20217e5aeae7d0dac180cd11 -eb81a66ea64bf704f316761e173ec239 -4521fb4569669a9452e510c7073ecee0 -50fa549d9b240f7226b509041c64c0d9 -b1b7aaab7b7932757856dbfff7ecfe86 -edebaaf030b310580975751b4b7007e4 -b7c3fe1a140db57e8b81210c6e91c32b -96158be7f9f084bbde73d88ec07bcb81 -abfff4dbeb6fb2a25396303105f5642a - - -3aad9f2326dadabbb17a4c898f55cb7a -37e6c064751c71cd82a008eeaa428389 -a41809298a3eb22c0a024f66b2f2520b -edc2555b237dbc9aae4679971b8b424b -a7d9e22d7ff36c1da81e13bbfa449cd2 -d5126823e954af0a43d506605cde43bd -2b89db2c940374d7c69527633eb17a27 -cee521aae0dff1ed9b575aa792b3683b -ed3b811dbf2f5f0da999aac45470a2eb -e9e437b0e54d0b0f215555a8a0aa3691 -ddee3ff7a1d361d4d0ab3605669c10b1 -e22f001a43b558ee15fc2bd56a3b1e26 -8b55a317006eb2e75bcfdec7a0f03134 -af5b933e2c38b422e297b175feafbfe7 -aa467be31b2f50dbd9fbd3c5bd9b8b3b -d3328f22bef875e75fcc41b404ce8460 -c645a6250b74b54324da8f44dd996042 -1887a8aa9bf2a6baea0a5c07c4f45614 -b7f38fe9df82f9bfdeb39d490bcf2273 -2f1dacaf90694890aa69ed02db1cfd0c -64f7b62adcd9dfe00379cf6fb07da0a0 -73ef86c6047194a43a152f48099642f1 -7a3a40afaa184399b3341c8d3752ec7f -fd12aa1cb525582c59d5e2bf0797cf29 -0b811b8a0f1113a872111a69e771d294 -7353c73dcba6a3beb03620ccb68802b3 -6aaf77a113368a8a09fe2586abc98459 -7c72c5d8ca3ba58cabe89b42769bdcde -aa3dd95196d0ec83718e74c22d0a0da3 -ab1bb9d3855f406b678b18704ee188bd -1ff59633773f6bfb4dfdcc413018166b -8b3dec78b853fcf28e9d82e991bf9a9f -9b88489c5cb23c01cb49c1a882b3e6b8 -9d94a90161657e4a6a6cbe94c7c22e89 -afab86bd75994dd422cde6c39712e684 -4c1df2c93f8bea9b0f314b093d383c93 -37c8cf292316d659b712e3e792776e3f -01edf46ab8cc0796e5dafd51f645d229 -801dededcff0010eda5c68783293b665 -9ea4d03b7e1c1b5486f6e6a6c51c43b5 -6ff052e55a1d1827e5d79b2899ed3057 -0a5c40d34cc8023d7d32ead997fad057 -1194ae8b155ccc5d1bd3de39e4f02643 -f0611d137ba7872878a1ad6b6985ae2b -2aa36b169dd5033cbfcafa4437109e53 -c3fb35dd0fefe93bbf0dfd8976709bb7 -7facb92bcf34048a14d168838b7f80e6 -458d70e686a207a21618c43bb1b9779a -94fdb8c48a6e469af0a7f8f20f33ea4f -2bd7816e37190fd3452622202ccb6be6 -0678a8411ed29d5b8297ecc8b0419437 -459a9508eb6538bbf7fbdf224bcd4e3f -d64c67ad98d5cc3c5136298f715b13f4 -f7b0af87d9207b59379e180aa3be5107 -e2e3cd92d8221808b6348ea0dce50716 - - -fe687c0b5ae1311388e7d6b676e8f3cf -67fc891278e84c3bd8803c1d161d684c -42b9f7552bf834107c4baf04837e50fa -3481a3a227684c9cd2d321458baafc73 -f26120090328cb48d121cbb4ec62debd -4b16894f309777950f0a576ce027de98 -d855926b2e6609fa7bce6078ee3fc9bf -fa985871fb4d0f74795b3c61bf129d8d -e4fc2e43ec963c474b2f6f9ecccf3ea1 -e9e437b0e54d0b0f215555a8a0aa3691 -6ecc6225f9ecf325eb1c481640d05027 -513a6655ae8ef9a386422f71201e6ee1 -977df7e247c549c0d8eff6c9b620b960 -2f4e5771aeefb03f098258626384e271 -14d9e10395a1a5ad05b1a4f32a5d6d0d -f5b0214673d66b795a0b2384d50a0f6e -2166cc8a47347b0558f5dfeb8fb7aba3 -e21897e052dcd008149659df98e1cd6d -29274ab30398ff24199850dd8f263b78 -ddd8f1492164232700ae2ea1c3078337 -17f3373ef1440bccdefd737f1d048f41 -cf0a24b1fee3f3ef9ecd61f56f4f21d7 -e1161971bb06488cabe9066c8e827741 -e06c3b79aedbda27447869c346b1d192 -f326d01ea1f9cb89d96aafdbf65dfcf7 -7353c73dcba6a3beb03620ccb68802b3 -c912ebbf5efa0a726eda2372ac466521 -61bfc817d2b654aaf31d48b07ba0fef3 -c734b464a1378316c70ab63dd8a36e34 -7f88c5135b48f54fec58647732694601 -44aba6f4b9ee45637603fe1fd407a260 -23f3965bef1e0073406abcf61aad6078 -8c05bca341db9c1e806bf122cd6129b0 -932eb3439b371046ae7416e11a02bf35 -4c37f0937bc0bdf3829712cb5d05255c -43d9ba406e72d5ec8e6a0062822cc0e7 -37c8cf292316d659b712e3e792776e3f -01edf46ab8cc0796e5dafd51f645d229 -08aba653888ccab9c86df7a427fa654d -afe4f25f45dcd3120c8e16f12950bd92 -66474773f8488932cd33af56d5a33091 -611c53b005e2081bb40a50c0ac2084d8 -be3e102f28f8c0079efed49eedc41453 -99a872fae98b981b1495bd46e9c5245c -3b7079896cce7b94ae65425f96be4ceb -912352c3ea040bb64208b06524d3e69f -26938cb2cdc86778bc85ca18d2bc69c7 -38d744affa96ff0a897619e30e14d848 -989de54c9aebc755dd5681b46bc0684b -c6ba72a10553774dd8fe16c9107b9e00 -cb9aeac6d97c3f64441c933400ac7c5e -6c5774bc0f316d2b8901b910f5459018 -f8b1152776566df5246380c687a34d95 -46f4fd2960c180e57bf42a4003b95789 - - -f3c46414a349aa8f14f7b2bc4224c2c9 -08574a10079a93ee7a8029be9b73b2a5 -bb86a43e02b27e96f1a1a5a4757aa567 -978bf026c812ac95e435560c7be4bab7 - - -4b5cef6e62a55c9d6052852ee6902202 -011dd4cd99ce4c2469ab92117dfd209d -302604091ecb8d90e263016888535e2b -e31524da1a56945a3c72bf5bbcd131ed -e07279da1605df1506412455d57d02cd -6667b5ddef7de30ea319971fc84edcee -6f225dc643f02ed2509b857ca08a1695 -68633b9a396403744b2f3e762bbf5a19 -56d8a0b2df579f5cead684b83fdef191 -e9e437b0e54d0b0f215555a8a0aa3691 -861128d94e968edbe12c4c8b9671e1bd -440aa4c00b3aa380eefa8e7e0cb82b92 -81ef576837cf88973f407a18f2bc1594 -accb0ffe1f4fee0ce0ac289bcb00ec93 -5d2f7e3a9d6f9302e32bc0642bae009a -87204bb4bc4b2de9530578fce343498a -c1207812257872c9d54a8e5d68ea57f7 -a09559da6ee2d43afd860dd5a605bdd4 -5b4959ed0c32ed6a409144c78c8b9fb4 -c847d410f9e927b8fa9a8f2eb8294cf6 -291af0a572f93f3477238440d869b440 -41aae1ba2b77aa61bb7239a4b23e6cba -e1161971bb06488cabe9066c8e827741 -47641a434e1180196738903b96e7d233 -f326d01ea1f9cb89d96aafdbf65dfcf7 -7353c73dcba6a3beb03620ccb68802b3 -938dbb92e0dd5d3786d4e240f4846024 -61bfc817d2b654aaf31d48b07ba0fef3 -0ad67108567f99662f7dabc9585331da -594e7c08fadde5ccbcdbee9e823149f8 -6d144a8da6b325f43d751859f74df622 -1bb9e415f4377ef86f5a32febdc61635 -9e04b2cd1b93f421705034d5206749d8 -3e595b3b8b480b30a357aeccb6de8615 -1ca4e724a542dd90368a4612a878aa7a -916afe3783367139a523c568386aec6e -37c8cf292316d659b712e3e792776e3f -01edf46ab8cc0796e5dafd51f645d229 -9f353748018e5ba447e78c29e51b8e75 -512c5e594f861484430c9e158d495360 -6be5dd950754ef5842f346dbd437d289 -5f3ca3d85366612c464715c1c1622b69 -24cb7bb2fbb352110717249a01f55773 -1b9a68919f92da92e796fc9ab8706f07 -215775525bb7151acbe2d9f8bbb6fbcc -a42be7db361dd5993f28868e4a3f358f -d4127fe7986b34820229a0d6094b7259 -cb124d7f6ac3cccee9796fc4b5b7df33 -b0941e7655c17df6b1db3c8b11bd9ba0 -3d7d993b224fddf835a22916ed2ef453 -7bc61a1f1daf334bc893dd1f0b05ca37 -9f8adf4e7324896d5212987036e78551 -e18ce0c602eb14be899c6b57bb0dd58d -9e73e48da807bd19ea533c4e65a2e6c7 - - -72a8fd75f8252a1d045e76c1fc779964 -5edfdde675195be848e98a2f751ae78c -c390d1ffabde61a27b78eb96558aa125 -6420292db0698d7cd9820ec3b7724d2a -58249aebcf5329d979caf44339ac5651 -39e7555c0678b99df4f0de459271b3fc -0bdf6b42692e8b2c35bafb51bc5db192 - - -97ac713fe88d2fa27d66324b7c8624d7 -c04da19922e5ebb8357694d46076ce33 -3527c2290d4a4ed9dfc3f44f87beaf51 -adbb0c69548505681300e379ea664422 -02cc01e83f4461c0b39f3d38ecc03738 -d11249b7ca6084480f1bc7da7ccec770 -ed7a4a7839b90c6a2abc4bda4006def1 -4b0317bacbf44db749d81e899c0d0540 -9e65675700f44cd62f5ce4c4f3aa8226 -e9e437b0e54d0b0f215555a8a0aa3691 -08fe2be849f9fc85b4e10ef98d82c369 -0e0413328da3b3b09b35e539f87d42d0 -9aea864d34dd785efb74c35680025aa1 -afe888f46d9e8711233391303a42eb9f -bfbafc2dcf5bbb168ebb3287462b298b -a53138e64ad08cc1eeccebf36b7ee960 -94a4ffaae31dc87963ae69896f1be27b -17e87fef7da4bb3bf6e4644e706e541c -3d9f9e874cfd7dc5eb4cb48ce2767545 -49491804ea832ecc0e413c7700b8495c -eded5214592040c435b2a3316e621fa4 -c61faf2b4ec45328f71288d22f340d6f -e1161971bb06488cabe9066c8e827741 -6122372b62d8abca527dda55b5bcacb4 -1bc2c11dc61564329b6e8db3603fe42d -7353c73dcba6a3beb03620ccb68802b3 -1643d2922941fb544744ef2b0e0663ea -61bfc817d2b654aaf31d48b07ba0fef3 -aa3dd95196d0ec83718e74c22d0a0da3 -7bdb143804ae495aefe794056248cb3f -126f5f108a9486ee8e5e0855ebf0f7ca -0859c6c0cfe8ad851a94b6d61e52b9d2 -dd301d88f6d45a5b41cc61fd0398013d -13f0930aa714c460e67353b84b9c9440 -ba65eb70925e2e80ec40306484253483 -7a3806ed1e98e6c1fdcff3a49f043ca6 -37c8cf292316d659b712e3e792776e3f -01edf46ab8cc0796e5dafd51f645d229 -e417a73f5df9fc188f04fea0f7f95066 -1718dbbace82b4dcb1b9386f80122f8f -c2cbf29a3bf5761e1fe9cc203e6354e9 -fd52f852f1086a7384d9146e496ee8eb -4684b7959bc8bd0f06824995d2b58ac2 -8ea801c669f920990bd11f13cb62374e -a8de954c3f0e5fa84eba747eb8b38ab1 -c3fb35dd0fefe93bbf0dfd8976709bb7 -934848d5f04b5ff90bad9e28be28ea35 -79f6bf1ab06e61958bd9f59b62a2fbbc -f3efadc2007bd34bba30f768d4b1a39a -ef96c5c626094743a8d1d80c290f30a4 -3e2cfc1dbeef169bb2bec99537ba3acf -3fae4559bed375ac2e814fa2396a420a -5a35ce341795f7044e65a8044d26d507 -7b3cd67f5f1c421536def5926d137a9d - - -1a5d6cf6291c237bd0438f41efb8a0ef -a13e5351588fd0b2d5131b9e0631c95a -c1bb1f919ad2fcc7da1726be3b9ad1b4 -318fd1d6e2f4e4e92ecdfd5a0f74afe4 -4e33e94d09e7661b999f45ab106a0a45 -79a8abf8e2116dc5cb1d6a6609f6f07f -74ca1c6583f0481aeafc21696c6df0b2 -62f9203650557bc104780fcc7d9af944 -8670dccfd7a31fa4c44bc8fffd978739 -e9e437b0e54d0b0f215555a8a0aa3691 -2f843d8e208a0a26c7d9e49548dc3349 -bac516372dd955ad48d9e6a2ef967add -39237f6e903801986599c2067566e9fe -b9b944c5fded79cc87f06ff3307a3a45 -23e1bba51e40021ddfa5cb1e9f1bd0e1 -606ec4e8caaa77b3b8428f6d048ebdd8 -a5f9828728e016e09acdda4d04b02828 -5ef1070e9e4b2c6446b6f8ac0673fe48 -9af8cb14d88c4c8e0c58571545917dc1 -ed354f0b5f35e8bb9fc77b23851de225 -9005dfc6f59880a661ddaaa74935acb5 -7b4aaae21fba67db24184bafcc6011a4 -e1161971bb06488cabe9066c8e827741 -7d2ee2b086eb246ec5d5c3f9e10eed07 -f326d01ea1f9cb89d96aafdbf65dfcf7 -7353c73dcba6a3beb03620ccb68802b3 -c98aecab4e971edef9f7ce0dfda1fb25 -61bfc817d2b654aaf31d48b07ba0fef3 -dee392760d4c24a3c7f6a9a218422148 -dede0154d78efc0de11b51e0d673d30c -a200377ed90d8ed7c4ca3aa60d0fedec -74b283dcc40fe9324849847b946a456b -2495aaa5b99df2676b6409c322d2d2ef -9e1c0d69b311264fb17b28f1048547ef -ee23c6c8670ec36d43be842613bf1516 -af928be4db8be5d9d1eae35e345d6836 -37c8cf292316d659b712e3e792776e3f -01edf46ab8cc0796e5dafd51f645d229 -8cbc32702e5f437d6b41e1f576af82a5 -2ec61dddc7b18dbeddf19501c1b06ef6 -ffba322e346c235095f51cc2308f349b -9898461912d2a91f2b09a7b73c95149c -8cc43a706519260732cf1a54826113bd -8c8d1d58bf56ac901daa649bf90803e8 -d023b1f7ea21e6083db5a12b179d6624 -7709eb325cb2fc85c78639890ebd925c -3223a430e6448bd2e52570dcb7f54296 -6e7cfca3dbd1f6e9bb9336d82cfb8c12 -629645b9a1580697fde05593f28a2470 -057f86f1890cfb747464600d498d1df7 -4ce126e3a1d64bf191bcc3a693a4d1e8 -322b601af964bf5049308e5df90bf47c -4b216ebd4c6424395cb32e9200d962dc -4f3b5893f55d2462354b05f22afeeecc - - -7ed60b27951614433f96b842032b339a -4b392c539d68aa99fd193ddd822292c6 -e07bc8a7da9351c5b254b0fba2801bd8 -101640191cade09807aff3959719711b -8fd8119a43990c6172b33bdaf4789acd -437ab568c511a96a88885b98b8025b3f -f3b88d42b0607b6c83b1eb0771d0f166 -a46011062ff5494be1a1a2fc1bed44f1 -5f0f131bdb993a0f458214215d128572 -9a1d94667c35aca95934d556d7e78cb7 -614e2b173f38e4c1385933e52a7d2120 -f11bc76d1434a85de766144bb1e98766 -4684d4917e5449f333ac359931e7dd72 -f7e045d899bf00a9dc4c5a9e91b92390 -e8f8e13780dcbf0d5870a355deccf63f -92602ab17078dd9fe7379bddf3534696 -1133856a174a6f27ac3543061d0cf777 - - -7467850d8ccca1f266b0344f7619bf18 -fef14ea7e30b02f47e4558d6e763464f -1064df1f6a184ea1f1a53a50e9dba316 -38c1d984b6b2672beac82bf09ff21aad -b5ef631067ddb4adea1a7f883a8395ca -efe666263ece3d65976cd1d5a432e071 -6f225dc643f02ed2509b857ca08a1695 -68633b9a396403744b2f3e762bbf5a19 -f1f34d8c0f864daa5e8ab56801027430 -e9e437b0e54d0b0f215555a8a0aa3691 -822e8258e3b9091f75218041d4a460d3 -1b94553ec0be2a1cda52f2a441da2937 -040a7ac7d5c37078a568ea5bb7d4e0f7 -af56ae8f3240a1cb51bf1a10154a81ab -60c44a04ad95660ec00fe9d321402f54 -f6a494807c8bd81146bf7308b9e74507 -92923a754ffc4bb7a20594d85b13420b -2f8923ec07c81c8c61fdf2299603f71f -5f93e31d32cd99d38e3d59c80b4137ff -83e78bb82847cec89e9d767926d27369 -e363bb2bc57e1c0fa0c14b6a5381d7bb -591333b057f19dbfd48b0dbe6f25b5f3 -e1161971bb06488cabe9066c8e827741 -6e957be32fb81e15d2ae1a2a9e5ba0b6 -f326d01ea1f9cb89d96aafdbf65dfcf7 -7353c73dcba6a3beb03620ccb68802b3 -37dd5167c0c69730967fa2fe247c9b58 -61bfc817d2b654aaf31d48b07ba0fef3 -2b7b7694e9c574c9017760d04b71d385 -936a3826ab7fef826773fe47ee2685bd -5a2621103cb59d37db5658c1879b4766 -7aaab4fb184c28801de5a94011684405 -055d1c1ecd19be7fe0fc879d5b9e3920 -d9e5975cb7abbf8cc23b9ae0909c1291 -1ca4e724a542dd90368a4612a878aa7a -ea2d9fcd5768ad6ee88813587938fbbf -37c8cf292316d659b712e3e792776e3f -01edf46ab8cc0796e5dafd51f645d229 -e7d2b1b771b97c29b58dfa5198728a31 -53a4e01e6d7e0de4767e8730274244d6 -a0ff1824daa098e74d326f5327b938e0 -e7c6ee7a9cd603a016d8a95b082e7263 -8ad7dc8c62da0c98fdac28dfda1db0da -c7a75fdaa79112ec01f52b61a63e345a -c55dcdf6e8f282d9e52a4f09cc687af9 -a42be7db361dd5993f28868e4a3f358f -8574d8f49cf38cc991d611b4709104cf -33a07b8f1c6f7231f2a1e2d5c36dd79c -7d419c3258737adad7db81820a0319a1 -7bc0673cb5fca10a3743bcb85645747f -7bc61a1f1daf334bc893dd1f0b05ca37 -14284138d5f94467eb25db3495ebd96d -d639b227faa8071af89b557c1d98ef77 -336e659b54ee694568f9e17c14ba4a44 - - -59da6ad26f081ee9ff063897d4fc8df7 -c02878c8a237171dfd1b9d473fa191c7 -3fedfbf71bbae496c45bb9759ba10391 -94e84e28b4c116e41d0f7e5e60cde90a -394d73e0cfbca0cdcadb4961b508b5dd -2d744747e57d3c18509a6cc6c4506d1e -9768913e4af639ec2118c264a5ca3583 -2d98e7040c9565cf8ded9a6e4e092692 -e77cfae1b2c9124ddd567cc6f0bcd7a9 -e32a2e05eb7560d7911bd6ab353872ea -2ec4c88ebc82466ed548b7e0627b949a -cba371c794afe92f2cd8197239d20a27 -2760b4ddcfcc81f1ec25dcdd48f222a1 -80367c46ce620b58d334413d636a36ca -2eb0888e8c2e25e225ec0791f377f99a -63a1a0c3dc2beff496d15938130fbc1e -0a8a2c612db16f4906670b620e2a09a6 -837437f0cd3c9cfce5c73db324470fd7 -5f93e31d32cd99d38e3d59c80b4137ff -ac2d5f8f28c35b0bc7883cf3e5afec7b -a7229df8d68254a89a364ec69f6a6c35 -99c4c0feaf3b82b3f60802f3f8bbd0e1 -e1161971bb06488cabe9066c8e827741 -c53b9827107731f045595c0c871576ac -999992f3bf87ecc74a951085c24ab54c -7353c73dcba6a3beb03620ccb68802b3 -210efd6b5049aa8c37726eb144e255ce -c54906448e7c43a025518b66b35b2a70 -3bdff0ea3ff709e917be270c3e96a1e9 -7cdb38eca6e2c226c24180ecda7851cc -710a87ec6e72c49ca1d5c3c03198820e -e0b1b7d114bcce05f50cf94bcfc66b42 -4f3dd930710082c606d630d8399cb483 -f84f647cacfc125a7b455fea94443ded -aa04bdeb89f5b4ddbd80395ebe09c29a -4639d7d3cedb750d7c02ef9a1a8f581f -37c8cf292316d659b712e3e792776e3f -01edf46ab8cc0796e5dafd51f645d229 -5fa50099e41a92a8b0377afaabba7123 -1b0495d65911708d1ecbe68f65c4d9ac -2f7e43b805cd2e5d2936e2303aac1a99 -d5cd6a3e9331d4b83a543a3d9ebf53b9 -a3ff0b759ad210bdd9b6b7c31e5620b6 -2a050ca0ea2933832079928bc450a945 -15465c79ac78efb54348f5c0b88a97da -6b2bd775e06aa7cbd2f7a8848f5aba67 -23739601e903b6005a801e9bc5b8568b -8baff9a562ed0ec2f5b3723d5bf0be44 -76ecd9eb59a9b6b6d64f8c25a88e053b -55ca0445e8a82eff5ce63ce2e8da1e56 -10da288c55fecaa85ef7af08f041e3f6 -14284138d5f94467eb25db3495ebd96d -4f12507d0540030b91a6dc15843f7a43 -c0ce2218241f69e739b177fd5c140033 - - -ea54f8ac9fb2daca1b5e77987af7df75 -1771f2e207b7baa7b5f3efe2c827abab -494a07b3d89176b926979d3010d6a5e9 -358e6df85e70619ae0a3257138848d00 -a95a4db66092f50a62cb2f9e6506d199 -c5b4a7262e4879f82f55b3230e6a8863 -536398fa35f4c75fa3c3d65c98c37939 -6312dc067c98595bb72d77dfcc9344b4 -db1b7476ea8ce223faa772b7f66621b8 -1622bcae543b5c0c7363364c3b0b91ef -aa747601d63f80f109117ee3bc96a990 -c760c229fd8d2a9edb3ccdbfb863ba6f -2b3bd53f98b5cdf76acd5f4e5bf590c1 -b2d52cba7611db338fc69eacb189eb0a -4002421e47ebd93f2dddadadaebca41e -593a0056ee80a54a01c01c0c266034d4 -307c301456fe7e741dd0cec8ad10fb49 -1969ccfff5bf74630093bbeea324118b -311ad06ab23f03ff3440597edf1da3fc -ac51c6d5a8c4551bce923e009b26650b -805ac7b1596ffb71e24dea734aac38ad -3734942886e44729cef0d4b3cecb5fc9 -e1161971bb06488cabe9066c8e827741 -12020debc25145e5aea5b921d3bd35bb -95c15ca3dd5f1f6760ef60df52b6dac5 -7353c73dcba6a3beb03620ccb68802b3 -5d99af0f44792a2e916baeb18033fa79 -45de62d78c0c4b66f3663e265498dec2 -2c7e63fd6233af8fabc598cea968cd6b -8322e984705b40a246d9bbb889f3d296 -5befcb1cd6a2a52be8381db21f458e25 -469d2429d2209e2f46a2ec9c687e3246 -ab07c46fbd99585cf69935bef969c5d5 -80e0314d294411bd1f20032ad7c5cb93 -15558c69fd903afd9e88439226123622 -df65c240083ab012f304002b672549c1 -169b60e8323c73a4dfe741da1df9fc10 -01edf46ab8cc0796e5dafd51f645d229 -e51654e6b3079a0c55838b5e601057b1 -92cffc5d1fd5facda420f848e0e6ff7e -595efe5e7ba8ea24b54358923fab3354 -6fc34f4a50e6686080d4f43e54c3d6d7 -6d96a2b57a9f870c1681dc84908e77ad -c3880aa348c593492809aac1bf702190 -4397127d6b4a2f13e0833ae6f7058a98 -8ed0c3b65f002cc1c9ee534820e5f961 -b453cca430727438e97e2f063ef3a2ed -a4f012cbadff458af0cd1657b295c219 -4962a049e4331fd136bb01373a93b9d5 -cb0a73e26355babcc95aef43c0b5f015 -b62ebea33a09fdfd3cd7eee4ced9187a -4f80c26e10e7243035760e00b058a3a3 -37f57e011768360c465d8bab083cb947 -16e0a85f28a66c9fe5ef46a42e9775cb - - -87f5b2af13b175d47eca8a33bcc68005 - - -447dafbb6d90617a37c7f8e9038d2d45 -5fa6ef2c2da6b6bf5e12bd7665f610de - - -8574e2c0ea7292d815892d241b029a73 - - -e5d56d6dc8b8b93a73d7781d676891e1 -d2d4f3c4b03e226a2ae751d35adc84c7 -d41d8cd98f00b204e9800998ecf8427e - - -e01dc79eab31ca899f8bd155d989482e -43cc87a6b84afe612af178e9c0945279 - - -bc584ec274c28d5fd6bc06909523cb8d -583e353c57d884970f1753605d7ab749 -d41d8cd98f00b204e9800998ecf8427e -68ef70376e6452b0db41d188de3e7309 - - -81ea8a2fcddc874cc900876d5394bf18 -1960bfd361ca2e7b2582c1633c35b0a3 -07fe07a999542e322404d77a30264169 -9ad62e69014ff23f232dcc43859b6018 -5602bbf034110d98de30679fd3ada732 - - -faa2eda13c5607ace72e34e9c0966a0c -285e61a9ffd5231adede10df1871ab5d -714867efd7c071524ee3b0b4667a3ddd -0529ddc77e8c681c33c47b9b7687e810 -9477e6a93b94cf81c26b5cbcd7f7fd67 -b704dae630c7215138b1f90caf77b450 - - -c741e135218d1dbfbcc03a6a4e0271a9 -3d863d079d9ebd0a4d6450acbed047f3 - - - - -4822a8563a9cc4bab605312abfc3a896 -8c176b6556c4dc5c78210f458e32ef86 -64bf5d7d9f01a85acff7dcad8bc72e1c -12198416b0e16340e0fd10b7f1843f7f -487eab9f508a391037bd1d1311395ef6 - - -ce549b85795e2bf7f57d622f3fe5e306 -fa772f98c3ab7837d92df74b7b808226 -af0a3a7c79322bd04c29f37d5ad7015f -0569611956dba3b652addc02da4b6666 - - -49a7d5f486000db916831f89bf950d2d -7b1fa7007ab6e9d8922bce4da4fbcde7 - - -cd0df1eb1ee58f4a1ac754bfdefe1cd2 -b9ebe1856ffe897a519c981e673f5339 -1b477bc500a440a840ffaaafb17f2c7f -2bb0873c4f7f81c0c99b54d2942628b8 -535fdffb3136f26c9abfe69ea0f046e6 -aae48f5a99308c12641af94e8fdeb31d -b2154fd07961f3c80f34d9513c06a3a0 -2ed12a38674b56a0928c25b881882435 -7922785cf9644cdc09b48f85f4851781 -b6adc5d873fbe888679d379f9a8bfc6b - - -34416f2d756b521490629979bda39b6e -5a75344db0aff743fb45be81fea01a67 -2be702506930266ffec96980fd79a1be -334b819d8cf23d9bae0b72e49101ce13 -4aecbc46e0c5f2ab302cdd54eb427864 -5646856f0db180fdda5a23490ccd0279 -1fcc1e9b943cd1b517f558921e29de9d -681a61dad5cff3c114149b59234e116e -2d2941bb2551e54d2c5d091a4aded9cd -428f1045dfe854a874514cd67516cd28 -a692169c541af686bb9b3a1d0a02b2a6 - - -d75ed67ec93c02e5bce94eee8205b425 -e096c55a1206299868b4a383032c8534 -dfea3cd5ec8c64bedb9aa2594b3a2d19 - - - - -9c04ceb8f91529689e3dfad49b7aa37f -cf0c603a372ec04408f4f0390e508ada - - - - -aa549e38162bbebca92c3568439e6cca -898baf66f1dd853750e80807b751781d - - -0a9ff928fac90b7d31a211798c5d7b07 -e90ac5d6893f33fb504a632e6881ab80 -24faffc6ec8a98224a7458268780df30 - - -abd7c3b7b16cb26c813bfbcc3bec5547 -be4ad6fa5c6f10b2267c2f5c37a96995 -9edae75776eebe27b1fb1936c3819580 - - -f7eb3c41571a2d8347935ff96ed24515 - - -b829e1c2687849a67387ad8e4c55404f -0d772a38306fde52cab75b8a42b45688 -a479545a4d71b404467f55ad48019633 - - -8773ef23af4cd05569779a3123258cc3 -ec0a539ad80e8d7597bd39479b8801d8 - - -62f324ad9fecc991f15728c9c2ed9742 -e8d4baa148d9d93c0473a2c329ab1a48 -009597a5f64d3069f2e297aa98982858 -262b9e74ad26d565e016ab314b6f5900 -c8b166ff98359e552c4a6c83207eac81 -a1d2e43461bd9348bd8bbe6b7f029d40 -b60403d59f0a5199f5e410bd0873f63c -ff8779d37f8d74b37f2c29d28312a7d2 -6a6a8e020838b23406c81b19c1d46df6 - - -562e10fdf9aceb3c277f6d9b13d98fc1 -aace231a5cfec37aceaf64e87a6985e4 -e6a600fd5e1d9cbde2d983680233ad02 - - -e1b7320c28b4494fba3338801618f1f9 -e8592f94912d5ca0c519d036efa796e5 -20e95e9c16378e6ac4df49011220f904 -c168a83b8d1fe063cb8143a0ac4112aa -93d0209adac1b1a2b4e3cf2173cf995a - - -497e603380ed4878a23cb93a6d41fc5a -496f2de8d1731c247561cea5b9356f5d -0cef2d554ceb31f339c496ed5f06e63f -fef9a1a002ed2d33ba334ede8675899f -c2c7554e684b3215f323bee3acaa467a -a6af9e25307918427d5fc1a92c2d73a4 -c36eac40f8db61edea7958d8ac870f88 -d5eb6af8926a058a1509863d6fde211f -84f8e3b311ab7dd6dcc4f609ccff71a5 -112f202a9780fb2b54a1ce2c671046c7 - - - - -82a1dc7b788bae6abc9e55534c2b3ca3 - - -e1b14838cc8bd6731fd7aaba886e8afa -c88359bf1583ca66c8100428a6a5e63e -182b8c7bc4a360aa646b717c8748cffc - - -4123a961bba02f23034725434594ccc3 - - -a44608185f9bc21f28dd0173739f023b -ec5f8fc20bd68e9d819ddd27c467f89c -31f8dd115d3a128d7102e4fbb1962c97 -8acbb7705de643c83649cdad150f2731 -7e8cd6738f3bdf1fdf9355903e447c71 -d6e12e6298f50591f6b60f1d4b560a48 -3b6e3f698aaed4ff349d483023d0545d -1e9100e80550b9b1282fb305c13f1327 -eeb9b7f2e9abb8cc529d5cbb005e55cd -0dd60c7e176da42034b3f3b037bfd778 -828b062a4469f9466f84db7bce8db974 -43ad558ffe62c689b536cf660f5ca176 -a7ee7b8be7f2cbac77dd50bc35a8a35d - - -64981dde61a7ed93d684f0d88d72cf8a -72fe3911a3d5c83cc2c9fcb2a6157029 -959ccf3df64852e3ffc0743073fea2ff -0662f69ddc43bc8d8a4368264bfa446f -fb881c3317e0fd8a11b6e8ae532df2e5 -802f0001b4175906b7cd441715c41ad0 -04a1c32b7c57d3b72e47d17b042aad7b -6b5b9ded0fe39f60b3fd5de087f2744f -f3f9818d30b0d651ffb539d585b4f9b9 -425363704e2473e73135feefabf1fbf5 -a907c714a8b1a4375e3afc1a82467c45 -8468ed3aa2e1647b1d89829fc8c0ce1f -a9334cfe5de0cf1472da1066bb8f86e6 - - -f560092291af46296ce2df70c487b3ed -8178a5d057eeca2e4c85f8e67c5fccd4 -666ae84e76e11b01cc817fc4cf5c16ca - - -d4a4a36d030ce0580fb59d5e1fcdd1d1 -64aca8b2ca2915edabd55d33bcb72c9c - - -337f02df94545156870fd38996cd8f5d -02241f0c76f1a77c52224c9be60674ba -8d2ea8e676b7187a372ab826785a9fd7 -b01d74db64fe85eb6da723e65f617f6a - - -6bd65aa59a63a1daceb11d166b3bacb9 -7c46daa52b3dab2ed2469138f40cd6c1 -2bd0f3c14131b46d2f9a826a2366febb - - -8b201ed237316c1fdebb1c6a54f0b0cc -f531a913116dbf2ccf52118a8020be42 -f2db163357ce3328e5ac36e3815fd436 -435070f76037d44eae393eded06d7ad0 -ce8fc4def1f60d0f99cf74dcde1f975a -449f0be61d71d172df4406ac5ac00e44 -e061ea1da4ea13158e71fba07705a736 - - -0262d6f7529c6e249a41459a12c826e4 -61e461e4a2cd78950a08b22375a2ff43 -d2d322cb63fd5505c6ca6dd9e694d1a9 -eedf35de2bd1265ca65cc38ee3e413a3 -0ea67c134bbca5ffad4d5794d3ef84ac -bd780bb9cd28c0fbe3e449692a9da926 -ab0fea537a07797dabd14a32843fa465 -668f4891386a1cb52d1777904926c247 -14d5bf6d1da71575febce918df26b7e7 -675b8b78324bbe364e9c753c989d5e08 -f9c36addf14d7ce04a2dd5d031fbf414 -87f490f74a9777a524d0efc5d3136b3a - - -87ea1ed3c57bbed850b7d9e455ec9fde - - -8c55b064a10c2ed1cba82b65f65eaa31 - - -932bdce69cd84691658ee4ebde954d1b - - -19723aca94cb1db21a8ee2346d65c4bd - - -b0e3e59ac4a59d120775fd038d8bc693 -3584facf227f891bb3277a49ec919a8d -95f548ec797ed8f8c06d6d134d33ebbd -bb25fb4dcf5c745c711643f1578944df - - -b6ff2ac85d9ae86774398c9f4b747fc5 -c06d512bb4b0e16cb92a4322aaceeec5 -d20cd2c8710b00d6c6e0ce867f8e78db -ae1fea6a12e182303a0b37f497c1ace0 -a3515a42daff8cc2b8a61424e488d518 -5705ffddf355ad8eb0f1fedf230e3f74 -d241f95f29a9251e75110db5e19a22fa -dfc48d3fa9118e8f89a9f975ea53fa64 -0e1174031b6024332611dc2aea565209 - - -a3929a1a862e4cbf4cb64b35d47ee4c9 -4c8bfd42e8f638ee9e325d01e0626416 - - -4d5b3a87255611e8d8cd9cd5773ffefb -eb649938f2a91662ca060d49414ce4cb - - -108da83871578e6fe99a54f59d234fdf - - -c9b5933db4b7b40489652458ba74aee5 -7f90ecb330695a1f3d6e3b7212bfd804 - - -7ecb0c1313a804acf7cca3bfc2af5371 - - -3f7d8c9cdb7cfea15b7d845cb842d34c -8189343cfcdea1c31e228e69e4008a68 -61b4885b1d5e801084daf5b3eae64c2a -53acacdf9c4c48bcef62f985a436e41e -eb41759bd9cef911685361ab87005444 -79203c2b882edd8ed0462c3269d5b7b1 -40408ae9b99a4e97359763c453ecb66b -5c257f5151eec5f0fe3683a2012ffaed - - -8a2780c3c13e0e60b6880a7b29127d80 -de1b1fe4ac64fa8a6833f259802ac57f -8868228340662f8851ebac41f8b0132d -bd949541520c492381a8d88c27fed66d -b10f0832f835f00cab87337d1a9d75ce -28e5b65558acd4edc539e21852e900e5 -1868f7f82b1903c9de4ce050ee14db82 - - -b954c911c9fe9aee88fad14dd503b577 - - -5b6ba50d7ef9e29b7e8b044a95011f31 - - -be14474b429c44c6e6beac832aa256f3 - - - - -732639c411676af1535e1979aac8721d -609ba0963f7d3b8fa94891a34c14f050 - - -170d6b111c29441a69eca6ecd96ad3b9 - - -630a8d47b7e819d926dfff87fc64bc6a - - -ebe3b547afe79900569f3171c142d701 -cca2e7336ff1e21769d7b45434ecb70e -bbe57005ef060067bf71ce2fdfc0b277 - - -7fbc338309ac38fefcd64b04bb903e34 -cdf35ff41736804343d6a5b1ac20c69f -3fe6bc98241bb5021b0f0379a78e92f7 - - -cddd6fa9a09455b21935986ded47e1f3 -9a9aa4cc2fab4fc2492b2ca79c998c3e - - -5a0eaa301da9de1b1f9f8a7302a3254f -16fd9ae93014177891ffe3965b00ca30 - - -9b8540bf23bf150c00aa21bd867cbeac -05407e3faf12505988523952a5ece0f4 -b8a444893e8b94625779fcc7a84c571e - - -ae06431cdbb4b19615c2c0bff42be0f4 -a7a2324990402827a3c06d8d201a79d4 -df7264ef6434c2a635b40cd40892e413 -2638fb4d09857b5f80c6c36b56ff2fc3 - - -61912d2ffd0dcba4212627bb06eb3be9 -2d107d461001fd9bc7f3313e26feffe3 -8d632fdcaab17321dd4135d13772901d -6e41c1b163a9f5eda65889fb6106f0c1 -557923b661a05d17b31e01f1460416dd -ec2889444ea50d291a9705fbd7894ab6 - - -d7dce398394d85936415e89e11dec52e - - -fc337ec4810379abe092816623391632 -8c1c3f9efd1caf15d6f27ab9ca43d79b - - -1bef9716e0f15e3f31959068a3b85f50 -eb8dcfc09e11953f8667fd401ab6b8b5 -aa78ecc6eae4e8d98ef5d9673dd54d3d -6f2f81bfc4a8e7a3fdbaf8a4769fd0ad -e558585ec8f5641ccbff926965ae635b - - -3c7e070e4af926b54d12472cf40f3af0 - - -95be8f0ad0d228879f2f0054f1eaec87 -4bd1c556a61de33c4b19f3840c8dc649 -86bc4c3b26572b57e243747d20aa383b -c3d6a698de03cf59cbc4e45f7496cd83 -e1d012d35c7eca12f4bca0b9d038f396 -d629e5e491b67788b4a25f6b1a5d94ad -f95e34fe8e6ff264b506bd491a81013a -ed7a4dd9378a6477b745e2b23b108dc0 -95f1df9038c8cfd42a49d5eb48a4c367 - - -021f26aa5176c943c233281b5ea7d4c0 -93d0a813e3a5d927f22c634bbd5ab741 -06b03ef6aefc8605b3d332c2b9ee0ff1 -b36e397653282eff76886ee870d49da0 -f8f08282e7339c3acf269e475eab1f4a -b1d0f4020fff002a4e4399c5d27a47f2 -5cf59828de7d630438e05326583bb842 -f04e996c51edb4b2465c28239b6d9df6 -1da545a59ce7d1387b39bb3a1da1773c -c7cad0b8c99857468e82f24ef00f0d87 -abc65b79bb71544eb62f8faa58bd454e - - -40ec74b884eb8579a4c65e0caf0e8d2b - - -92d02b05aee4126b9edbf2ee053c7921 - - -883bf7e704896aa93865efa3005f722b - - -9ee8e9295598c59fbbc3163482a2fb1f - - -be4e7b15dce580a0a37247648f2000dd -75a73b2827770371aab55a909caeca8e -9129dfa25d626b828fa9af6d64d268b5 - - -e6f7434f39bfdf51116f27296b87b945 -fb1ec2ecbd50fa8c31b6511ad2a91d2b -1b1e83312392c710c1c1ea3f36bdb588 -cb948392df5e1cd209836cb12a537e57 -f2dc9c0bd47eee402e25bace671f2bfb -6d7ab34d53fd862a9615ae44ebe736a0 -a488dd0e3e82c0d56d73dede1536d907 - - -245a9cdde9e58ad5819aee82d5fce3ce -d633cfcbe1f4e793855c1f9d68739924 -37ef05a1f7573a7e0e439a4ff3a1a1a8 -7f17374b5555ae62aa46880664e6d69e -60e56bc20d9775156937c32ab5915460 -e6b4c81fb0b6da84026c149b743352c9 - - -145787650ea2f08354f23b35cb493116 - - - - -37e6927d994863a46ba159fb1c1cff93 -8f519af4eeedbee41331bf6016420f6b - - -e29c822345679506624a98feb5b442af -14e565ea68da5e6fe8d292328d85ace2 - - - - -1b06a0d79b351f434ba584fddc239a5d -c43bd2ca52316ac880b87f0a54c9921c - - -2813644717cae96f6eee850f72870d0c -4a07d9bf79c21027af61638e9ddac305 - - -95d80b18a1a627d24918b2d43d86fc6c -37c67bd686650f12ab2b9af369a69b7b - - -17b4ad79c04338e272205f0c8c31cbec -4f1e3c86f88657ef6d3424bf542f160b - - -321e35dafeac1e66474efe955c783a29 -5f11b75771100d0ace8f825065833811 - - -46c3950580fb14818ad2b1ba04973b40 -14be641ba90fda8a52c5789d23cc4b2a - - -969394a30339e3f36e82dde6ee7b55be -e192b214edb8fe38fa8193f89684c8bc - - -79f4867813e93516339dcae76be8e2a2 -f8380c4b4790100872652ca46f303752 - - -2d28637e887b77639497c6ab6631abcb -8784fe19bb0f61aab2920fb357d6e230 - - - - -4b40963e7bebf8b1da6aac6ace5ad3d7 -52a2b657a641cdde372fd570c05c0f03 - - -d09adbd598766185268db7f0efeb6b3f -7cbdaaf4fd4dd52be7dbec09878b7eab - - -2da9cb90610978800d4f47c1c7d5436c -a19b100851ee39f7c41942a2a0a79a38 - - -c72d25816e765ad0c5eba8bc0de27cf5 -e0308768b53378647e413b22bb18afdc - - -894ef7fca2ba153dc4bc76ea6e274b50 -bb704ebfb093faf17570511dc6daa43c - - -985b84794c92b1379a33ea390e6294b1 -03007cb4c26fa46e286959d2d16bd939 - - -017b142931152739a1267fa2e9e7c2d8 -8a0e52f04abd4e03e682309e7966caf0 - - -360130a65d167b2cc50e4656aae15e73 -6f9a4d54c51f26573dd9503adeb97985 -fa83b8d0d80320957e1549f5c9cbf42e -9663d90534f930eb5b4a83888e2b3a13 -09a40daeb32c84788d1811671f992ad0 -8b4b06e8aa51ac3255edfbd20dee7825 -87322b19f4a9f7aa16861368a78810e0 - - -0208b585bf645360c96d2d226c925218 -20c56adc22ef33765d16ea446dd3f8eb -cd82219e2110a0811177484d37db5d53 - - -bd2d14a110664154fc509e3d3f9421dd -ab2eb6cb14d29bf288503da38a0f49a9 -17bfd10e3232de9145f5b74a6ef6afac -6bb88a8a3d69511d1bf9e7af12ab5f47 -5c87b66a5358ebcc495b03e0afcd342c -5c546b7f37191a754b6743a640c6a0cd - - -8ffe375d0cd8d0a39ba20e3f1f88b6ff - - -09c703bd1adc43f4b032dc34e6e3ada5 -27f0f0c023d8775a7d970a0550caa3ef -f4d6dda9a7e9a13fae9a0b5666a1af85 - - -8f83bbc144d70505672f82679546c72d - - -561027d7adbd2358225866cba60568d2 -edd56d70cac390ef63feeef7e9d71b3f -0d24de61581243b069fb508efbc78a67 - - -42f2f6e2122319a302b2769011897b2a -7fb30d688bf82d32a0e748daf3dba95d -1aa821a18b07bc7cba92552a372b8f9d -75837274a0d67e19ee975aaef9e283ee -cacdbe68a428ae36151a3d1152b2b77b -205fd4b7bc978688de8420087c161bcb - - -26adcdd9610a48fcda8eddfd22fab072 - - -4674617014723f062743145bd2952df7 -a722bf1cb509c0218c9b0d41386fdbbe -fcc615d2a469180dd6a29ee6c04e866f -28b46c5f466ce631317e1fe067daa7ab -8745faaac931fd3990eaad40b663a00d -3f20f10cb46cd58bb26d5a80b4f29d74 -2cd707fef915349263363bedb83ceba6 -443543014f50021a6aab6e3dc45ed587 -544195d15ad41278307f99c79129ed72 -d0a111306e668d146a52e2299597888e -191b3c2e856e750c06c0ba7987f902fb -4856e25c5027ef93e512646becf3eda5 -80bd51941ebdfdd61f69aa3067ae600e -5a3660e46c91205c9203901c6b47cf8e -bae95a030b030f44bcad2e87dcc14815 -78e033eb5863a8b60f987f5fb2b604ac -c940b153fb6c5b3498efa181881b5b6c -0583253d3e49f14e3b6306fa788a6f66 -768d12956504372d4dcffea0f0bc2865 -649d51e9fcd4989c23940a24fc271742 -96c6b586a6afb6d72dc8b93b30f844d5 -3daad3713df02c15beebd09ceecacacd -716611c7a37f177cf3cb53c5866c7e43 - - -97e543830b6483a04637601bd4b62e11 -d32239bcb673463ab874e80d47fae504 -f47e1bd2753896200a97fea6f6175ce9 -e80566efc867d2663f4dfd5bae5fd1ba -916b61cbb2bd621b617c36b51f681935 -cc8c19ca8b612519b040f6f6d6ed2a2b -879b65ce99ecff3401551d0ce8497d5a -c04898b16f88e2c2fa98fbbbe7fbef95 - - -f910decf31ee5f189c5397ee0937794a -7ad3c70ef87d3657f918d3ee3649f31f -0f6007361d5e4c8f34a2e83d402567b1 -cc2cb448f60c5ecf61f6879aec325801 -b49ce165ab6bb7d90fd020bb3958ff1f -22ebf9af13beac714c8114f15b40ef97 -f163ef4cda9bb39f8abfcfcf2b683e0d -82f254a1bc551aee1583bd6461b62cfe -b2664e1ae97756c12114cb3371848ba2 -c40ce9128e9f654222f0c17958ba14f9 -66a08a1e2a2405c7ad5affeca0f81b2f -1c632653ab6592fb8cfef0471afb6807 -a8231d248b1a221019ad16fdd605a9fd - - -5f28daf5850a1ad61051cc432eb053b1 -aaeeab2d5344153a897728f12a5bde71 -fc037b603dc40195bbd1bbd8564340cc -321d0860cabebdcda87ce7827b783fb3 -979ae350ce77ba897f567cebacff6eae -1000a53f98be8258946d51516864989e -9f867da7a73fad2715291348e80d0763 -0dba7d44ec611c7bdca62e51921c34d9 - - -8ee3baf3211d960fc39e28c4e2a793c8 -c458a95a74915bb3e01102060bf3d27c -39b329017c9d46eeb7f89f11e8540c96 -50d61b15904ee2a7d56673fc42dcc1ae -e0a7f23376f50de631db93814aff2e35 -f110fbb18db8a227880b27e099358117 -1915ac55e94138dcd9f924e4fe507ea0 -2a315fa2593161154c319788f0ef2127 -eb85dc872664c0769e9fab1b7540b4d5 -c22fdc8941f2956e0930b20105870468 -a01d7dccbd0a43d02a87035b60b5ca8c -d4836ebb5fa4e49eb36ba797c9f117e2 - - -1596278a679167aeccfa3ad3ce84ef5e -c404a5cb3e2d0c7dd3560e6db70dc0af -3a05dda84962024153be0c897f7fce74 -b0262a6867fa221fe3d1d1cfcd0c55ca -d61f773d2fb9d3c45fa3696dbac3c9bd -c84baa08f37224a274adeff9b38857d8 -a86fe4f29f0b81bba412d2d443538282 -87f8ce4d8fe767f9ad78c76b54dcbe63 -a379a744cf64f76e44191fd83ae5660c -aae28f0dcc80ea5771e96fa2b85384b2 -e76061a42101f521a01031aef0759b24 -294600d0d52d86683cf6b17fedfc1794 -09fb96e516325be267b5253ed86ddcc8 -99042f7adff906f9933d08a02d6d87f6 -158e329a2f7aed3469479f8f9ca4017e -83e4d18f829b194bfeda62d7374a7706 -d96b9150972b45c9d342d631733e2adb -d197d53598e59e38d6b53e4493878a37 -659a267cde3be07c1b3ef6388ca5b034 -f4e01b5d04b992dbdf05a536386e43ae -135c15c8da02cbddabd2830ff17f1f90 -dcc4141b642e5b91722db9fc5641c3ff -38062f6727bd12537a6434bc070d633c -3bf26c69a67bba08b33ab9a1cfa913ab -6f906400cf7764ee9b99c5f062284a33 -1ad9babe1124b8ce470d94369c466cc6 -f2fe25865fb26d8a60799cbb700aec31 -dab061d0b54998d4b61de139a368c9dd -0826365fe3595c15372b8aacbe0a050d -f5774b1f9313dd43fd39a7c1e2c49c98 -b35cabdd2609ed64c6aacfcc62de2d1b -f7a43d21c05827078185dfd3f1898a0f -97e9ad68e43dd571ee2dd32453b579e5 -7da25cffe11482c608af3eead69e9a72 -be80996f8def6c9a756f99e2d6ab063d -b77d5b396676b9018dbbb98dfa3540dc -dd52c331a81417dfa817ae740317e839 -3a16d03720c344ace88ac9f4557e5da6 -33dfb82a79bfd5cd05b336e1c9d7e972 -49af03a5a811b6c74ef0b1db74b0ce55 -764fb4541826961d8b07302fdfa19855 -1dd9c8b444e2c6bcde222d7480a789c6 -7302e05f5eba2dc64003cd74e1c3fefa -ccd660c0e96ac3a5bad8c55c57c171e3 -89fe2062ff820aa1cfe0d73fcd75b8a0 -34ace00de3d8f572a795b92afd8182e1 -e817fb4adea53ff6fec6fe9fded710dc -43d892662422c27d6d6da3ea4a84ea14 -c11a232f8789d4c81cc7b99ed6a5a6b7 -194a664f4110062a5e5fc61e4c41d380 -726f61ec81224067b92d3b5c8c66d16d -512f8fb3042cca9b5492906df80c8d1c -7bd02886e8a02672e68d7f9ca82989f0 -7260e1fef9a19946b0b9997f0835d28c -27269177df2db78584bc130e8da427b9 -673d347d114623bc685bd6960a975b98 -3e77aa1c3743a9e66ad430d565d5bba9 -c8cb9e2990d4823212d9adbd3904d612 -7090962dff4fc5fea54bf747f9762cb4 -9b1fa0f7b10bb71d25926e108bd33a7c -36cf39ebed632539610e00972d066d66 -f687c08e85b9c6d3b98ea103e274285e -26de1f4efdbea90dc07b2d66d9e98f3e -31fa16bfc0c36de373ac2aa9eb44147a -a4e35b5662f37aa780b2b665625e9e3d - - -d009e5dbfe5f3a20be203586165c6567 -812f6020c188cd49427c0f1304aca26a -d5e952f44c649481aa8597d2fd0159b3 -35c63682b9f0ab3638c5e7c987e1a892 - - -f60e1698f84fef6cceaf756526d35bc0 -ad575cc08912598f6f5e729bf877d838 -36e12a977cc05cc827265e5ff03279e6 -9bb50e250d516ceb772d613ec222a292 -8329dc000348b6694a0406078334afcf -def61191ab83db3477794d077674cfc7 -abec52f4168eff9fe26156c0c83b6426 -4af44754cd8a9169ef110bc8819b26ba -6d5e9c09b7b96beffa76410e7b045bfc -32413e5ab84f9ad9c03ee1ae36a694df -8ab6321edf9f8ea1238cc0560f052fc2 -7f7487e34636a5b2dd1659983fa44183 -a04dfe23fe5e92ac0c8468b726b6e7c3 -a1915b568a6b7519e0043b4770179620 -64922d606f750c8600e7b9ecf07b7963 -989d31280c0befa91146e1d93f5d4a06 -85208c58f89620de2754fcc700c4a075 -4cf5221981c2637550b84b6a5ae8e0fa -9b9244bd50d5b84971421633847fba54 -ceaedc7d087c746507535d1c003af166 -2f85b729f0be113eac44f6066cb5de5b -d23bdaa2aff220798bdc37c80e0d0aaa -d7133d4ece13b3bfc56a1bbcbdc1d8a9 -073f005cb7f0ca1fa0b3477b2b353eba -0e170e254f338e246e49c03b9dd80c55 -f63a766693f795342782a2cb83495f36 -37bd5cd93e03be1990c87df15963cdf6 -8ea4846250a7a10fe781793b447bd277 -a6b361049e2d2bfc442f019c0ebe0d3e -b91921289a4962823752c793755cb0db -89310aeabff45d8d0e3db15e5a544f97 -a1414f9f8fcb238d28e70b44270a7a0a -8bde67bf893edf48a7614839a4bbf74b -1082f9fe5c2f6cbe5888d1d91badc664 -017b261abe8f6d2222d7f6c0fe12845c -d08fb2b1a185a1c31e7846758affb0ae -3efaff7db482608044187093320b0757 -c282ff9b75524457d1162378a60a5a97 -e6d14fc770a9196d2ac80b9e98fa797c -29cf76d442e78896984717946977542b -31b036a3fe4b899112c6034ee419e9a7 -9858991322ee43e6a4ffd569553ebe80 -582ee00cda28fc0515827f70f9ba92b2 -805b19dd0996ca2000f73a119d711cd4 -dca94f24bb85b0593f5a0933a0a3a7e0 -8d06e552954dfa9019f4025097e93a4f -d33e0a98be45f2e9472e49ee9dd6f0e1 -ffe13a2313344e30f82877a3416a0716 -ca2ccd3edfeaa2b32dfa7bb4077f0f36 -2a19b807e0edae3d92332e2c5907efd6 -c730dfefb17028709ecee2c815bdc154 -a08ab2cb67aac27ed6dcd776c048163e -587b5427eb5cb02d7112849ff94fef38 -b2e9cc6b83b3972dac3b12190bc4527d -135a64b167aed9c2ef3ccbc3026f4b73 -960dee22771d0e93cc816a38ad009f2f -27fcaaf059a2640623e019aef81b5c66 -2183e9eb46f48298a282345350b42a8a -c4a57e6c000e5ac94dd3d1f8157b3475 -7e9da0dd3f40ca8657eabff869c9c8d8 -0644436d2ff4a3936688ab08df19fcea -fd6d0fd255299d9ab256a2e571aa6bda -e250fb521b43a206d031acb2861b4dca -4254d3baa0f050715478546c8a984764 -f6a1230bcf5d16ce03fa1b29a3df834d -a48aec0b4d383a1f2a92086ceb47ec48 - - -16e626c7996b2957e8b64c186de9ca0d -f5e72b9bccb81534ee1809909b77e6cd -73791145fa71981a2f3a56fc5b22fbe4 -6bd070aff5e945045bde6a49cc92e512 - - -4471c14eeea5f72781d82f17895d5aa5 -5daef170c5fbe68cd5f100d107e01504 -4c1dcfed2ae2814618e2a45010459d37 -f18db89f637d124187becb74e306f8b1 -0042f12911964e76802761cb775e14b8 -a1bbb530fff30728fafa1b28aa715869 -639c6622389ed4d92dc5203af5450b2e -8ad26513a0572bca3544c64042be6bda -32a94143326b67c8d178b6132e3b725b -4e2a0fcc1a79296818800542d47b78f1 -4afe82bd50007fb49423ca8a311cb00c -01378ce47159a00fc35ed3a2b0c5f38d -32d36311e6dc45a2416667c034f7d461 -c4ac34f0381e28b826a88de77b97cd68 -c8c4bdb4a1b617322cfcd26fd926e58f -0b8f23197743e7e3fdbb330162606a47 -11b04aa7980130f62e3ac1bcd0e93a5e -54d4fedce75e01c45dee02b803114969 -5c678c0150ec5275dfda6d176794728a -f000ef2caf08334b13d4a2e394432612 -f5022c47307973fa47ec431adcbbfd23 -96b997c9623e32c40c37b30feafde59e -3113648d39e5735411d9c11e780ad4a9 -a8659fc797d16b15fe111d5daf904aee -685dd527cfbc1fd0f81a577209f5fc97 -0d455ea395c76621e0dd5a7716c63450 -30e323cd262fffbfa81d283aea3a7c4c -5c0a653e0953467f63585f1122af3a6c -88946514351c89d510346dcfbed7c237 -c6b27890c0485cd16677d56507551416 -44868567341823104594ced2f842d48b -ab13630cbd56a3e966841bb42bc97ec3 -39be56b5d7583f5d2b0ccc6fdfc769dd -948ca535f90f2dc7ad9107cfa7aa53f9 -8730b71b7adf7b84e6d2e7cae5ad46ea -b2af0f5e003d559139701663a502cae4 -752f4ab14934dc51b0e1c7533218e66c -b347b3f7ec52933999acb9dd40334b5e -128d503e78dfb80bb117f36e08c29e77 -f0f59095d0e9130e93b9e5e084868a21 -e85e4d6872aac0ba336e6668e896985d -4fd49cdd0ab52eb820b06f6b91f7b535 -8edda65f22bb0c407203d1402652e3a0 -a8e08e0a047ed303115fc61362bf186c -cc26117afd59cd39f0aa7850b4118848 -57dbf0be20009c16757813d53ddc5c7f -efb7ececd6c8a55a744c4215dc178926 -c5f4573cdcd1b640a2a2b708c6183d47 -687a45c78ca99dda76c3551e804b0a8a -c1ae7e25e06352749f6fb0642ac45a24 -22a3574e96ebf1e8a38c44fd8a55d411 -82bf1c25a7d5e5c391280bca715092e8 -8dc9ba170a1391983e685113ea06880a -720a5708df097d7ff4ada620e7581a07 -8068829accf72a96bfe8000f56391f7c -85cfee1df402b0e6edd3c00ea301949e -664445e2248ad3b95fce168000f88c6e -75914188f4dd766686e1112476f537f2 -b570f6494885f32748a306efaf7c6d4a -62c402b877c46cf02cc35beb17a1f731 -ff174d3693adc6caa5d8b288bd7af1aa -1ff4c951aec067c3608ab6ec27d3f365 -7707f892d65975d434b0d353274ecd37 -d9518e038a35a88a20e66e0bbc07e5f1 -a46fb6600d397ac28629fbd869821160 - - -146a3438dc882b98c821e65ccb6533af - - -a18e8625095eb56f92a155905d353847 -1f58792f47090b2316e7ab8dff0b757b -a28a99fba3dbaf91ebb70a304ee3d452 -0fc4288e8f885df3f3bbd3edc352a884 -fcfac9ce265a497d4907c6e0fd3f691b -9b761532aa571c82ee562b49d53dcdc6 -97e401958b087b42ee41d47fcbd7cddb -314c95d0d44e1daef3fa171cef5a6db9 -3a4e981e7337eb3ba0d6716b259b43cd -7bb2bb7484870d2f8a1b808587ee8622 -e2f187970c63bc88bed835c845a08fab -f6a1fe00173e7197d4fbcc1f8bec1bb5 -e0689485d20b3d89ad7ada7fba1483d7 -2103aaa2430bdf15cb322b18ab97f65f -70f1d1179fa35286c0fb1aea8018ad39 -5d1693d8228a6cc01dd1e3c64bce7791 -1b228d54f552e0b977a9b104197266f2 -ac81a7901da6ff5571a817dd995e9c9e -8168a4c9369b3daf558cfd0e10f40b37 -155a8ee4906fa6ed322e5038f3ac35ff -e86a3509c0ed5311507200951f740416 -332a892dec0dbd682378267dd6ac9810 -6b019c23817ebe1fd5023547cd978dc2 -d8208897922ceb99afb95ee77e2d0573 -1b448fc80ec12b58abb098e95b09e2af -483f187ad80c6e7e52dd3ce33a4a3f1e -e271da98e1b48ffa8f0faba1f52be339 -85dbf65b7873a5b8e16a7be35350618f -e0da0accd9d3e1cb5601745cb3118848 -df7cd4654d5e8a6887e89cdfc3e5c15b -a0afc5a40edde3c60bec05f463c86c56 -6b90f91d18afaddee24e541942d9e398 -c2db9127a4bf89e27540dab11f6cffff -b6ac82f9c20dde42d1a15dae34d685f5 -f8c4707f3a9b67471054b852801dafd5 -7e0672ab53134d15a0630f82428a895a -36b928fc1c67ff216aa85b2319b7851d -d63db58d5ca04922822ac7fec1b06be3 -77f7069c17acbe7583a7aaa54863a953 -d841ddfcf69249b6fea7dad27cff5547 -d5ea0e5b3f4ee59c2da697975cf66fd3 -9c7343768397776cf10dc721ba55f628 -5e3a5eef3e1966f6c7fef066bd0c5ff3 -1f2b6042f028cf2f74fa22f5a9628400 -4b5ba2f72d862062688cd8503d709b54 -17115d818e0353a7d69f242dd1e040ec -589b91350a270fb1e1d415b8c01e45fb -ae26c4a7ad8db871be1c1ffac8f5d4c3 -ff4301f1bf0e3c03caf0c022e946cf3d -e88f7e7dc83fbd428ad39d1d0e424138 -abd481d000b9ddae6e5bc9f40c052315 -09e47f0f49bf06d35d87ca4fb49509f7 -6b31066076cd62ac7a2b21039b100476 -0c50df79d516083f267b0f43ce5c5eed -dd2a9d6b3bb61736a607d397bb44bec7 -d931f108ba25d7871cbe3b0fd0c9bc3c -92d4dd57c6280c63cc50e3f7bd38d781 -bf10a795f02fdf2f7db0b5929ab6987f -5a4f4e8a830cc5617aa08644b5868457 -b20cb322d689f54ddf4261b5a0c388cf -acf6bad57e64e8fbedff8d3fde78a1de -3e941d9d249ab568e5845b3dfdad7593 -4e4f5d0da4f9b323484843d730dd5f05 -b494b4e3bd52dd6b2017848004442d87 -a5caddfcff2cb3196b67f25e388a920f - - -1559ed2016dfa0857648f982d552e2f8 - - -ca4f96b00022fc21773cdc793807b331 - - -8bc05b4906a79fb95d8bc5c3779bea61 - - -0dce132c559ca76638e532472b6370de -1177f3b2688e025a98c04ab77b0c0e1c -8863eda18d8d7d8086441d029e8e0cf8 -ae0879a75ca966dc197b8402a2162ab5 -3dd88d8c7a7aba125c3fd8fbdcd2ea73 -ac510a2014fe6e9033bd65e3ca7d5997 -0bd95e0651a2ac03255ce19543439bf9 -5c3ef78288b759fbac600079943871d3 -2f3d776b19bc39e993ce41c859839286 -99479c0e5007fa0a86496e2373b0cae7 -16d98685acb2d7bbbf8bd790722cfc8e -1d98cd5f2f25e0591c11e41e2afc9c23 -ea15b2fbcaa5a42956607cd8021faab4 -dd8f860c6ef110e9de82e37fa8afb184 -0bc16529a959eb0dde97ebf8fb17fd0b -de3db480653c80d66ac3617983c562d5 -d01ae13baeed029832b3718143e8f4a0 -1decef4f4c89fe4c950038cf39bbb76c -0ab38b3075fb9d3c9515862de613aa16 -114bcc9d8d93b490e63fdf91e3acb551 -a623c86e9add2870c0590afc5f949bbd -22657bd140ac2202e2bf629bae03fa5c -726973b7ca45c04bb222e1664e8ed817 -b2fdf0078f2ddef407d32a20f3c55cdc -e2c4206b699b0a3d50cc11518fdd8b80 -65d9564a4cac04972338da24811437c3 -adcdcbb989ce471063d6f5f213298417 -bdb1c8f55784f7d8f12d7092db1efe9c -cff68e4998b2a8c3981c8f9f09fdcb66 -58738e91241853705cc89688d779ef67 -00e1d7fec8ca8316f2d85a5a4b33fc44 -661750ea7a3b438f1f1f9827f3aeb993 -738fc1d9f4eb5c4ab9cbee2b95ab7ddb -df22a0b9c83465670f9d1ebf7632229d -295385b41cf155abeef31139bceb22af -45026a8580338b72244a03ad96e26ad8 -af688b341e9fc7a2a4b0bdcdb3b0c40a -f44e973ae2e5ff86237b9213617fb822 -14c68008d94f6d3f61f6cca02cd8ede8 -a69ea93297fe0452c1426b611515fd7b -058041c70c87b2173b351b0c7995688b -9c880cf3060d4146f93941b2a1c4df9b -9c173f277ea1483d1280e8c155a61bee -24341da6955553e788c3a2564584758e -b3ed6329af1133bc6f138980929b687c -24b661483ef46368bf5c3d10b7d22165 -13e67c57c640c49533942da28ceca657 -4f2daf7c00acab18efd05da010c78361 -4186064e46463e1ba447f4e87197db6e -fc4ca09947a8b6a942ce2c1c8161d117 -8a7ac96d733528b9117bb34ceabe2afd -8ab1f8fadb4c9f8816d055e7658a5e6d -4a2724f5b8fcdc7f0302aa9fd153da63 -1d5084fdd27662a5828dba33edeecaa6 -a736f34d542d40c887cb595ee83c5a1f -bd237395ea9a7a64f1d09260d5ec9fdb -09c77138ec31fa2c72384cc2ca27d9cf -e36abbb542a080efdc037ab5b5892b30 -5fb5bebcac4f2685fd9f8849dcf9b812 -3cef8a6e019d9c765e0fdadc3de9e2e6 -25c1bd469f655f5bdc5b1c4e460adda3 -86f70ad4a8940724e813be06c1813ef6 -d66d1e7b6a373eff09f71de6991e22ae -25642619bfad6452050065405f23ce57 -5febfc5e97dc2aeb2557b4de112db24e - - -df3e567d6f16d040326c7a0ea29a4f41 - - -15fb5433cf915aa2be398666363c8ca7 - - -5c2000762f2496f6dea7c85d5e76394b - - -4c975efdf2e5d3a82063629afc7280d1 -da82a19df2ca3ab1289fb5d353b766e5 -1158a4874d23585511cb139def353037 -fb23cac75b1dea5ae3dfb24975cf9866 -e9753e2685a6a9ffe15d6938eed6f039 -4b7eed62c19eab2ce3f5ec0dddfb0f57 -cfcc4edb9d8fdc7b5d959d9a359ba701 -27f3b162fa166cd675bfd91d3d91b178 -16d3c1f635fb496053e19679b0cef8fd -a9b40ac34f3ad961d8b4076da2bf1849 -bbf66d184beed2679b7938efa107e028 -404260c2d095c7eb5abeff51afd7b66d -7436665e004edf441d43e15c307557c8 -2a6b79ec64e1583c702953f58013799e -ea349a9f69190c4cbe423f0398a5e736 -1733eb4e925889d531e1afaf3815489f -26981674da504bf0480255399aac86ae -72475c099fbb56229801bfd40d4681ce -79561205fe5aa7f348e34b5a4e05abfc -41073876e590fdf7ad35e2d32030fd0f -1cd7ec0b74e032f0afbd1835110c9b88 -8e516f7e71fc8787af24749d7d013a4f -a4d7b4cf5719833de8b85a003c660241 -2dfb26c7eed3351632c30bbade02b98b -fe2bde886e0037a591ec302ed73d6237 -2a8b20539961ccdc54db302d0e5ca2b0 -66d59e4a4c93b2c3155faab56a011860 -ba8b35c68f8e23895a388fba66baa214 -e226079cbd508677716f1e67e0c2b3ec -b75017ebfe925b4d7b2afb9f019b284b -32f0d7b69529c61355c4757ec37687e7 -12cbfda1e77501e3660fb9fdce89e9fc -b0e85e9c7768548f8b0cf271fbd39618 -4af5244b59afd4b153e8c774a37fff95 -c6522ae31395edbc1c88cedbe2bfcc94 -c4c0043ac6a4049c996c825be63e2c14 -4e442121767f25d7f57ac109818d5369 -5b429dcbe483e7ca76b181d296fe9077 -687d662e2190066557c48315447e71c3 -4799d28d2dfb6e621c9fb0ad4efc2c30 -cc7485d89c6f2d3930fcf9fe3be04753 -15e9864d9ea2a8f94477e883466d682f -0eae092c6634629e68831278b2295847 -c39eab48fdb9139537207e921ac72fae -34219dc52c1412f478c26f9be6ddce83 -de286d5c93b7300531e60503ef646ed6 -0f146acf599607f2b51def0622807687 -1b8d85f16427b022d92229086a207d95 -fbabf3796f25c65efeaba71adffaa3cd -a705f84bad0ebeda655035eef200ff15 -b36c4eeccc9e7687b62e312e60edb399 -f7a64b7e9e31806690753b25abd3cad0 -6a419f5ecf5bb2169d4c88ccce7e9b54 -2844d875f221d127ae17322fe4cd8e5e -fe56cd84d50a1585fef402535bcea5ec -0ca038e8df3efb73e1c92e37a92382a7 -d657463b2be2b286022c63a829b3f7df -b2626c8a7c8ad7b9be51c6609f53d5b7 -43e34e0d77eaf601e95ea87ab163750f -a3a2f2f9e59155adf4ec27e1c1ca0c9c -a3bd20b4f0b536aec482b863d26824bb -534d37a6e6c3bdfad645a4da407aba08 -f1c4a408a59c2506f30b04b8c7ebec24 -4b0feff6823f0c60af3df3ecda8088ea -23f532046aad65b41df8c6f609f8fce0 - - - - -6318d2b6f7fc79b4ed0404ffbc2dac1e - - -70dd831c761a20467a6ba9e5ae736f91 -9c01c7151deb4c01ab1d6526073d33c1 - - -d4eb63e694ef031ac6e47d866a87e4d5 - - -20e8096a0c96d4d714a8c7b0812df9ec - - -d1cdc4aa945f242012d3314ebb90c379 - - -5942cbd2a0ac63ae845307fa087e2f7e -0fd72a4260a889cfc3e5a8e0e4ef1892 -1545a5c74ed936a58e33dbad6a62ad29 -ef358d40f208b4cd2e2fa4da1ad9658b -835772ea7744a5e195ac52ce27d761a3 -a630f0b0df9868af5a0346f21bd7c0e9 -f0ea23df199cedcd015f754e67ee2f2d -acfcaf6448c9c745959e0499b08ae7b1 -50a82501f08a3723ec41f8f6a7f79247 -cfa2f5fbdd3d8ab3d1249bd758c7a2eb -faf618f0b2d199a246b4b922414e3d4a -3b83879c6f64194a2e0fbb919055180c -8403e47adcd8429e23eeaf6cb6b15bc5 -c5ea60aa79a8809a9e778625d2d18d8f -8d1422de45899d51c8bec323da009715 -e862dc16e5bee2285354de770dfd072b -e8e8b9986faaecb3e83d01ef2689f087 -1d3260c0a3818c10ad13891dace380ba -8b2a47a567e56d47dc1f88db9a9f9c1a -e2cbb038a2453d9e740d702133f36cef -a64c683f02af2f644d924d8655bf44c8 -88ffc04442458e992cb35ef5be8211c8 -14d8f11646b47766ecff76b6feb93ece -cad168632e760ef4b052c0cfd9eedd7c -a5c88f09491161c3ad9497c4ae263a7e -ef843e2689c25c68466d6daf39c9d4b1 -dae98fa4994180c0131251b81b438490 -340190ebea4fca04c19e01deb0d3a823 -ca553844064d55a929c15b6206b7dbd4 -d8185b6534928c2c27c3bd7842311735 -d98d2d362d93297d345ad4bcddd51792 -69b9fc03b4785ac400d4193253b4c6b6 -c274b99226ddc7e2db79152f57889501 -372850e153891cfaf349c7411f953146 -12c6543aa68a7bd8150fbe9e3b083608 -0b88fbee7a06b6cf2d661089f1b32afc -0627099bbe99859c133d245036920813 -370181d8cb642b916a09caf945a749e1 -39f190894937b1f55e2df3276bafc229 -40c1b14bf010d494817bbf3816790be2 -0ceaba2ab6237ab2d1d4ac619b89b2a5 -163a8358ec114acac5a2672ad4e37b2e -210567b7ca250975dae6a2f1a4787a23 -f6b5953439b5be09382bfcf678c66c7f -53217574d8abaaeb0ba5f788407c0ab9 -61a9a7f7d8571f8c11083c0942cfc265 -b58b6bc08c4bdc1f3e229745feeb0572 -b73ea3bb9c43b5cc8980633dc76a87c5 -6c479c20624e3d0a3e58ece610af52cd -46d32f0f94c4524868004e728a51b132 -f839cf450e568e6a4c8e1db0a0b20fbe -f3ea58b26b1ab4a3be56ad0f921c0b54 -3c5af3d9b79fcfbfcf538056f88d9eed -217f4354eba011a1904c9fb62467b65a -909b41ad567a4d741b3813fb2955989a -6b809b39a0a46a9169f4db859663ebb7 -0da2ac555bb4df1b95c2482e19b3f69d -4736c55401db3a05ae6dbabf89133295 -ef403b20c412cb9e46e7859831d7abee -961666e004788edf9e751d461350f27a -5689663399bc0b6fec8c107866c65b26 -46dc66cf74689c57a92009a07ee976a9 -4dca28d39c883c265755c22e7e862688 -b2c53dac18aaa333ea14b46f51b18151 -94b1498250d321469a72fb0c71ba012a - - -10c1c4d475f9050f55a4f30d321f68c8 -3bfda8ed81210d7473e60dfd1c5fb2b9 -5da336a24e940842244ba5365f8f391a -f3f0b68b3af528ca89254103743c048e -3d403bb930953d625b0a771484cc85e9 -a8642b488c4247b15aa815bd0fb20c3b -82f4dcbc8b788985f547dccef636c95e -71a6cf09e9f6d0f95ada2ec5d99b3865 -640883a64b98eca9219958f0c9a3c777 -166b5085bfb3eaa3d73326a8829a34b3 -e24a05f22bf8f9d91fb17899c3ac56fd -0813f938cc098ddc751cbef6bdecf7cd -030c9387085c667ce9014f8f17dc0908 -11510868ce8e8ed585a6ad563ee22a9d -a1fef4cefd9e43603349f8e4d9775029 -e38d30e0053468a2789af17d38f9c444 -a6472d528369b797a46bfb37d6ed972c -1415a98b14e5cb9afe748c674bae25af -ae7676fbfbf82586f79479b56756cce1 -1805943c3c41a0aece435f873cb86703 -a19b5c291ea2495e2432a27a54353606 -14eaed2d73022fca3bebfae0052b0c6b -c4b9c95d9f742081196beb6e72ded20f -b1f0a29724f70701011af095dccf9da6 -58d03455e940b51010a2a56a8cb04ef8 -a0bc93f53f35404900f567504449f73f -0c7f9b9d0824505bd03fa82b4cc753a3 -9683369b3890d4830e9e0ba0e65743f3 -95cffdc2b1e72e9b8baae9e00aff08ec -fbcb93b073c2737f2238a68e0e8d173f -457178c3e1e5a10eeab9f0f920df8926 -93e6fff7bffc55153d9c2859ac28e48b -6d10783b288fe54b3e50f828992d0745 -4ab54cbceb647be525aab443e86249a2 -e9421d09d8e14616be9571c92125933c -166b5085bfb3eaa3d73326a8829a34b3 -1b3f37880568ec36e07297ddc71e2baa -746058795a92d2278489bdac1c9eb850 -6d10783b288fe54b3e50f828992d0745 -a23c0a40efc09de6a7640b5d0d9f4bb7 -94ac3c915312d3e4445343bc99be0c54 -68b71eb39de968b214aee59c7aee63f2 -25b67ef8c30f1bd5520742c943025538 -bd17ba6ddc0c45fa6b7b7dd3704a88d7 - - - - -199ceffa80f4db1e3e7fabf74bdee32a - - -1ccdf2386a0f9ccdfb330c73d94e605e - - -8fe98c303f4642d919ff7dae5b865d27 - - -1a40d00a1e7269a80e45923f67e9f5a8 - - - - -29cae020df4221ec9a54a36e438be517 -aa68d711d69293957a9d69db1c22f3be -94161501225717d85d7af627537051dc -5f5f5bd5be56890be74c690e2e4f6086 -af3ca2bf26f0465023bfd82c10ceed89 -b3a3740510a41e510d98725bfde5aca1 -27052de320e652808dc308d56fa81fe7 -bc0f7acea73bdce2b414d78535b14cfd -e624f3976c3f5d726a8353432a0c04c5 -a669661b6cffcb1f6c6968250494896b -fe59a2b5f8216e2b157a6212f00bcede -946892a6b29f610bc2f7cf99907fd673 -609b886e7db3455e35fa3345a5f5ae5a -c892f44e925b21a4d6fb5ac6d22e6a85 -65501c86d18f49ebf32bc3c0fd47e062 -873efeaea1762bc8e6de524749521803 -3148092fecba9ead1ca889d868fa02b0 -08a8916335ace5bb4b9805d1e0b5e8fe -cc8c47d1fa6dc294be5701efd1dd591d -5ec51fdbf3e58f8b64eaa81989c45271 -6ef2e8666ba15887ea19211bdaee8e23 -a7541c8b7e02be34e75512b856fa1ec2 -94bd08b7859e9bb2140e6b70cb4a1ac8 -bff0ad390064c7e2b31462f7ddbc3f88 -7878235b2a665f85fddf9c4766d0a291 -53fe627e8236690664d6028a094d4ae1 -bd55061fbf3f78a7b9b9464931850d24 -15a2d96bc1446cd93b5255d9e3b635ab -3d878037e552a800898f385252a66132 -6bfd83d6b548af1f492860ad787efd3c -4d1c5569f6eecc77b5fd1f5ad572809a -e0b09b89fcc0a67e97eb9ad4d2d5f739 -b40fa1136de474a69e6d4915f9b2a80c -bc5dd6a30e2267713c4098bcc4f45f4a -642139f0e9e5b65eda856a5f326fc79c -eac379790742d4618280407a55ef80f0 -a3c84f9f621ddc0c5b98da56c129dba7 -f48d59c4c07611f93063308a88147075 -477d93050f1263cc40ac9d69d1f535aa -bf69258cea05265f4726b82ce0cf7438 -84d768fe278aa3543546547897608946 -fa411083fb752aa47a0245c18e4ccfe2 -0030a0fa29b1ca57e61e6ac61e0674d2 -a7804359a276810cab36d93aaeb215bc -a0b1c3ef87e7644e083a4686df3c52eb -8debd5c821e24b704f66f0a10b4e2e6b -789b2d89b82a91a1af067b9d83442f03 -d2f253d3da990772bb926b6012bfc18d -13ea49b54ede207b559c1a3fa8229e60 -aaf1d42d655eb5d01f0c50c071989e5a -84a6b4aa628062a1976a05c7de342247 -79ef0811865c309f1565784a027c32ae -e385f2a5a742c08c33df37979ac7ede2 -7cc05403e345ccb5e96f61d7fb36830f -1ea16ffec75ea17ba8ad18b473a796fa -113bb3671892d3362a7af53f18e00a5d -be0e97b53e0da1f6b756f0d4c55cf022 -eba21292ad522a1f5a116d783cae786c -524ddf7870ecd5c6fe899640bbac2029 -880f18b929ba47f3eecc446da05e63f0 -dfa31e414e448bae60fcf506f383c1e8 -0c06b2e3cdf0f98380812e3aba9f4dc3 -9fed987110c75de38190452dbef8fe5c -90f6dab5e408048c9bccc711302eb9a7 -6083f371e6147be632379528b0e47a4b - - -59caae8ab95b2eeba9444ba219446c75 - - -d23aac026cedcbfd9ac907d8b381c409 - - -e5bf44e2803bf12aaa79208bc33bf39d -625acbfb79ef0ef7c548312fad2026c8 - - -825ad0b1b3d2856a9919701895c301dc -59768a023b4746ce905b48b15b701eb5 - - -103d78b92539c7b44f22373d06f1d767 -28367261bd0930840d0fcd563299da80 -91e3aed95d9eaff1179580268c668ad8 -0087533a55047448cc2fa174051fc466 -1f8a24000c0a982800c0eacd1c33c5ff -9a0637260928288f4da423cfe527c2ce -eb997b9d9f545d0e417ff6b6f835e1b4 -783c6fe18aa38884e7308148bbf8a284 -a6bb840e317357a855e7970e0197aa49 -93cd0b3f03eb9bba86c79509810f9dcd -761e3fc90e2c4675f75bccba7ba9aa5e -0c554ac4e30366566ca47133eb068084 -26617630e0aa5bbcc4c28872dde424b4 -d77471c5ba4d6b0aafd041b366c089cd -bc29ea9a5bddfc52d70edbf81d340186 -93d0d0a5c0f829d01b9eb2d4c53c6bee -f4aef961a8314c0aa559cd22ac8bed79 -96ad06e54daef6725d2dcbac1cb90a42 -5660169f40ed8a6aea22a178864198b9 -5d7e7485d9832042e8da7a420663ca26 -6e1d92ef906107124621ff5c541de67a -eca38931fc26931ac695d6ebc8b1d470 -5ae453453198e5403d1673163e468224 -9f7dd0c7c5c0bd66ee32e2514ffc028a -f51640826ce645e6ecca937c5375c92f -a29cc607c2198093066636105cfc0007 -91dcdd9171330bf1fe2a68c75781cacc -44ba81bf0aafabbcb26d420346eb959c -dcff781648fe33410c48967931017e2f -4bb67bf400590e434860f08db98fa46c -c45e4464772f1cbe27d9f14205f6f6e9 -8e92714657b67232e7bf174630be8a8f -d155b3131c606911d779b87473fd9a65 -3d980736a5e30ffe613edaecb0c60f72 -9536a078ef77aaff6c4db757e42efa78 -d5135f45590ce7bf7d0c902d13f6a2e3 -9636bdc181cbd89f1a3cf4a282309770 -ba52be3319719dea18f13a00e186dd8a -f5788fc7a0f1033f63da79e866548c85 -40883fb361fc5de2a4fffc39e1e23cac -e398480ad7b1c3e8e923368923e344d2 -5e46c8a04b9765c01d9386747fdd1bae -5c389e5703aaa95c615231c9be30fc33 -a405f65660a02154d2cd022d21a8f816 -44d36c782ef3bd210e3880685b20d9ad -83e90e9669014742999eda33936167e6 -b2eb70b61009ce12a9b62f89d1853728 -f712b155531e614b9fa18a9e99fef5d4 -4fb44b127ca30b811af3230159460f1c -1859d4258d23bf9ab57ceabad5ac0a07 -abf3374cceab6e094a48b353980eced3 -42c4aadf8ac6bf0b4784adb23eb04d64 -b740cd6c774df05b4c924cf0f42b5b13 -26070cb9eb665c0c4758e0c5b133c283 -25a7e146d67fd2720cb6ea10cd21bbe7 -fe8c72747f740588ef09b74c3445f444 -6bf8714bb481b3511e42d6df5fac1ca7 -fec94613049294e536d3e4950fcc3dc7 -40e0aa210fca124252fed7e441e300fa -305778bf22b14d32832b1bbc5c167c8a -702865c717365f25ecfc9de0fb865db5 -59cf7de75879f055850f81ac48274d20 -0f3d7ac5cbba9e704e0d26d8b515b371 -34d7f6131031d76a22cc316260cc65af -bd97c5e7cd704fe29b5036cc107c4e12 - - -18a80c4fdd6880bd19be5a10dabdb048 - - -60e76204774e71ef96b26185d68d38c4 - - -426f07c0798e1505ba9e971f2dd47313 - - -0e3faa2a3959f81d79377f971b7aca93 -274f439e4dfc674581c0c72fbc7ed430 - - -a519b7d68b3059c94689ff74a4740d8e - - -6159fdae83bd1af5e503ced6c485d7f9 -9edbcb7c5c4a7302017327b91b101a0d -fd3527c05093fddefcbf6211d2894c2c -df20aeaa69ef080a06060eba30d1e658 -9f4c93b61a1c68dd9bd30039a29add31 -98ae0c9ccdbeb50ba601b98bf67cf6d8 -00f978d26f57a925cbb25655a8611582 -9fe7f36dd10f438653ed48ca9373137a -11116f8d3cf5c4ef1be973f9e6abd134 -0b600c49e6886b114468455404dfedab -85145018ad16e0ab05c8f50f61e0794e -69ce2bbcad4a3ebab718ee1dd8d712d3 -e43a69585d1b9a065c06fdc43bf05e9b -8439670b64da2645d451a6b7fa17a75f -0539ca2a10f92b1f7e2d2ae8d8c8033c -a46fcde339e4260686e19c1074ea006a -7603a607972637b1c0ff71e2596527ca -b928bdce0d72bed17fe44576c42982e4 -1b1c432b9dae46e45d8bb8f59a93b0fa -ea27fc1a059305edd6a37bdde556eceb -9e574aa8ef5742657d4761ea590bcc02 -3251760626952fcae88770155112e9a5 -eb2bd9a3a7ac1a61a4f6bcdf81ec67b3 -46a3b08d3faf5bb3625bc38218d47d3e -58c4b49556ec3db5e02b1cbccc70b5b3 -3a5f3bf957587a46b9a704956ff1481a -ae24380f9d45f4b7bac2050ce8dfb3c8 -f679ac711c84e892be1c2e6360661ea3 -697a2829a99eb956dbd10748c117cc78 -a5dbc5478b058344cab126fe37e81205 -193d4af6e0e6712b7a209fd67e93abf3 -e2983c0de2b9fb5cd06f1b5811e7adc5 -4d167ba23f487bb71f7c8d2cbec38864 -28daa476010b8e6e78cbaaa8568a6611 -e3b9a6128f379e070c4b5899707a0602 -dc4cd9fc4b1168633b3795cc782a5321 -441cdfd7ba1feb089bc3a423d068f9e0 -ae79a19f64be5aea70c115f8255dd835 -f7d3b25b8383affe405ccc7d5520a037 -5b50d480029b579c532f51bf70375b3d -d60b5ff021116b6d23a72201fd71fae6 -213a4fcd11e4b256bea106c5b270ceb8 -390d090c861a2fb31df9cc8b61ccd3b8 -3a004ec9782fe8641061c737bcc4c5b4 -e2cf998acb9c8017f3ceeff4f583593e -deef6c173ca516df1dc003198865ef82 -8ba7cf9afe2511eab38617b27953a20b -90a818a12527d815dde625cc0cde03d8 -6363f698668a40602f462850d4c25f12 -d10483f203f2d03ca7c2d05b87ae7bbb -baf082b9e90e7e4d6812bbf0373cc607 -4271b68296af1b267b960df4e1794fe3 -d3134c6c9a847c3459c89ac6a7e29ad3 -cc19e43dd168d6be5e21701a6ed7e32a -d1204c1552417abbd0552a30f9518329 -b3b6cc0f994d14e8a62103c8bfc21882 -e304041ed01654e365947acc9fb1d14c -3dadee4718b9777aef137e589260ef71 -82b7ec40dda186fb73fe7cd1ac4fc1db -2ca3a315405f31ee3b8964a3a46989c4 -57d4381904bcc9a1447b416b782637e0 -9baadd2aa9e1de012fddc697c09cad3f -a99cbc0f37a87adc024e1b73c90f020b -f804896363c3c3fa6efe77015da7f7b5 -7833b5dbb1acb30e57e3c6b041b21f2c - - -69093bdaa5daeae6c38aaff4fd56889a - - -6cd8f5c9f1717ee73ceba5683d9a8a8e -406082d01ab1415f333b23bceecb9e2c - - -8e3cffa1da8be98668c562421fc859f4 -7f4d91d401913000068e27694421094c - - -73181022f59b20bf9878c2f4ab88dcfc -54b9e40db64a48de20f8d0643f1224d6 -4eb088fc41f820bfadb4930da1669e46 -dd814a607d93845515a52317fff7d7a2 -dc6144c7724d4e5d4574847c7b63fc6d -c84423522d204853ccddb147550f342a -69835eb2a149e57a6bdcf506cdd470e4 -6d2f4f0c4588bab4192c5aa999f39e27 -3e58a741e320f2e35a95cb1df2ee7e6a -f540b3ee0426841d5c3b410ac223642b -dd3e4baee07ad530f36b53c699934600 -c718afa7838175f9d03ddbc04dfca03c -01b0e97a8103bc9b715f35b4ebad33cc -7666e65fc755c867b1aabc0217fcefae -49bcefc242ac99efdf656f0f95757eb6 -7632beb918653ccbbfcc1943e9739d3e -7d6596134647efe995e984474a711bfd -47a41514248347535aeca61eb3e5f87f -bd3283d5022bfd341064e344c0188365 -591551f798f0cfd1507bd360c4ca8777 -7835fd21fa3387409f2cfda2adf3bbb0 -ccf3bd5df0a92678efeebb27ba759e33 -b576e50720b63f798eefb315703c8cff -733abe84eaf125cfff136c23c09bad77 -ed1d4ac42414cbbf8d0a8fcce9be5aea -2efed899cb065cd7ec7f0e3c2e012396 -02684a3aa4e0fa3c70c8f3ac18ec44e6 -753f7961e38db702eb94f35a5ec0a691 -de1a854afa7be8bffb6094cea1ae0f49 -f74615c4acf2c37adce3468715ce1883 -6627e78497bebbfe7d03c9e5929951d1 -acc7f66154278876e21c427c3d31eb75 -2a9472fdeb3f13f6e9a7e05ccb5a5666 -b6f9dee6600c7c3e668af4b732be80f3 -2f03bb3e6cc6e7af97d2e139cdbc373f -c38283cdeaa95378218d3665cc597c9b -fe7c7f4957cf56fbd2fc5d04489bdbbc -1a326cb3e268428027376c7968813552 -0cb79627c76e9f5a2f6d0028fd5b9c7a -4790650b0d5ff5ee1d53c743eb0eceb1 -0b190ad7f8168e07facfa8d4d34c665b -ff05ba323fcc1b2f9b31fe6085ecf329 -51086417bb7cf0f16f213a9bdb571002 -46713812c6e45c0243387d22d6f8622a -0b83651cbd18a25b1278851cb42c7a16 -fcf4a19d65287dc290223e9555f6e7a2 -7f9810edad92becc0a5fa850f4d92550 -197b01e4a102e93a75a70a0a80789885 -db0c97e5870453e77ba448f874662423 -78a6e71c5b6002761a34323f85e03946 -b144bf1399a9c3bf537f87091ac51af1 -898721e70adc38efbdbcb3757dce762a -387a6465de40b3d3e07d68612c97a169 -a1666383d423bf454b13130f0d4fc234 -1236fa5e516b6ddfe391f42c142d120e -6a8173b88aadb794a256bbb80862dd37 -79c3ea0423816e32bfe05ebacdb52cd7 -ef7d42f093f18a724028545bd3e10c0d -f3099ec7f12a24bd061fe25d1182b16a -6c4381828243cc9d1e84080df62cf43e -2a1ec952faff1c8a3896d599a031f928 -3232538a85b81791d4ddf6aa78457ca9 -e9a6b8f89d741f5f66cdebe5338b94dd -a94d05759d168786d31b91b9b742a47f -38fb12879e47ec572fef934b1224b272 - - -0e01bf38772c698d9b5d4c2aed89bacd - - -49888cb47623a90b671b82c07bfd7755 -903f2c24d07168492b4cd9d513366b36 -0018a234ac89fade98a4a34b682c0be7 - - -2f05ce9a8e0b064f051662429cbe7c15 -730b2178e96e36abf7595d4663cb9a71 -2c98b4264c72874757a6eb6ba708f159 -b981877c761b388a5c2258afe118ab07 - - -6104899503d5d45f216a16d791cdc09a - - -d9ce94791fae3da15baf022e148f1e4c -20ca93c037764476146e9c796578136b -4dd56c9562abd48648ce1b2b01228ced -97aa4dcdb5e27a85ca72cd7b5643d898 -6f4ba2870ce64b0bcd7860f07b973b45 -3470a858bb82cab07c13cb8da67331b6 -4034e1ac9e465861e63834c81d25a9c0 -f0b9c426b53cae801ca7ab42d177e054 -d0843e2cb2d7e1b2a5e0196105f5f070 -ae64505398e6f6127250864b1d4595b3 -2fd82abbbebc9d5522dc7a30a9cc48ba -0421ee072598da0de952f933934f78a4 -4a74c457308e13e3c87fb50bc2aff7c0 -25e9da32e0d667a6ba31cb66ab137ead -d0b080b2b4cfb85b9b477ea971f46cbf -583da2de81547e5be899003c87f014fa -cef772a0f10113e3ef7a4854468d6158 -cbdfb8bccf81c07de980f3858e8e8de3 -0b53b51d64ab737e7d26622301c0b4e6 -b004ca49e480496fcb1eb2d2265d9f96 -a278f525013fe44144bfb76f9ccd641c -5d8ca0b11276d0a1eacb6450b0cd08e9 -ef0f2197c4ed9038bd237e51c1119083 -f4d1dcbc3360000d88060e8673191fdd -992cd98766048aa3d405082a639a43ef -8ef83741c8ac64ad956e4dfce8cac46c -19683d962a67840e10fd8d271249d4d6 -85373c1eab9eafb64dd708e57a9652c6 -9ab450d8da00188c33ea6825c0f9709f -983176b7f9a38f2275ef35074adfb5f8 -c2fe480cbe6df6aa629f79205abf89ba -ca90a99c6e63f993b11bb52b5252686f -4df3f182d365fb49852aa6273624550b -e72b0a117ab12047daf8d764b09d7351 -45b0f1a4f0d307ee461daab3e053d1c3 -55bf774a83d9f08bff1982bcff33c58f -fc3fdd0cc9040c14b18c9e6481c07308 -c772ea24f117d1f1ae698f9465096330 -18bd2fdf15e5ec00f94519e5209ef0e4 -d8ea9bc8825d21950867672bf140f0b7 -65ab78bb8d883c44f7bf266727b01154 -43def4256809d3b496c5eaa92355b21f -e33dbf7e21300e1982478524e3328d47 -01d72c29793cc7a5002a9a62dc44c216 -7cebeda4fde32a8b9122e600898a4f27 -1ca687ead00d32ac93356c70d0228ffd -6371a45ca52232c3c7fe46c3fd46ed82 -a24a6c90c177a114c8ab214f43db7227 -5c5dae956041d12cd573c0772fff75df -1c6762de88604a103c1b58fb1a662abc -b190e581221f6047139c48495ebeeee8 -5a4c29b8a92a8cbf912ceed74f841f3f -94f01242b07d2f8dd29b2e92717bdea1 -1177ccafd6fb5aa04c46267b1d9d57da -d44bf025db4cf0641339b169a3026bc7 -5c62739ccd5a7703ea322654c547b828 -a6316fbaf0b2fc38b90c5d8129e26585 -082aec1700e31d4aa0757c90bbff0fef -60aa29a1d281796d255d19faf9463054 -00561b49649191b0a71485544966de56 -2ae2f8de46573581587b3de66f31ef91 -2d2aa3b671e422ad187b8853e4b8a663 -030248e13d61044617b36ca9258f0f53 -cd691dcd5065f061270d8aef246d9926 -467a15fbd135255d8b985d7f7128c0df - - -721ef95b0094678f4649627ae2a59ec4 - - -47f605252aadd95c22ed142487fda3e7 - - -a9db294fbbbc538ff69acd16bcde77ed - - -ded3536eb6bd8367ddd587208fdba17b -2955312fb19060fa52335738166dab24 -ed6373c1cf9664f89677f1473bde78e0 -1a44bb2817f115f6bf09b61e427874b2 -d3649532a1f1d2658612b9a2438d1f3c -ce1968612d19b12dcaa0f23d2c706b12 -f25537156afccc498651cca80653bc1e -1fd4473d532968de389a013d36f2a914 -82c923a6d8eac43529db9454b6896da0 -dcc52b5fcec6dd9a750706a183d2077f -64922684ecbbd977ff4a62dc3defdc29 -91e57c2a6ca916abfb93ad816ddd282b -dca7b982f3b3a0b6b7114bc235183406 -5cc925aa61a6685427d8ba500f60fe6b -70128a5a069c6b8bb3e28b0b78152367 -69b71ce05c903e216985aa9fc96fdcf0 -9b2244878e75c71967bf01f2dd217966 -3725dfdb6e00fd0e4d228795cc0076d6 -c55a4c1fe097d828d7bd557bf7af3b25 -08385f3ce4a8944aa1add96eee4423ce -f07fd40e9f0077c6061735334e821a12 -b2ad24ba470caf1822a033068c2f5d04 -1778b1eb3ec6b1be10c911d90bfc94ea -556faee4f11b76b177670129f265f32e -fed13cdc809292d38bada26c3910819a -b0bdb73b954927ab13d03cec657b37db -956143bb0094112c6bd7ada797769f38 -34be78b149a33a71840589c3161b5b32 -9e2903286b57a62c10ed5cba13a145da -c4474420362ccb81e28d4c5d396a974c -5b0f43fb465391007323fc5c51150bdd -447be9a5f4e25c354c3909903958455a -9888c7ab412bad56a50d6a546dd2e626 -d2fbebcb7ac9df6a712fad7542d93246 -9da73a507611f6af7ebe245ee18ec2ab -95f8ae53a869fd085673a4784152f98b -2bf7122c99b995086352e4f5eac031b8 -4af94d5bdb7445f5c1455525fa7a62a6 -22a02121c600bc405c09922e67669dd1 -9c7f8976a8811574572cb539951c3e4d -874cd0d750097e4388bf080d4605a14d -5112d3d0e6b168205f1415c5560ddcee -c35abec32cac88c8f99563d57fe72e19 -3c0855eb04dbae353c6df0b3693fe665 -8d29804923af78a0f08d313dbfdb0ca0 -549e960585234537e6edfb8efedee332 -43284e48689e1bfa47a7defc8ca917e8 -f2405f4b1ed3fa5cef58bc9b241e1c7e -7b71d5f1df04ff8392feca405e30c6b7 -2c135f756f61df947e60011e91dadc17 -9355ecb8ad755e35cf0d906c8a465c30 -43e63cc0ab2b1bc17b9a1fd8ca5b36b2 -84dacd07224a53e620f85d73fbf823e1 -c7c3c86b13013ddafa7d90ef7829ee29 -f46713c1c4436a3d990c5cd84ad30408 -e4107bf5f6c3285c0fc82216bb1ebab3 -0aed04b86a560ab648c192cb9394f5f5 -3a6259971dddce3b5f86e1c1f601d2de -99d015c5245fef946e83c7fd88babb6b -c51c27077b88205e6c2e9a48951134d1 -1a0e873aebac4c801ba0fed76aad5356 -86890967051f85f1036c09ee102383c7 -727c747367056852713f2b48fe53c1ec -4aff18a10cca1c7494bc0ae2d4543bed -de190041813ba9927ac49ae4fe5f453d - - -c724101436b085bf318e695fd784d658 - - - - -b3b0f9faec2fc85f3fbac8baa7d6a9a6 -6a4e6aba870e354e6d3ebfac7c01f0ff -632e4ba7dcd3de3168feb70553e922b7 -d8e7d709b1d1fd9959705811453bcf90 -2b3c7c04fd04dc7a09bb983fd580ff38 -68ae2d02f1e21c856b4cda0f13c8fd3a -f76e2f239d6971bc47a058bc15305298 -351cb9766dc5162cd586485546608283 - - -e7da2db71fb15e252c37925c2445b363 - - -2a3b6994a34aa08e1498614ce0e10819 -dd29581a73e753192f4dbf04f74bf738 -a58a10e05b789f241187b1006369699b -54a2d2266bd12c7fc1e7734af9f1dc2f -6a57578a3a7037d8534bf04867407f9a -e689320fd984d21795a04255fbb7dc72 - - -00881f0b6ab571ca8597f5bc67cfc1f8 -f2c8ba56a466020fa2a741346e038a4f -c126b5531833a5c22877a89965351495 -4b8da5f77c31f0951abf9435c1a38dd2 -34a1d6c4f58e1a3317873decd61675fa -6c84866f916ce8ae2a791fde01ffd762 -c126b5531833a5c22877a89965351495 -b604706f8290dc2c1ad866158096dbc2 -754f06e960fe37a104640aaf1abccf00 -662f2bbce147ef131b715a7ed63c6e5e -a47285e8056bd94994455c9568d9a06a -65602c9e887f68bbb45eafca24e55c03 - - -a58a10e05b789f241187b1006369699b -cf8960630fd8d5d8a0dbfe3cc1cee4e9 -b91fc1fcf228706e250e51d10220e10a -5b4053803e467cbb0478b65635a4e5ea -45e670edcafe630482b368aae3c6c35a -bbbde17b0f3619486ef63a60f42632ca - - -4697bf31f23200726d4fa8da13ebf106 -b5f41268ad9db1a4578bbb4d5eb07b9e -bd72a5424aac4b4038a2f4cb2af74c8a -154583a21b3d64d8b26cf410f241793e -035255a8d30488964e4677513bc14789 -851dbeb4901fed90de52fe0d4336ce0b -41b3681c9defb8e0762bbf7c1397d821 -d754c0655472ca097ebdfe812abdb264 -096402ea8d76b9a8bc2c4cc56a4cd823 -2bd55711575c9ed0f34ce5d891e63cd5 -16fb1e3b659211cf67245486cbd9ef3d -68f6059323f7587650925bba9dc6caf7 -2281057903ffd3f5b0a4bf95ce8d3aee -dbd015b2051d98db083351905f5d03dd -bfa591574eed530ac9577fffa5fc543e -40750367691dd20603551d026b2cf4d4 -bee383a14dacb5f2ba3b1deb8b84f54d -53475de47389aedff8e7f9c603230184 -9d74fcb626d5beaabb3f6b6d3b7b8ef1 -96f19a72812f90d34846cf72b4bb09cc -a2c77b8f765e5d093138b59ddecee582 -a9bd287a830192f3038bb327df668791 -76f05447a6e19b0ba92e8913db3f0475 -59c3dc093e6bc0bc0881730531898dce -31cacba9e412c90a0f9f21e9ad9c81a0 -34100700bf8a90401fa1bc3863a5ef06 -1cc42aa2860a8d3c7f3e62cfa327e7cc -34c94d5146f17226fc5af7ac3ba81d6e -a2136087f9caf4b0cac18229f3690dc8 -8de0815b2069fb7f1cb1ec3044751918 -0a19bcccb97274a88b86003285637260 -8151355b62e2515b90d752fc32452a54 -f77470d1c3c831b2f443b8a1bb7e553f -b1cb4d617393d1f38502b65b988df321 -b9f778b98c45c31ec95691a1fc4740d3 -590f0e56dda084a184fad737e6b8d80c -a11798714ae699ee25d3f54265e4fb30 -6e4ca7bb21309d0864ff5b4c35d812ef -aba848bb94ad4ed9c3e4dc3089283444 -f2cd34ee65ce4804dd5f49d5d8d764ce -7371f1cb0309696c7d6ac33ad75a5c89 -bb155e898159727529c39dbfde416f01 -3f0605393e4248214bb0d8014121f1b6 -8b914474fc3f2502f64f5e8288443a34 -865cad73eb89c01651d884589bd4763f -194e20e5ee6c7a5c79eca598e1665bdc -687367c7a131a2b0b660f0ca30aabf73 -b6652eecc62028456111cf056d8b5812 -ca00bc92c1e71069f89c768e3176a0d5 -1721b63576167a05f0e306f6baabe3e0 -b2006f50997760d862e35c5c360226cb -15feaea674502dfb321e05240f7e10f9 -e0cf2713564fac2e99a72ee6ee57925a -2ea6dda2513d324414bbd8ac05b79d0f -e5f41d8abd451b44c5f92bfe6780b692 -65ebc33d28ef411e036d5649afea5d00 -aba59b9e43759d10a9da893198c8e9eb -8b1a3789e6ee83787a070eb690990dab -829c46e07c543f12879941999be47123 -b60a3bdd85a269e7dd90252f987e7c0e -613574e726883dbcd2d93c1e7e968f1f -0cde5a1109bd464ea2b1724328cc6a62 -560238a26a83c9a5772a0a66aa8c6496 -5df6c6102516a57c741fdfd303c4ecda -014e0b3032e71c8874ce0a44adae40fc - - -77404b5590596de508a542979f3cda84 - - - - -bfdeb2451b2f7fc2e429b93a7fbe8c8d - - -4cd22b579216b800efaebf4ad967f4b9 - - -58e184b5c2e12e749884af75e9df2365 - - -f63ef04a501398c9ea62416285a49ba3 - - -fcac34b6eefc89912ab4a9ad63e4d1dd - - - - -506ecd48c4eb7b26a27f25146983b6da -0f42549d7a1c92aacf4ac0d3fdd18a25 -c3c3ba226a9acb79b05712726b6ab3d7 -03c7c5297a51dcbe13f88cf72e010740 -402031221b6a5aafcba9c1f028f2aba9 -78c9cef5e3c130487178275af3eb12ee -0ff07e35235504d0f3b06105afab6922 -2b843f296f68153a645a90e297180a85 -a80b57f06217aa2116cc67cd53f6bff4 -a23d826c38c1829a2b4911d452244c1f -28640ff5a9b34be5798de29104f10709 -949665e8322fd9fed753cd9243e16e09 -a183f48bee470bdb205c3328c5372a9f -c2868310d29e3b390fdc6c7453f4e222 -8e1cb6be2143e1d41d29e97d5aeea8d1 -807822cc53f25e63e2e3ab54a4eef2d0 -f485cde96f056c42868745ba54a744f8 -69d62596107f4be1d2b435856c56582f -a9fb0f1230286144a33fca5a1a141fcd -575c8f0b0a3052d9f993139374d50acb -b560d8814737ffc35d0d250d07e3aa4d -026a3b563a858ecd4c8441feb88aa332 -11030fbdd985c52ff97b2295a2dd8d22 -c956d479542d9762707617ab46283e94 -07633bb947e7004df22a1d4b59179644 -e622810a8a875363e00f5a020051837b -8b33d7da529c59b8564d7d40fb9c262a -85501e3ec766837f57886c9c0f04d010 -950d2c68708d84790cc279a62f0b1135 -409a6cd22ff78013b3d29080f1a165a9 -c7b669a5bc86de8f785342c666ef1a0c -ac9abd799f64b2ec55406c26da23bb55 -c1057178c24b2f34816c5830dfbbc730 -02dde6e74ea514cb0da1612219cf0564 -f087349a358e5cfe09b9904ba75f7b96 -10892847c57ac4058eb41a7699d333c2 -4e96ccaaa0f067c0d849d0face6a5bd1 -e641dac10a7da90286a2f36f99efec59 -4ed5332265904758626a4377406acdf1 -600beef9a502a6ae30698365fb805257 -29278f465cbc15084b428ed2c7cb87b3 -a4b95999f598abaa2735d67eca2b5a86 -d37340d5af6d82bb1a77a34d13c7197c -9ca4eac488b90f3a72d3ae5e09ba7350 -2a22876139cb9189d8c27a18e1a243d7 -d8304fe1ad07e1c3da0d2ad88530f921 - - -befacdcc4c5bf6a333b8c82fbebe282c - - -278509efbcd2e9f657549d42026b8bf5 - - -c3e3c06d870a13664c24c1e574991f51 - - -14e21c3045d6d3010e816af81d7c7280 - - -3ab6eedbe157562250a547ab1d140a0f -c2a02db9de9a83f9cb7cd3cec201cd47 -f7ff8a37607cd52def859f873c3aeefa -ccd381d3458fb877783dcb47c53ab08e -e35a5053002efed30027b668d3116a97 -912024b336921503608fc4d50975f1d0 -125659976e92f59646b96a2fdd0d3b1a -707af5608d5b3e9a09c6574224914794 -11c4cc9af3ca2fcee8f4e4975c3e7833 -633f9363b12fd8f5574143515b642778 -5075e143b281199f63bfdd5449e133e7 -a62af33f465e0aa663f820ca0188ebf6 -1b47bf9766d8cacf2c3c0b60ebe9b3fa -a879ee599be9760dc40840a4a462ba8d -862ae0b77e8e317ccd6d0ef3e0732c6c -ca0a707dcc754a2fa7bf605227ff0295 -eaae9bbcd84423d52427e1dd96156b58 -04abfacd63b51bd4c4a8ec2dd1de0b67 -dcc55d206882c2af68ad8235ac97e58e -2c4d13185c75c8202f65022c08963603 -d1c600b4fa86d245f27f6818a17c6424 -7b5b25a1ba0b52eff518e0349b5e35c2 -ac0a5489a29d733677ac7c89b2416864 -c8711285309c46d1bc5be14e05c6ca65 -e45f716f7591e5575fea3180860563f8 -428d1e617fee4fe79b92966ffaa11f25 -eaec7ae1c8140a8bdd1eeba5da986e67 -082f5b7b4ba85be86d80f0b0f3a50400 -04b5620bab2a6621242e6b85c28e70d6 -c44f1f2c607e519fd0a6cc63b54fc5d1 -15b63e1087678a477cb5b833fb150076 -16849e53c607a199f35149e1478b5e03 -1dbe78ce97802d95f9193acf560c03be -768bc69f53d627b4e7b21d7f75f09a6e -d44b85bca880e33db65127aef31ddb39 -de5ccff459a14c59484a89205a1d959b -c8f0ec91653ae8fc3a38518e37913ebd -81ba5aa271152c52adc4d764982ee4b8 -9fa62494bae4149b94cc915a54668d05 -2f747bebb1bcef6255f8650a89376ace -0969a2f1c9794642dc22682e361779dd -62c2c4e3044de63b8aa11b2dfb44809a -8557b50fe97da45ac8756f6a4d1bdf34 -56be4a409e9704646ea9f669dd494282 -d8f3fe396763c0a89ba5fae99200520b -8f6f74a2ba3a2401b58854bb90acae89 -eeabb7881affe487a960606edd42116d -d89c3500a22fa7e1c9240129f1d83ecb -c5768fe0f893de17c8f00d3bf9f4db5c -206fb09e8f296ebd9f85be9cb9289f66 -22f8a939a2db8688c01e1f7b89f02ec8 -983c46a1d76f8a56d22ce5618d24789a -1afbc4cfd5e597e995e7278fe3812d61 -685224eba8e14dbb8c1398b050f461af -b6dfc5cb64d2bab4af5f89b5812198a1 -50153673c580b797448b17ec9798a1ee -4ca6b5dfed4c6ac285513a051edb338b -429ae70fad42b952f7220f7186025eff -775ce9f1464a0211651bf0f8a5bfa18c -b4637f410375f835ed3c90b1f72892de -0f4799a4d2b537dab1a4d44629794997 -5257dc2bf2a5dd7a5458814123977586 -7dccd26f16fd1ba6d82647d69fd7e829 -156cffe6d029da83a426aef7d3982fb5 -d308aa05a2f05245f060c391dd6f93f6 - - -88a94d80df79c5b40fddfc38c462b99a - - -7e244ea49524cac297c2db935bc4c3f6 - - -005e92a64e62ee70165293969f7e8ad4 -10a79e01588ef824071560db0833603c - - -bc35a09be3c5f9a7107b2b011cda6e7a - - -fa3dc191f76e8fc8ed5790524bc1ed43 -9f68c3e8bfa450b72ee7d17acafb297f -7385d48ac2e6148a6f1b60432b7dc8dc -5b68d8515f0127c01755f84a8dbc75d9 -e514fbc10583cf759b04cdb8443e0a2c -5fb9bf0b10d1e7d0e2cb2a75ab8761f3 -b1e2c0f3fd0a52410a5941a05b34492d -f8ea6e5c8819bb16855cf4c9c551fb73 -fb65d82191472109ddf59b62d5779f2c -b18f1fe773329e1c368190a05096adea -cdcac5329fc8f57a9a7b420a88dc0ebb -9874abc53037f2f38f511e742e30ee4a -beedbd377d6231a9c75215c7ad0660ac -a33b0b16b842e712d9cdd77a7fdcbbc6 -57ad3dbec6bb122f9a0ca95f67c70814 -822eae32e99ca75914e16f03daac619d -47cd20e59d9e9e47f3cd269b9d6f7579 -9d5c60f11872665e5c3e7f13328892d0 -cd859bb39099199582d4e94380982de6 -0d879986f44f9c64632ccf168da9e4cc -51845e853f433558c35bfe844f0a9215 -7e1d2f38a17f9b41650d4bda8d3da264 -9d9d72c07c81e41dd427559c6d4007a8 -57929505563108105922fd66ed58d567 -fcbe711b3aadb001b4fb4a5c8fa7b76c -31396720b520b3bb9f8b3a3fb57d27a4 -cb383912b1e9fef30d0309e3754cab09 -a6c8966c4e93226e8fcccf99685cc4e7 -34d7acef8f0f218cab66da7c0e99211f -063ddca3bb7e703ba6d53dee0fa5019e -e1f12cc73c14812fe51a9170cceaad4f -e8b3b444682a1dc3efabe14653f1d0d2 -e4ee16b8821c426711570560dcac5871 -0283fc038e449adcd3616d4419f5d093 -7034fb1f10ffbe30036cd64a82cf6d13 -a46a6619f90e933ada76af43913e6996 -ebacade0265c156a14d9c4cd9ee1aea0 -8b6d54c4ab7c9789c177231a715aafbc -18d904050b6087e1a1878ed36f5bedbc -502d5d6d029eaab690bb4010ab28077b -592bce160e3975e31cb006370388efd7 -b34a109edace291b40a56bcfa8fa2f74 -1ba07c2b0466d37a57cabd2bc12739f3 -a204d5f90107479e7316f683c9c4607a -2c6e91a13693717a1183ea384ff43f8e -e017fcd72abfcdb3ada2ece84b141396 -9c8bac10a946e485681c9854eb064c0b -b4f13b20b3790186ae2baf051be79aec -939d4ddac16edb5b36a415b15b165ff9 -2ea9f6817c3f70cb4c3d7ecb451b4746 -31023158e7c92530f262bf9e159ecb1c -f3d44a5a85bbd3e013cd4de3341e89d5 -a1acff3c4e6bc6ab9e79fb506ae661b5 -0b703646c93500a79347305f812c806c -52dbc06b316a3b71818fc804c9fa420e -e1a4a79048eb46e05113a865859fdb37 -65d22dc7f7eb7575986f3593604bcba1 -16243b5859d618d8a65a7f462980737d -5087e6d1810e83275b6af4fd1726a70e -125f68078e5e6a1e9d11b75d15797900 -b3ed03c588eff65bc0815b9600b11a69 -0aeb60633dd742edefb678f90d680718 -4cf9f56d8067e2de5add44f6ac08aa39 -b1581f30826aeb7c9bf791425b67887a -1c4b03c6d879c610365522f9d88fb95d - - -365c361ff007348b8f79006a19e74e09 - - -8a46d92eab527b57b421805b53b35193 - - -65555bcd6129a59922d4844a51f2a66e -e84bef582a60d7baee95406173f95c6d - - -ec300fcfe3b8060c918daee81cb6e740 - - -72456b00bf57c2bdca437c5c48135647 - - -79f403eec1d865029f24b8c32978e6e3 -d4ed67350cd0982247ca9d3e0f382c5d -38e93f63a3878a77e0e9ffc271c09fc5 -2dee15542d8f9756bff59c4c511bb5cc -2aa4dc4d5f969a199fcad338789a8ff5 -ca41301b89d8410100e0a0c288ccf977 -cddfcc06e590e90644d3d3e33b3f034e -ed91c73f2ac84ce445e2a0e8fbd36743 -c08f2440712c7c5504bcf5e4effcfc42 -e85575ae819585f25a8e7beb4bd86d00 -7ae5fd6013f4e76bfd2b8f43b6366044 -ba37b327f20d13a6381021aa9c4884e4 -758369d0784d0502680cd28c4966ca61 -298deec06a5177e42ed9f206a84dbf8f -79e08909b35f69f1ceb781254f2c607a -b48112fecbb1cf9b8f59a18dec1fa552 -dbc9531550440dcd06127ad3effc4a77 -fa73136cfbdfc9a98fc14cc0b60f287f -231416aaed1db74048f5042045f82ecb -e7a7ffc954bd797c1fa91de37ad284e9 -31f7ae6a20c4f0c4ae09f09c123d63f5 -b1052ffcd0411db4d2d7de9171dd1626 -d11ce33f08a9512a484a123640c5b5ae -f2461e9e90ba08a3bff9224c58923254 -756af74d72e5f473bcf7ee412df4748e -b8cc34ce3dde40ee25ff9883c78ec9f1 -007ad466b9de8d487aa4031316141e1d -4df0a837930869243f02395fb75ad97d -3b4dda2859c74f4bfdabb95492dd9280 -d00ff3e12914fdfa24e295270d70a749 -be03e591ed45adf75b4bc882e991572b -17e5efc6d1001460f09128243797d159 -cfa52487e324db96d0f065e1ee40bccf -3fc438d7b9078e8a825ffad968364f0e -135cdbde7d4014af5d8a53941e022bde -78abe963b940659c36e476174487e8b3 -426b43afe9927fd220415b0afa68679a -a29b9d99adde2ba2909b6f94b14d74f7 -9c737c70861de22fd0e3f03393808520 -b7ec82f70319afcec7e1c61084106286 -c4ce5c5861b21fbd5f931d2b446ae4a0 -4c82d9f492c61232fa53c199d1fc3934 -e33c94dedbc1d4f8d67fd6e840addb0f -8e9151bd050cd64a2de231ece857333c -0ee913e0599e8600eaea6ff34035af13 -88bb1d27e679bfa171113a1c69a078ed -b9e622859e98fcf8fb44f7226aaf16a1 -fce9852f312c03cadfa20b70ee7ca8ee -b1c2b62786638489504669075cf6b27c -0ce34481c49596f91a1ba6adf7e9b1e5 -ab11f34bd4155be2ec424adf7cee7d3a -61ea0d9489ecaf2f41988a00f3cbd9b3 -f95fe28a5aa8a210a900cd6ea52b67a8 -24c027a7a399d696469b17caa87c80a4 -1217616f0fc32f54deb52ff1e512ebde -c85a6538545fe3184cb1df6239850f9d -ded46de770d90adb4156d71e1502fdce -42ff4c35d96bf751db1202cb0f89a236 -4ebd5489630d7789a317438425c08280 -4580c046af8c3d573c7fdc41b8315fd2 -3526122cbc319aaab506326e9730d80e -b7f4e2eb0261882d091d08d5112317b9 -e900b5594bb0527f300f97e06c187384 -3aec21be1a3d90b65fe4b8e29b0f1f03 -d9b9888e1625142da3eb8731a964a36f - - - - -78a50a94432d86044f05c1a287b9c071 - - -cf2a58dbf1d1b58a5cf40a053b23fd3b - - -08e157806b9d8deceea99c99f1f63c1a - - -97eb305e815b69a291d4cb1f59896b68 -81c71033f134ccbe045fdb1712bb6eb1 -97eb305e815b69a291d4cb1f59896b68 - - -5c4a2600c7b5e80fed83112a6a594d4a -08e157806b9d8deceea99c99f1f63c1a - - -a51873ca0099f6148114532d9d56ed81 -549c90e46303cef910afd3d8af1be63e -1a3460d32cada73ea61c05cdac89f199 -e4bccb7903f9cc37f2a5b758a64bfeb9 -accf7951f475a87a9467498d58f55b4b -5c78c6047674bd80d65b295c9739443b -6b268a08ba04c73389cdbe40b43e02d6 -e136cff7ab9e595bffb5a5b3d71bf6ba -06eefb58b35916b5e82c8db0dd4f1e1a -a0626961fb2ee10b5372dc79428615c8 -3b506686090dc9c874f243505121d0eb -b3d67d0b1356d80f548c3c2f48bbd21d -2d8ea15d9cd527c9b6e940befa77a69f -ec0d0db678292150c81c5cb6efdd9124 -4c5566ae3f96d929ae07e8621c6001b6 -4de94dd78abc3d9bc5770ef7c5869895 -c61ff1e348b67b36a8448ee040797ef9 -4e0b2d6ad47a939cbd1aed18a3b18447 -abde8f135963a84439d39f6cef3342bb -1f8918e682f9da7d37aa17e94017384a -fab94f16ec6471dd6edc07ffe1a3d92f -b68897e92e920881b26ba8cb8403c53c -bf802d3ce72fea135d916e6beb47550f -1f0eff83daa5702fd156fc52633601f4 -4faf9a59c65d3587e028e8f209231ca4 -f78fa13842ee5d3d094c20ad6bad1f6a -5208c1dab4bd87a0ba9395e2053bbcb8 -868628aced072c27c25684f70bca43c0 -fbabac0f628ea94dc81ce720ffe5b518 -a8f24c81d4356c863d0312fe22d60682 -dba3d9b98aac5eedf4992a700ef43bb7 -ad925e2851b226d2f976075a6ceeafda -1365cb505cc38e32fb6e8c60c08a0b32 -791609c6bc4281feba925b1d9ffc41bb -4c71d865203bbed2c3e0cc613016ef16 -1bcfd3cea96c9ac5adb052f67a1d3468 -b62adcce233f417c439a3582598599e4 -dd7ace62fc1cf90e2f1aeb03140f332c -59b09897951b4ae8033095a679c7eaea -6fcf5f47fbe7ebcddec5f6ae0e712fe4 -b97a4d30e31f0da9a172d5c3420f77d4 -bb260c3a099a844105d259dd4e43e7c7 -166e20952300293e9b6c8fa8c48b3235 -559df83e590334268ca422c4ba7ad261 -e1211327091a19c78aca0ea542a12bc6 -c1f8a62dd7788a5d4993c3c38f28a459 -5e511d66b4ef4b960e7c0088137ba5da -f76258d204bfd2affbf78c075f255959 -910cd8728664a40c8fff90a42b329666 -5b717e20cad8756656a51b7d8f0e2815 -84f2c91ad62ba9a338031ede50f03a37 -825a3df16f2c1ade9b9d3094417db9d0 -a1c69fd47e495a974e2b0f27d3e61cd7 -8879893e08299e2cc3359a89b1be866b -269421e00bca25d525a924b61dc183d8 -b99a13b28a4220b6d44e0dbb71e6453e -5eba97b678bb765760b3083303750ebc -5a0fd20838f9ea420e236d2ac5fb0354 -722fc583fcaf8aa04dced888396b46b5 -3d6c8535c245323350a1bb1addd80283 -4cc2ae9ff71559bbe8c3ec9c2e0b0db1 -84c56529c746e9a255b446a856110eb8 -7ab4facaf458a4151978751e427e09c8 -cc9edb760200803033e74b717665ca51 -bd00db7de155418fde890169f111ba0d - - -e88cb5ee4055519600dcfd7a4bfb45cc - - -f07c4c80135c24e1767c97e892dd91d1 - - -09d96357be13183ecebe78a78594bae3 - - -37ca40ad2de204bdc31b776570b78f46 - - -8c1e9253480167775b996483294ee36f - - -c2e8095b6a0a8afda92cd11d30eb6a8b -8435905698e56cb4343a7aca9d56f8ea -dd5892a8544b3e8b00ebe1ea35c0e3a1 -ca5480758aa1dbb0afdf65b4429857d8 -b53338983384427805961c97ae6594e0 -1e7c9458e6d8747b4f113f4a115edd81 -e274f1f497f272001e290079cd057dd0 -184914a2152e0deff0a864793c1c4772 -87b8149044a984eae6fc351ddfd89cef -2cabf886429af06001b048dcdd2191fa -34c172bc776dc6e2fd7a0400f90acf5f -cd6bbcc0ae36e31539559dc2661fce08 -20816917ecd2e4dcb9775493400bfc17 -7062e01b179df61d63d268c66a9f46b2 -ad657c22136c9403be51eb81180ac630 -6634d42a866e9d1865a813520c322557 -962d6ba633f1681a012235ff79aa6953 -648d23549f0c9ffdd907ba5288573ab9 -5088de94dbc97c7e41956211f81c796c -9d636e84bafcfd303708a5a946ba7f0b -a0a207416e883b5590e61c0c69f95838 -daf8bd522c595c9524dc81a0c1ae692f -63032b8081ce5a2b366dc9d6b6595deb -b3ea90b5ebc790f7c45b0e6eec843bc4 -9671727fd23c033251676c862a1905b5 -8bfa9092cfe223046e08e52e73c0a961 -68e9d18cdd5f9a0c5535bc9d75f7e55f -ba6ee7d2e2714cfc26ba032e53f418b0 -9e9680de469660972b639a94f801b473 -3d7dc891dd108074b057aee494c9f16f -cfd65facfc85f50bce8561162bc9847c -90fd4bf888b0ac7f996ecc5d416ee6e2 -2ece63d1f03462376dbfb520a38cc0bc -f53576f970cd091b07516078ac9aa0cb -1c38d071cd56bc2c8a7c041bc523b96b -d7b9023040d400148647b1ab461f04d8 -82373d35e673d674a37b202ecc836f75 -9b96558d6967fee68825aa7f8bf30a6f -fda34032c64605a76f5eec353889b28a -df7b2860d7e2dddf4c38ddd17cf88009 -82c4f23da497d5e455883095774b8e74 -be1123f843fa34b639adf5fc0ed6e207 -70536fe0b9146c54d6785650174528eb -f5fcd399a62088eb1625b6d2124fabcf -30f0d6af687195da02d62f2a1d7d4277 -06fccb32b8a54154fe1550bbe266eba6 -f08f2e3366c04ba0104285dac3731337 -3e3b3127dba8c3d4d23f15570dc9bca0 -d8f8e228928d660038783a51593a7e10 -4edc60b7914df59a495749d51757ca34 -604860eda6d86d052407127da3555b0d -b032e9d995bff30f0e2c7c5300507b33 -0e5d1aab952117e0b2bc3a68b6547a98 -c08e4efbd854113a3ea6e134b9a6fafe -4c5ad546597e328452f5fde9f63b1c74 -e6b9dd5fd0911c0055118d0da4cf6bff -13492d0e4e3327c50611de639cca4212 -ef8602fb45d26e9c585b6f83d014a467 -2867007a78f3f919f590d8791a8c3592 -7f7f0f4172d4ce2f5520b91020a06d4c -0981ce1b80a31d780650cac53be31aec -3dbe4c6f39b6aaa0400182e83b32e952 -b5648c532a8c2d01b20f4fa70523613c -22a8703a365355fe4150e8305abe8aa6 -879890853daded7283a92e712b16eec1 - - -38b2c0ea8a8c30d66d17bf0e524a8a1d - - -ec0e0682c767499a01f763530606916f -83c4afa5a7847671031e28e86833add2 -68617e25f0ec7dd701dd59a5656d9434 - - -b2a5bc92369b85991380abc7ba8ed9ff -86ada72552105dc8605abaddda6359e6 -f518a701ab61f6e1faf7b64a38cdc111 -391730a825903621dedd1167f0089813 -dd21483e8e30fe859c606e175cf816e9 -14afc6144d0b738020f86f26530f5aed - - -abf053577f529a4fdca7ae577e6cdb90 -64aa12fb017e3a9b0bfc5a49fd73f8fb -441c1e7d8779e39d3ddd5a21ef184cdb - - -a233c31b4d3824db7be5a7a8bd453b20 -2087699af94eaaa7177b92c9c0ba9e72 -fa440492f96bcc0fdc48b5bd66e21389 -c7f7b6a9269e9c5218bd6cf36f6c2a23 -87c853d3f2fdcf32be3154c14324b626 -697e2261a085361a28067caeac366fd1 -8ee4be957243e408f83238f60768a62e -4f0cba964ff3c374759ea96f7c500307 -5b16411a39be252dce43f6f84ee0b023 -531aa6eb0b9d51d6b45b54e1d8f7adda -3dfd4391047ce944aef697e571dfa124 -d523cc1f7ca3a4a13e11ad16e4e801c1 -07cf193499b14b4aa2dcd2d8d0a81332 -aa85f538dd855b04e154b6f9603973c2 -e6c29e3ffeee1f20d265b95decb300d1 -1afbf4b8ae361df5b07e40f4ce036b28 -4e34b926b397349a7a399d9e2f6a623f -3a2206dbc797fe66ce48b9cc878256f6 -a6dfe45836ad9efae21ec474f6b0a360 -24cb8074e5621e8703181b98047a5a12 -bee70c7277935058bee76570544c2e7b -93022bac37cadac7f1bdcdca314145fe -c0e1028850e1771e7260629853155452 -6301df0d24884adc8c535de1c5a9e98b -5f0a85714b27bae10b591d97ec559d20 -4a738bce271c763b1f0ccf4b442a44ae -3f08c5537c877607b1b38a3f4628d300 -59223a63757c54efd157db106076951d -d1f746d9bc0926785c04b811f3fb7966 -d1d27ba3c484d69a50ea82359699baf7 -51238c690fbcb8afc6eaf6f27459ce5b -65fba3e749586eb076249ba3c482b35c -8c6bca9edd3666ae2d7fe6004c8046ce -edbbea920740cbcfa074607d3b169ed9 -6aed0195f236b45819a8c39f4f2bab8a -21c2bd507e206a1bfe3384839b996bdf -dc20105ad59ac69313a47db1691e716b -201ec03c86cf2054397dc8b2cdee587b -1a4b8ccfffe1da99a0244108beb16543 -bc544b7cf64e2e4b50074bbe9e783ca6 -d5a99c1a3afdfd41705bfa5fadf18b04 -341af811b1496a4696c5d19ec20bbee2 -f9326b6eca3ff2cf4c6ad9fd2f238b7e -83e71e5bf598cc37ba54e1f4186a46f0 -343d7bec72f569a5e5d7ccd4634823d4 -ce6d51be7d2712bb25fb3da7ac755b23 -6badad2af73e4b042c8887c0addc7f8c -5dbf6b1ee18e05b2f68efea7cddd6581 -49589a58849149505f18c39fabd41c8a -5815ec05a565d909cb97507b294e76a6 -b7ba3ffdaf7c925cf02db8f6af000e19 -91af40689eb5e30ab56ef95322d63dd9 -6a1dd8ab3e701824124cb63eaaa81faf -f8fd950310c41d00a0097b5db79de259 -82d25454413650c9afce0c152f621456 -1101b7fa25c611245ec0bf3c5a7dba6e -4048c98914cd79c0aae66280000b3561 -bebbe5127ca9f7c16d10b78d6f4efe8b -a85d6f6c9dfdabdbad59f048657ab05d -098a74062c560323cf5b527bed594155 -66aacc6ffd7e53adc3ca755317c22a63 -5e3e069f70a0ded9d0ee0eb7cf0406dc -ae3cb083c91bbf97212cd97e02243609 -22da431a7c7f89ec111dec1a80591058 -5420a4876d0f545323defab7add12c1d - - -0e3b2d7155b680d864cc63dd7a085610 - - -1c047c61f8c7c14d3e92634d7506de32 -51a3723412559c54daad822880716e2c -51a3723412559c54daad822880716e2c -1c047c61f8c7c14d3e92634d7506de32 - - -4d8b00e613dc9a2e4a4ffe3d485aa7d8 -57b267688a0a287fbef73fa98384f51f -6b93fd06a12f6bc0c74fc10dee98631e -4d8b00e613dc9a2e4a4ffe3d485aa7d8 - - -2932f3e33313df2fcb0c151e3423def3 - - -7a658dd4bc6d3c1bb78ce15b180b5243 -89be065ce3f4c188dd10be066e0b91d3 -e432acfb55c6ea09e30d42570424f007 -dd3828accc2e234856d11257b7dd7281 -407ea0dbdbadc30a149f1fb68bbaa2d4 -c400a03be480a9d031f65ac88f9288be -83b84e0d69d2a0bd430e4a2f3d0184cb -62733a2d6f590753ca7bc473984f7324 -0f98b55f7b8da09bf0f5974f9090a251 -564554bdd727dc2cc9ea1a1a27f9f45c -e996d10356971c7589054a5a3e23dad9 -87892c5ab3f53702a72389e4226ccc5a -066d078712736fe0ca54cc6989158897 -4968fb0bc998718b58579bb0ff8ef8f9 -6a474b90221ac3417d6606beac1c474b -1a84925e4a30a0e0d343294cbbdbb529 -27607be4c20fb2cf8f76f50f366a0ef6 -dc0233fdb0864c95e562db5baea836ae -7232c727b317be81b53ddc1faf00f320 -3f3d4121e2d5ee452aab3264439e5364 -84ba6b7c343b1c651dae1586edb01e01 -2d9a64283afb545d8561ee5f4602be1a -d823eab3b1cbfcd5d6501497e7b4d9a7 -779b563b2757b037e34488deaf4f291a -cba6dd7f7647ea925b8a43b6c7378473 -b288944edde6e32f83e09b1ac75b4233 -aa0c45c5a3e82980e67a3a26485c4068 -6beced9c2e60af599cc713454271843c -63f5a644044dff35542aeb5824076942 -b220973d49b1188b4e95e1c658b06c3c -2260715525b098c08df436b117416e16 -601c51a57ac3fa90e6350829889756f1 -0a88a57f28dcff30a5a90171b5fc9716 -2116a5011c951b5910e64a2d3c6f929f -b5c6bea87a3781a1cf651f6a364e2a2c -f67e47685d37b480ad0ae17b3c60e278 -2e8350503151a18bc7e9c1b2204788d2 -94615c2fcbad6519c2e0a3b8711e9aa8 -66eaffabe362d2cd1b092df702926a7b -50671e176a12bfeefedc8b346482ae41 -71c4b90a4d0f31cc209fe31be16d31d5 -2aba72d5a58f530493c35c917aa628f6 -c409580eaccea712dc1135a51f192300 -59eb0b09fe26d75439737eff0e339fda -5c5da4e28ed613e85a49edf4856a6822 -b1f1853c33c2f2ae36d3652ca4804a77 -6bb702b49f457d4760febb5f68b660f4 -f56f9e3a8fb4ec0df9a5373867950f32 -b1f200747f349b3ba3d4e74b3f5c6994 -b0e7787bf67f5d4ae4f61d658f652fc5 -672975b025e7cc96c5404ad861527d07 -2691c88717b7a5520c96657130fa679e -e8fc75c03c47a4cb2afe36070b18f4a5 -5b666ee35e4551ab235f34af949e10b2 -3e35e088bb450acf85163b28f1941eb2 -2511c537c17dfc75369b8974967de984 -bf08ded8d78533545fc70f3905c65c2c -c76493db176c6d5a8fd8c85ff636dccf -e33fe89d85affffd2c6467c1a0c15676 -c6df2b096e79cddece1eb44a5419f6f5 -6b031f2eafae110e2b40cbea47d6d959 -bd34497387c8504d2357fe09cb29a946 -dab0bea2a45fcd730255f075a399cc0d -dd57091610a5cb9f3d433c0974f9ea21 -30f78a15662e4907438a3f3da2032095 - - -e9ac9384237d8d1cdaab68d31a22005d - - - - -7c24562a2e36b60a1b49e24cb395a902 - - -86c02859bf76535e227b147df1d7f9f8 - - -3cb8e7e34baaa92f9a177daf6bf66a5e - - -5b53952452eab634c20b3f6949f58807 - - -2e0fc091488364fa5dce78e28935f772 - - -3a0ef81c1dd16d86a921a9ad552aa5a2 -8cd28f2d14a34235fa70221b362f7e5a -848d3d393e18b413f825fe47d6831133 -1c14e4c0d88f9e322a9115f774cf5369 -090c60145b221eeef1603724ba5a36cd -2f7a31c1060cd0e183470a37139a04b4 -058274a5eeceb30f11a79ffabed1d96e -6afd922cf25edfba298730f0e3009d10 -3abc2e5717f88868d39ea70b72863033 -cdc0746377a8b12d61be8812a6f7d044 -fa90ee2416693e502ef3468fcc7b8e83 -034455bb71928598956d437efacb49a0 -acad8fcfa817ad704c6c744d0b2122ba -4fbf79d4a94cf95251db1c3676913466 -2937da2da3ebd1181e2028b65437380d -e72e2b1b569dada123db580105ba8263 -3d6240fdff8cb8a51d9c113e6fb43534 -ef9a0ff6de451900915f83b44ed9c733 -053355dcf7473b91b68957d14591b448 -47cfc1effb86cd33f04521d28821fd1a -720433f1081eb4d6df77266a95302f60 -7058da97db5d6d700cbc61d2a21a4cce -1f2b53e20a6d5de24335cb6ef91554d0 -dc0f022b5c07243035832fde05abbbb8 -3211b9b5fa8c83ba6cae6de02cbd503c -45ccff68595cddf51a4e7f39da5b107d -c91e8e3ade1afcc630e27827d98879c4 -73f148f84d8e97c7db6657fc3f537f2d -f7b3a70d845cf15ff446140d86fbc523 -971704fe6ae22d9c55ba03719ac35221 -8f54ac1037ac33b57f576db08f8d7ad3 -0277ea9fbedf49ac49cf2d3bac63d541 -57ca3fc5af4f3f961d8e7f2c1eb790fa -a46b031738dfd4a8c8b3a9eda141dd99 -59e1c8f8a6212947de946d9fda42a390 -ec381e415072fac0d6eebbfaf9d6e62e -338197f81e8de089151747cf4d088a3b -552f72702015e9ca7cce60938a31be63 -1b7f9d8725c4259ee427c528a7a44c18 -13bbace6b20cd73781b01875fc533598 -dd709bda9084bcc30fb2364c93ca3e0f -3c33182571d240666416d01fdc898b44 -d5ee5e9062e1eb72d397896349364356 -d2d3e83d08249aaa44af84c2988e7d5d -b91e59bc080e0b4a4cf7edfd8a693feb -68a6512fa5235743cb2e1d17c7ce8b18 -c5847ebf22e80b5cc2d38fb14479be52 -2d6819315f6c713d88daebcb6e35d7ad -d999447518e66f1b4b41878e57cbaa86 -7ebe3f9dee233b617e2900493fca3da1 -244aac18163a60e054d68c36fe3a0214 -89d3c886d0e496b835e5cb8e4b70bb27 -fabfb09387164d3bd931bcb1d873bcbc -db8aeeb94562d6f90b79fbc5d7ad706e -3347f3116c68b1e588aa95385ef18b4c -40047b3bf7923cf8b528c12d427e0d4e -edce8a83541e168debca66b2199dca29 -e249d7912bf80bbbbf6c3606ddfa5205 -6f51a68280927c57c9b896922d178acd -5da383d5cab8d9acaae132e642e39806 -e17b94977639c424f3ecb6f52bd15d67 -c761da2c6cf06bcf61e144f235152ed8 - - -b220fae58b4e0a9995b87a5d5a629c54 - - -2cab0bd74fdd7b997aba318b7c90eed5 -272ead8eec497be617cc3d390c427477 -de26be26ca4ef240bd153a8c1dd0cfdb -fd9e4859f8b774b936461669096cdf31 -ce2c91ad6dfd86639dbd6fad1fbef509 -586d7b2d1045b9115a817507fe3b5b53 - - -e000d09cfb7fa17b91065bad4e642e1d -2e0423b24a7ed080aaaab4e1f6976ab6 - - -254df5a7ff156ec65a3997a119999809 - - -70ab052ed51dfdad78f49615a6f69e60 - - -74b6ecca3710147d87712eafb36462c3 - - -e7236f084a71ff0c305870e3dbcf9286 -b6876439fa39e5d7e38b4569fe4b0ae0 -e739960cb1fb56aa14fe39cc78fddbcb -e8452eb04184077138d8d57545efe898 -7462de701b3d82e26afaed3f6750d4c0 -7e93cc4be5b856f684f8263ed6ad7893 -5d9111a43bb0a61dd556482ebeff87ea -dae7509aa3315d022b8b3123039f721b -5e3b2b96468e6a399272ee4cf7de3567 -f563c5d770cd2ddca273bddd51d0ea7b -c8f9632a0d92283f0c21c9686404e307 -fce01c02efb6de65ee2351ceb7f4c59f -4e556c738df97da21c645c6649f0ac2a -18226c20d232aef820c24b181d52a1da -4d9bac9a5df4418c150c7cb5755d8508 -5ce2841167ecceaa0593eb98090f3603 -e1ec911fa666669ade4249a880515fda -03820e89cbc0d1394eb04849b2c63984 - - -00b237debf90b03aa19f2434f4a737fb - - -b33b43a608a5fa7491869775ffc458c2 -8fb092cf2ee9839b48362848d9f3de03 -56300b715f1fda9c6653153011c995c2 -5a6afe1158f28fde9b726c5201fc0f2a -1e58e80fac734bb1326bae32e654a9f2 -23f67d63140d11accfbee7bec1ec283f -5b73046afba55901acb028cf26459847 -f5b23eb364ff3fa1759b988948ea85d1 -54d73a0f2b0e8fe9bf2aac2340d06d44 -d1bc33f0bdb0b31d8f2c351078338d5a -124ce5b27da467279b69783855ed3e7e -3895e3229dc416a0c28b814d02ca2e00 -7223ca84c20bee8ff6fbc4f47c8518f5 -2f98062a90772f93729c2ada7a45bc20 -1859b0693aff46053c183fcc15626105 -633ef5a001c1d0d102653abf2ab39611 -689fdf742b8557a9559495e442fc2fb8 -000c85c95f433df8930acfa34774fde0 -a72501d080cb9bb829a169476280dfd1 -689607fa0fad4b9eba86b1ac19b08237 -053b5f60b782a1bafa0bd41d3c433a1d -8b00c222f6251d38d0c569ef3aad370d -53a55b3ababbea9f154d74c62f1a6b22 -86ff7473d2ca25eb055fbe794bafc472 -75327548ab625afc438a4be204e4d0a5 -b45cf3999cee9f61c18dd7d1715af65d -4c77b990588f8c567dafaa8dea2d1af8 -77e8869f3eff348fed0c7c69207a1042 -d23d9fae5e3471e0a43c4f8913ac71ff -6db46553ad49d8cc62977513fbc122c9 -60f91114adae55ef0303695d42e58b46 -8ba662099c5baa99532e13b759a58a0f -f50887498e1a0be76300190abcc72e51 -715aae34317a11cbd5915231e16fec87 -f71b5c95a615e672f2ea326bf2b60db6 -a4c3a9a7545e4994e142990d5a58387f -43bbf14fb91c6e401cc17ad26463cb30 -534cb2fb7f566eead9fc4d8ef33d99d3 -132d1087675ee7be2e15150b5911e830 -a799c44bf982bc6a4ba93c4d3d84ec4a -48d2bcb938967416dacc402a93909d80 -cda62084753f224d0a6456a2428a2e89 -9c5a124b37d8dc2a518f6f710559e570 -ce11ee2e7fabfae1f603fc5a7a58a6ad -bcb7f401ad3609ce70899241bf4ce292 -f0273f3d0c92180c8188a8858cbf61e9 -ab38212ff73defd1c8fbfbe534c75b0b -9c1cd25cbb532f3e0b231fda75b3f507 -c62bb50dc9bba44cc9669a970e47e8d5 -43ff40adae01510fc1f20d0994727a81 -e5feadc0b8d745697956ea2adac95065 -9e98398caae7b17077d0058b88d94937 -7e0853471fa2c39842af65fe25406219 -3cda05435e8c01a4b6d35899f7eff465 -df5c17977324a9f462d3d56fa2bba89f -1735251075c6340d7002784b214b456c -2fc2563909edc54ed91d37c7d3898fd5 -ff971213cafa87b9a0bcdd94e0ece8a3 -0199b65a17b17381c2f4d876a9776f56 -209338263e4d3ddbd799b025980d6436 -cae9d8045ba0a0baf1c028020541fca7 -275fcbdcf6cf367fb9d3a4ff1ecb4ce7 -538dbfd4ad06c3907f75c86543063ef4 -d103fb8065c428fabbbe4c885b138c7a -84da593eb8c2320960b1de541d829a9a - - - - -bc835218d97a41329962f0d54b01777a - - -8612915036f094ce416865172e14e97d - - -5a2ad8755f17303808847633d189ea5d - - -04a3847804af946c34ed58e4a9d3eded - - -00f9e6921782590db265fabe0385a000 - - - - -bd6cf96e05438cd47803d19ed3ecbd5d - - -e39dba8d7b8dc4617bd3a92bbd643207 - - -6fa466ae1b787448983b8c3cda946e4d -d47043a994d1c39399ee2f3789ecf25a -6185de6d056be3cd3696e154da9c1be3 -f52f55f52546ac4edca9dec441664ab9 -7b441758b0369fd899ea318cc1bd988d -0e7efa59ec71df19d77fbbcc8730d140 -1db70555e0a91b838ae01c873af08e62 -d999b9bc31ae3ed13a20bfaa7dded4c2 -e1810de740697162646e856fbd5027bd -6432a684fa20021b8b26f94ab85b08c1 -8ed5d68fc4e6f4c83956f73324a6d028 -10ff4bc7f1613f5d64d49db46dc8be42 -84d3cc32b75f5d45858272630d10cab0 -e5a6d20e62527b9d49563d28f9f62aa9 -b9754cc58d9a783d88f8495a4c98c6a4 -89d2c7af93c123a273884f9acd3ce56c -d2cda74f94de0f7be61c60b75eb41444 -76271e662b1e8e14b9d44ceec672fa94 -0186a896aba9cba934300b139c5489f9 -9e41871e4bbfa3d46af20ea193f94dbf -39dba480512d1eb5dbf81d3b2b469b4f -b69e3f108096936bc60059f9b7ee8e49 -b20a3f56b257d412ca4d78903ebb27f3 -d06e9771dfc296e3ce61db3dc37a5349 -e2b4dcf5b82c5078e531befebc007829 -7e382f51c426171c77ac65bdc203d389 -8deaa2d6e01a795ed85f97a7ee2a92f3 -9d047f4c4fa64ef60a8077076cbda6d3 -9ec5b89a76d8ba24ebf630d86105eb4b -a27ac5eab7a5363a64e25fd9c7452428 -1e3833519a57a93e419555ee9d90dbab -1660db71f909709909c1369c275d4122 -96b4587f1d0cb0415368702dd72d465e -3081d95229b18a9beb92e6d0749f6952 -b869ab82ebe8edcb3a06ba62c47192a7 -6895797a3759985d0a0dc455bacfd61b -119186c7bd4dc1d57d737a95cf0ab68f -7c7fddd05cf2c6f79377528e60e71e88 -acca9833590682114a331f23440fa109 -049d8ecb76f8945c16851577bb105647 -6f84f419dbb57eff8cbd55673b9fa05c -2f185cf5b017ac42a21054984a865be1 -4b3a8bbf6fe9b433d650832a6637acff -5a962bdfb2c89b879a0a1767f4dd84b1 -dda755be89653ed90c50a96f85032be2 -47058a994ac46273f00519eac6c8eaa1 -740f0a20ca582a63bb9b69fd67fbf445 -7b3898461e5063fcc5e3d719beaf706a -76d0c647acb18b22e1c403fd5ce54763 -97cdb58b5fd277b5bd4097b13016e804 -1063e323499af708967c6e8599168eb9 -9b076e5dd55b43b6d1fdd40c99e9afa2 -7eea7c0ac1dc1293b5625966250f45ac -06ede1ceb3e8e098b85b4a2facd22e21 -dddab59c5a3c9c7008d3f007ebbcaad9 -e5894f67831ec88753e18729cd50bba2 -376d75361ce846342d6cf627a001ca1e -7e4ff09840594f15dbf6cc4a78e125cf -976f9ac65de0e961fe7d3cb8148dfa50 -0842b61a016ab9e5f16c45d17fc3c032 -cba9920f5283ee00d9bcfe51935a7965 -a23374b65407a21aa6ab11dbf998995d -e9de9abb34883463846f9fef369a4a16 -7f5a528531ceef6ce94f417206b8b90a -3a3ab16b3f5b7a1b73fad7a45c8c3cfb - - - - -a013597cdab1f0d46a67fec6acf3cb81 -502ec066ce17658bc228175aa6d2bb51 - - -2970309425dbd62a04b427a38c74be95 - - -fc667c4366fe133c30ab122fe2ee7f20 -b8650f06582ac88ece68948bac1bf734 -8a4d45166ebeef73e222270a8113d66f - - -10478ac144e87538c4e4d794d2f440c8 - - -c36af72113ccee4cf0e556b877ff094c - - -17227e3510942eb943576846725ee696 -17227e3510942eb943576846725ee696 - - -c36af72113ccee4cf0e556b877ff094c - - -9fdf0ee74a688f3e884f9e5ab927f198 - - -692e20db6b797b084592808e936f779c - - - - -a98a8f4704ac217a1e86dba30af14a35 -5cf61f2e90951fc0db70efb0c211786c -7e55b90d516a508d90386e4f1fa901f3 -cccc9e28e824471fc6fa19b7d6b0e505 -5f9020e599b44474d5b8a59948282b72 -42b7be9cd7b2dcd67b0631441b6fa2a2 -c41a6f742d111e6b9e69c455515055ec -becabad6a051cb361ecf4c01cf446f74 -fa5b39843bddb4610105cf399b460f24 -c8590e1c0551c7efab6946a920559994 -d4f1661b9ff3610b5d7f8b1a74472d4f -80502d46ca2b54e3f82d6603b0115741 -9cc94696018e1e451a6165b5fadc4ee5 -1efadc4f92fd784e951d45177aeba8d5 -26042c05a9894e7e195e3fad7e254bc5 -01c41bfdc40bd10ba190526eba306fdd -e1bf696f6e95ec90ceb0d4b5e306918c -0d134260d954269a57ad1c7cbef97e32 -1251916aa7235cc839f82e9d63c61531 -b276786905ecaabe7050400041331561 -0a633d7a75a70fd222bb0f00b97b43ab -0944b6df9271cdf1450fcf3d1d364cdf -4d53d37ec785c8810afd47da28df62c0 -cbc332cad54788eb88a5985a82fedf4a -cc85dd4f864541a37030e31d4f999bd2 -beb1aaab495a85df74d549a4fd16ab75 -7d0ab24e3794439ba29d4aa48f4a0c7f -1af5632c10940ed04e4f3feee4124e00 -ca19b42f1adb825d58d57e3b2a739d20 -8428e9dd9d9677f41dcab782a7aea97b -341cafa16a4453f5ea90da70e640d574 -4bab956687ddef71e1bb8d10a5791eb6 -c1c0d2935cbdb51bb9576399f1015c11 -490957bf6c84850b9a1e0a7ab2c3f896 -78b01d50c6acb898bd5c9467ef7eb697 -3d6b3f6d6a4b2ec03f17b6dc13bfbebe -8d6a079a12501c8fb4b1e5dd2473a6f6 -bbd6bd0afcef117a4e47fcfc4a518b19 -aa5ed27aaf82b840ba087ef3d2787e04 -b2c01d47cb53b49dd8a398e93b9cd5d6 -42c7ad2381d10bb65963c236a41dae63 -f3816e17dfe77dfdea4dfea4db6281e5 -fba065c3f0f6050f9bffed86803450fb -63f7e3a84429869b296a272bebf80009 -3ada9bf47f0078d360c99e18277641fe -e3207e4ccacbba12adf525e837133cc2 -fd16cd57de3e72799f36a6fee796cc0a -f749d8a1cc8ff8024f9add4fffb98711 -f06b456a67bf306fd870eab672b8598d -1d2e2c6a2ff30107693920d227545b4f -2d6e84919aa99d0451175fde78e3ebc6 -bc18664a64f5e95aa041a4c247c42ffa -2ac6d502533254a08759227452505efa -72dce0732aaf164cc938bec5aab86836 -a9ca3f6a4820c4f075a6fa7810be0921 -0092c63651533044068aed3c5a72e66d -618e08d1a1ee76a570c3794be96899e3 -1551d9c1112af9eb9fdada91e9d51cef -9f0dadce14495794753589351fb2f9fd -d7da526de089ba90d116347fe52af9ae -18dc3202e452555bb9e99d0973262752 -a34f278151995523a345ddc569c1ad9b -cd3335bc2d82cfe0d56caf236570106d -eca0dba3c96aa8e96836860c7597833e -de9cec2ee73d79fba3f170dd9a6fd633 - - -04aaf1aaa0767de7c4312205606378d2 - - -ad9b58ba80716a5302e96d49989d047d -9fc4893e57426d217821f655591eac53 -f28187b54876865cb4c5f31f7fc2e33c -f6717612edc2d0fee57a7383566834c1 -43b6bb71820d5c965140e62ab0b6c3ea -f0413ffb9757b5e863a1f9253f0dc107 -5021762bbe4d4798fcb665a3d8d1af32 -11af3251e27f66c27515faf2f5230091 -a719d20393cb1c8e6b40d96af550ebc3 -dad1b372fa7c2fc8c7563747e36ce044 -efd6769107962d232cbb8453379302ad -8f27ff406d99a4e69e7d53134a275d77 -a053e427ed77db13e2aafb7525780c32 -f9fc5a95271f30728d96175e87dbb012 -057e7bc9937cec27a5edfed1a42ac7c8 -13c7b52746b52a5fd50b680881b47fbc -36568775c9e37f9dfe71d9d29919e80e -5037c3a630b41bc07fb3984bdadd1372 -ea0ad12dfae55282afcea286dde41636 -249da4d382d5c402d55e5f4226b49717 -1ff2a2539b5b1cec552808f21f5a3816 -5bf6082634b5e94fd4681c219b7cc42f -68727476ca31236f8df200932ebbc304 -89bbd0ee8a97d0c98b41b3a8f391c99b -150d7d0fdbdc7455bf6806dbd6ef8a4c -df375804789f9690e28a249614ad7ba6 -635778eaa8fe3385e4955f11d78c8eea -14f78c71cd3162d636189600d5f84974 -76768f4cd58c2c1843cd813359dc1c76 -cfb636eff493d1438720b919049bdc1c -b368be2dddfe4e1cee45ccc0b6fdcf68 -1b463c26612a0c5bc7f6fc75eb01d946 -2055df6f0dd7e414aa6a73601798c119 -5b4cfb1ba0b67adc7050fba492406cf4 -e1ce013fe04374129b55062fd7aece7d -131e3c919ea28b49b7a6d9a65c78a4f6 -b12ff5e4167d297bf133f2094bee6efa -14faf3792bf93d633f5df02aad6030b5 -25f1cd2f6964253c2d1e62108eded2b8 -e81be4a426762dffe4ee817c9d29d5c6 -05fa3667e7b38623db709904cd5d07d7 -2c53f94fe98a68097223483ad95c9a12 -d0d02638396f0ea62ef23688b1a9483a -1ec75ac93040da667c202b28ef25c0ce -e87c11a090aa0ac30a05ac2245c19af4 -a82511d139f1fbad44748d7b0b0b3924 -e67871a9add3ef7ffbc50f6d6739ce5c -42aadd458f7a79453311bbcea86375b5 -21c5cbf4314d815a0996789863c1d0af -e9cadc621fc6628900ae43bedc2588c2 -1a23745064a7dfeba86800a6e7545c58 -8c06d1a432e946a46d36e2a0340621e9 -4a03d1a28ec39d45f7b7bda42b6c0ff2 -0b8c38e9869d2009c9b4fafb5b1109d7 -5e06642539e4c61baca4a653e4efccad -83ce32f33027169c99c7c9ddbc0b2771 -2e3d0ea285ae9017f538b7e44c937dec -6e77850fca8b589703d58a4045266d61 -e17665b3b8e8142359d071a7422610cf -2bec7a43e0a9b86c1f4be7d637f509b6 -8d6c1bfdc8e23551b69c9ac0ec57e3f5 -00b40ae23c989caac858fb873d3ac124 -7ad9dd30a550dc372d944939e63367ac -717845ad41a7329687625e3b84312352 - - - - -37a5e104be6e4b2d95c862e1d0867c46 - - -cf48ddbfd3ea5d66e3c67944c8da8773 - - -7958c3c13c671f83619e8ec23d8432cd -91ea847a2d6799362d42f6842ffd0b60 -8e1e8de34dbfcccaffabbc078d8bcd68 -4d3aa4d4c43ad2858566dad3ff94325b -e1a908e793dd21b3bb30f092f3ffee23 -8aba98a5ff4570ce929b7f629264f33a -0fadf9a8ea97fa78362c7b41c532a8d3 -f0f2ca3d96fca432767eafc3dfa7305b -30637ebf317fbb9afc94c93a7157794a -6c594ea60e41a589c3c3e9a249e7d867 -acf11d5ee43e34d54947a24bcc02eaaa -0b9139f6d4c46512978588b50b9f5b62 -91b8d2f8495fda759c2546e1b29e8eaf -afffce62c275ef3c7da563b1793cdb13 -e785da7095ecca60e6b9649984688e6e -2f56924e399e7a21c261f284916f7e60 -a8b883b1d5ca4760a8002270f1c6fbfa -0cb694690f5f16646014d0482e7683d1 -7aca76670d18b3bf392f1ca09d5ef5cb -853a12de071c16b0e6d7463c1f8cb36d -798dc4862de11017fb774e09b19851f0 -2f647ac1976e2866cce1312e74ab1ff2 -ffae72e363845f60271c6b074d0ed824 -567c6d4d2a0345e3691e1317d45168fd -0a18f254e78285e5a26a5e0027ccc036 -7b31864fef1065e47cb2799ebf49b744 -7058815c72bcd527f38f2fd7897fa692 -9b4a6d91b45aa851c6000c2761794b15 -9dba534e4cce2ebc3001361ca89c16a4 -4ce6e22e12c97b220b44c6b9fc5f2479 -2c1319dde3b7ad238ab6cb020a81f407 -3a3d76dd23ab98ff9bfc97b9e37cd75c -559b3f2ab4a0e72153b845c9a35394a3 -51f6e34ec323eb9e003417adb0d74476 -77b6d75a4303d301cd4707b4380d6fcf -9b71a868ae0c914f09fa0096b3c4515f -6e316360fc9d8bbfbed43f8310e79182 -9ce9358b2005623969aa614b56074c44 -69c4ecd12d81dede6dfa123d268ad20f -c9d6808ec856e4e0ff15fb597340a067 -0046c0fee6bcacb1d339da94965d5481 -cfab365bc228ba94a18de47da3a45473 -d7f1ad9d25ad83db76ea27cc7e1623ee -ea5a49b0f49319d2366ab37c5ff96bfc -18f09b157524d2a313cbacf9eea0bab1 -35b23f1000c82bc953dc9b5f15f1b061 -524273fc9581cdea1ae5903a9fe6d5eb -7e46369bb88d6d8b2d55d16c583acd73 -d05e5903b19290570242a5e957ea3aa8 -160915df72fa239da18e104441bcd5a0 -7ff09313a5f0f914b270251b49929453 -24e509c0d01c8f652c65fab4ff572a18 -e54a2776b7537a0f67d35a8238ff72f0 -d00cf099ef638a1ae4b6cfc8f2020d7a -d504430032da050b01b1e85c94a0874b -ddec456d3cd40f7bd16c05d4808f2bf3 -d41dc695ebbdc36169f5a57f0141f8c1 -a296a27e6f06c12ec27352de5b0aa45f -9072c79603ee2da1510f1b722e400a32 -0b9d3005af00fc7352521d190566cfa9 -da236e3156d063227e8176559a7a5fbc -e41d5bc5675d8b2641cecd6011694668 -9e1c9fe94ff8f7b1726af502b6fd9101 -e62c15fd11e68b5efa68e42da4759197 -3385b07f4c4412bc7077272a5f4d83cd - - -c468deb0acd01bc010634d988e684e09 -8c10865beddd7b64913db21f12059c64 - - -2cb9e8108f97f63366b4146f9472e4ce -5e99092b13d0e0a7672fdebb2e988b8c - - -9b0c9e19562eb950621e2d8182595659 -8cc8278179fbb415e3f30b98c5e8b4fc - - -ea803a95f0e9f1ecc71300443c50ebd4 -e913e87abbf59840d31a5f5303f1e205 -ab27509d1efc3064a91078f29aa72d4e -c0400c70dc30b5b5aff5ab169a898a5a -61ac990e48b25f7cba5af4e9f037f62d -6d6ccec65e35b5f76684ee52526d74f2 -f6fee0b8e1c4ff3e19382aedb7ab9f52 -9805853ce7c759877250763042b684c1 -79565e95e823a6a94344f3f70dea2ae0 -cdf4af5545ebb5e23145f1e668ba6aa6 -47f34331d7016dbc6c18f53093bbace6 -721eac7a9ff861f192a1080b8fd2d222 -5eff55f41b488f6601002a5f65b7f6fe -ba9fb3df6c19f55d827aa89c9d48e395 -b4a1885a02afbdfd20cf3dbefa0c38c2 -bf2fe4211777fa79cd85a091324178f1 -7c22a31c9f2a318702128e6a2fc8a13d -33866d7a97b295879ca893dd3c09cd20 -7df81b0a58f0828898d2bf496a723bf5 -b7abb662fe04024ff7b7274e8ee2f01e -927759d3adf4c5d3238410f0fd4ffb5a -4eb959d933a8f6a0f6030fbccbb54f69 -a554adffa6aa31e9eac4f23fc5a3cd1c -357b614ab10f3bce1cd530eb5b1abc90 -900f3a2f4411d10e7688a3679be3c965 -dad6459bf4086efb7f7901cb6ee560af -71f5a10bc7f4f677fb999db2a9180471 -ea073db87a9fdab0cfe160fa6014171e -9816e29b3872a45e9d81a9c114170ecb -376de3ef0ac8ac61b2f32bc7acd8eeaa -67707e8118d72b2f687596ff273bfcbb -3d2ba455e78d218a5ab31e78a2ac4c36 -8afff99c215828f3778e96843f56c1d6 -0428e41f9d091d86b76cdafe35e98b3d -3a203e28a9c285d02dc300ccc4029642 -5cc1c3f1ced768e66a7cc31cc7185d5c -99b23ce0612bc8bfbbdf6bc49740c968 -a84c2a499a214a13a21ca1e954b05a31 -e8b960692d1d119505b4761d397a41c8 -6c1fb8268ea1138e983be73428e83fba -90670a763e5207226393cba5dee0ab8c -929237c7af0850f0dd42950d45168163 -848fe203e64b9d62d18debe2eda1f440 -f0895565cd76e7b4e51fc923944dbb37 -9f892e93945e7b3e40c5afdb9984de8e -772f8b59a36d04471136584a9f3d82c5 -f0f5c1e617ec1bb569eabb01743d1ce0 -33dbd41012f2d8d5503ad09923c5c8e2 -a028302ca9f81637b36d0cc948b54174 -107293c4f95e043bbd27c59e02a2e036 -0512bb5b52801afae8c6c599112d5cd4 -6ca8b568fabba17efc290e6bd99b889c -31ccfaa6f3df0053086adf5c72d5e427 -eb768ad4efc097c7712ab2bae34e13b3 -d584e0104f73cf19f42be51264124888 -8c7f7eccf285b39347cbfb96eaa51bc2 -5ccf0ded2de23c2b69fd6948c1108d03 -4ff9e703522f3ac084f35a9f84d77d7c -d3e1712e33762922e691efe371cbd285 -34da72116f6b107226ae5bf956d36deb -88080902673d4ecd4222070c110ebb54 -0651d57b68b5230375b02be6d044d2dc -9a7af859f5b12c15b5b6285308e982b6 -a374dc97cfad5336182d563c842a206e -86614f73c28fba5e34f0fed0c1342525 - - - - -5e9ebfc29b4989010e7cf0497e1ea3ff - - -245089c23067de21b6cd2036e94b0230 - - -88a813c2a45d0c8ce12eda52f36f26d3 - - -0e73a8e6e29fb65e20302d7b14932373 -a6f41e9047f174358364f070a1c9e085 -590749d0bb4f01cbe9419fd575cf9bb5 -4d4ee3f261ec6a4801269377ac754e9b -25c804e7e9a20379225cb03cf159f37d -44a199bd8b6c8bae49426dd80fe68aa5 -8dfca1c2cd9749aedc6bd6a7a2028ca5 -88d4ee1abb183b534cff35c0d90c40f2 -c780ee5145fa21c13a14c081142c368c -27fb09849811598bc2a9d1ac4d256388 -7374905c6244ad66e8c96f5ce3b87019 -a279995f8747fb597f20adb229f458f0 -7b58466546979c617c630397758804bc -4b7860f21d571f2b011e9c8bc3bd934b -2ed8327235a36f38ae84f04a134e2ed9 -e508f520803b6a25c98ba5b50a7d2460 -f2a4457dfc4020bd6f86b614e72d64ea -94872f902b930385cef1169767d5e627 -39a5d39d564daceb561f5fbd44f618e9 -a1163525e054dc09dea22027e5611dc4 -35ee66e976455f7945b047682f1f4734 -c1cf7cb1fcc86adf53b852c5c386d80c -c5e753209040963031aa2ecb1967f844 -dcc398ce47d249796a9541d2daf5977b -08889d90c128bc986e6f33daa81de111 -468cb9134a7361314437e9805096279f -46a74789d877e3031e3681dd8a79c95f -16f07562ae67f4d23ec913141d96155a -528bf5586e6dbb2a5befe26b2e40a51b -b3aa20154f2c168489a0f025845bcc8b -969853a18bc1c5a8fc1b6da66f46667c -345004bd7d7b7b965c0ed874b11890cd -0b9d4f88bd9f89b40fa1de3a70d7b9be -dfa42d2c349eac38be7ebbf0b4d5ebf0 -51fa2383746497ffd868f2c41a9b9916 -c0d4092aeaa089311e571e1a8d1305d0 -17741b03432725359322e3824eb0365a -892f495fafcb992cd6e250d16bd2005f -c53c492d3c9cd649e87097aaf3cbf1b1 -82ecae8ae815f91e8ed31a153326d8ac -6b32e52c1d8ae19f221e82b6658ec6ed -1f1438bf681d3639cd200349e199a321 -800cf8ce3aa715c4832c37048f5f2ef2 -41ff7f20d77fcd1896c013d78f062d35 -fb24fe30463b754cad50ca0c8fb2a61a -269de249b303ae7df6f86174fb84ebe5 -0316f35bcd972c39bec12bf39ce8b848 -900db2034b2d7a6184c7be13c86f2ffc -b1e11a91a505d57a8c67502b914114a9 -b8df58fc0a4fbb24c541c5f33650ca12 -8338e554a27ff4cabf09b75f4a437571 -c667376098bd057f286ad96a8be557b6 -21fe0227445c576740c80171336e7140 -001d8342078c130a854a5fc2ba3e5fe0 -dd0fe1770571a9dbd89ea429fcaace93 -b2ca0cd3a8d500830daf81940aa2e217 -5c92c9449da6c737a38452922b4bcaff -4def3bd05c46b7c544700cceff48f2b6 -9bc50b2be0ce0833aee8d4112c0dba90 -404c2aca474520364bb6d7d95503d5ab -cd82e20ad7bf0dbacd5bf56ade775044 -bf76bbe3bb9f4fa1f38c723472f0e17c -c13d065a12474a08b3c1967dd412d3bf -3bfbe8485673e6d5182ea4356bcbc69f - - -d24b9af5ca5c9d722db69d1af4e3db57 - - -3f8d8e5cf37f5bb6190a6fd44d3bbef6 - - -f75871ec96c9234377b3921fc4b1fdd3 -e48c8bc4397207061bf9672ddb7504f8 -5f271406fa10507bde1cda5dfda82514 -47521b7184d705554518a3ff1f94073f -6dcfc5060233f29772b6c99ad7c6f188 -a635cd73069c12bb0e0e81d4a7a39c8b -e676ca891c4261577e3d0702c7f4c25a -0f95064fd9f16a82c99f4fac06d3a737 -b45f087d77eedf4d7c63a4c4f1970bb8 -a51b8f8a516859bc9a9897b3a57b38ba -f44efd782607f2a29ac3a09a8a8686f3 -6dac2208bf80ae8ef95ee1270dc0fe9a -52f495a9cb8521fb22e921337b35ff8b -c255d5dd8cb46c1619c2243649945423 -443d60344ed3ec1decde608ba71cb29d -62d9b8189157bd1bbb683f252ff6169f -cdc6e9c3375ace1bf1ec3ce9b7a95b20 -a123b9382bd9ef7386175f1f71528486 -e674a2cb9e2218198d8b8bc056097f3d -b7e65c55dd1db4b7d2a0a569eac854e2 -34cab56913a12c8f3cfbdd7cbedba361 -b6650f4118bafaaf48e623b4523bce8d -af144dad27092ed2076a2954faabe9ea -325aa87334b1ebefbc8d879248d300ca -4a1a0fbbaca8abf409c6f16a109b7aba -7d50a67aa58530da49dfa5f21d2ab35e -9864405349e038742860612798e6a918 -79e52827473a93a473166e21d3346138 -6d4d90557420948fc764041b7341a4bd -a876bec439bd56f63e52aaf6551e9624 -110f53f6746e569898757a8de6a9b880 -2b866d348468dbe6404f6c56f448f9c4 -be4e7ef4697e4939dc614302f0509d74 -3d34025630c995e743260ef6fdd83690 -2c8a34dbcf92650dfd9b6b2a68bbb906 -b3484084cdb615343b7ba6ac9701d6fc -717ce376997563e923eaec2c9fa1c106 -346beeebdd3a7079e71b62d5938889ab -41db43f5238fea2640e496a67e97c1c8 -e46cd3a29608b66bb2818aa1792e8797 -2ddd9cc3010c8f0cafaa92d8aa22c087 -9cc343774932c4ce9f66bc38b232cbc5 -69827e6237546ba1da3fefe76ada31ef -6d0cbc4ab99cedb6152d97d40383d3f9 -76509ad5ab8986b87491407540d2984b -31b50a949a9663738ef5d8ce1e3a9f7d -cf8945e482db9bf76d77af1580965378 -c6b327fc7149061e10a3de9b2f5395e2 -33fa3560ac1f86f39f5a2c9ca61b993c -d55016476f3bb7d1dd767fe8acca0c39 -584219e2ee406f237e1ba56d08b11f95 -89267d685e2a8de5a1bd2ac67d9a1292 -d51316e9ad60e35da9b7a84992bbf53a -d05920075a6b578127adbc1b6592fbce -a0acc37715fc34be00d3fc5720a67c65 -7e71199d2334d96bf245fa287f5a4a1a -c2ec5e1cb7d7d288f3931fb32673b60d -8c0eaf4e49ebc4b64dad07a574ddb52d -87a5ef6d5b632077c6bbb92fe3b9fed3 -73fe1c847d82415bd179e0a776f53936 -502ea8699641cf83217b6cb5972cd1c5 -5e37a2ee5874098bafa6c51cfea80123 -866057ad079489fe7e32838d8c499380 -dfa2272a26e608fd14263e0c7b15578e -d078560c79300da89352b34e319df9af - - -15e73b634e4d8aaa8f17409806133a5c - - -f92e5160709f56509dc816e483a1d13c -8a873d673c98970c8e7a1a583ad3bf69 -adba5f2e8aea36ae13491de788d3cd29 -d3411df3119a34813c2843d410542e6d - - -1fbf7dacf324a615b97aeec5b983f4a8 -6227aba90c0bea16120263d97a144acd -dce28e58d0613b9042843c263adbe2d9 -9fb077a1e341ec0e5b98ad4e185fd22d - - -f295e37b60cca30b2e38c0b01189ca36 - - -0e585d336d1a97d13cd85969e086daaa -3c477a25498dba0e4115a57a385c214f -efaf2fa0bd52d1c8a35c5a11c0a8ee58 -c27bb791493a8c3a0897910d1bead0f3 -d7adfcc1c4d0dd457ce1ea7a83e984f3 -176a4677cbea19ae22bd04e4a5a1a26c -3b54b00adc7f1dd61b7b72846d01a12c -e03f6d88bd7d5a73bba6ff78d837ed85 -2340ef6647c8df3ca993f5c3bfd3eadf -38ba9d33755a22dedac3eb54515e3fff -941ca059e613fbd1beda1950b55bfa68 -0bad9c2320033f0a681748c49b6fabe7 -b496233cebe3c0ea2e07a31630f3f4e0 -403107806865932700a494ddd0026a76 -8ec7f7b6e8122fb21950c9e2790cbc84 -6711f6af3acea07893ca4de7062e96fd -aa6fdf4784b2fb7553ed0b282ef65f6f -0d9e8f2c93d3e69899463f78329cfeff -ee7ed9d0a9fe0111a84861ba65c79a0b -0cb648977481b1608eb0fd2d35cdda0c -792f359a06a98ad61be97c1e04294f60 -fbc8855c1dd6e97c844ff6a464be8e0d -3584fbcd77e1e3a5698778f7941b42f0 -e671c0cbdb2cfa50c3b403f61dd50eae -513f126be06516dc462279e7fc9da953 -8085b21104a2f32acdfa8e54327f6677 -e96b8982f3eecd354b8a1309fbf53c21 -5a9470926a65242e34cbd5494397f338 -584db3452b60853ae62fbec4f3fed0df -511c1450b8c4affa475c9a72dcfb2219 -d0076e1e08b4f3a04ec3fa787d426d8c -9ef16638b24be7b644483ff0be3f6894 -f739d7e5aa72c55076ba3907c51567cf -b87d24561d1041809379e63c5b5c13cc -7256da17ff5fcd51b04e54cae58b2f51 -d062b919dbb47927c94473ae74a48422 -b52d9b6ab6397921ca48c51fe9b920e3 -f923cf394a3ec09acf5c0be0d09c71f7 -d2f6e04c2f462935d7ac0a39202459b9 -313b3aa8af39eaeba70f90adc54dcfd4 -2df4268d6719d7d641eb8545149ba74e -e5e8e4897f6f5255da586d938398f581 -7c93196f6b6b371a45d1ccac761b54e6 -6fa6584fadd3b270d8ed14c28b5b5e6a -9b4e5f878b7ff58d19bc9048403e3fa8 -2cf657d8a3c0a51709ce088c4c52b14a -098c9cee2e2276d519a41596b29dac38 -0ef9eb4728101b352a0e54130bacfae1 -6664f632ec2794f87f873a98f0d3b8eb -2d2f350f9332044aba8fd6517ff6548e -283ff80aa9ea29624fbc8a47c5256dda -1297339260b5a08aaabd804f5ff9f08b -0839098d2866e61089ba2206d9acc7b0 -364a82d644f2efbfa3c54e8be3027e3e -af30de7a70be80c51c68a7daf1480bca -eaaa62b79cf78d85b17e3050e642ea83 -5af78d27eda0614b17a6bfe05ebe8770 -22e6d79b5c0256b97859ac2c458678da -f77e45491b3ae5618b5637bd047ff332 -2434e9f7a150296dc220efe0f96cc5dd -88e4f96a6a9c6a5add80985a71fda711 -18ae75b486d291f425e4358f06c1c9b1 -85567169f77de390688e544d315fbdfe -a83e83cf3f03aa946ee59ea77e332c96 -66fb99008c0aa47890a26ae11e67ade2 - - -c315400a45f06b307e2a928b8bb0d22e - - -f1d0fbc57f779f34414f4f0849c51b17 - - -0f8445add9c19fc76f727d3d9974f129 - - -48efb991345980388b972a538c801e3b - - -492da0005fcf299ba996cc907a422986 - - -f585fa2017c232c9700d71dbd2bb8be2 - - -80c26f6c43e856fe7168ca0dfa5eeeb1 -cb801c21cb362fee6567539612849b27 - - -a9a2ace0dd19f72bbd1fe902528b2f15 -f4c2722163d7f13ddd8e4c70c2db8cb1 -fd5a4352cfc0365b5a9a8102090a46a9 -c9dcd6c960407a7c6df856e0864e0e14 -594a0b6888327f9172eb0308a455777a -d587dd16b12f792c242df0a13acfb3a6 -3f11953332dea768ee301fdd473878ee -c0a5715cefa918bcf84162bee116e7ad -f6bb67304472c650935fc5609989e4af -eae93802b5e1be0cb52fedc23cd7622b -5129f1ba3348028f3667111746cb69b0 -b0fdc716e42a1bfc7bfff77d4632d3dc -b95fcd358ca788cc5df66b1f0c86c07a -6d472ed88958b1e5ece0950bfb3cd651 -b19fbbfda365bc79a6b851e60ec847d2 -04ced724f3e21f46a3a318fc826f0f53 -9bb357565c95d6fb79f7106433f58f12 -917f93e80da604aa435cb5b2c3d35d17 -a4d6765081911dc2787694e370431cf0 -3e5387e454802270ff818eb8907f1114 -a351b9fd2e17f1d36117a7a4b8e63988 -78d82f8b8ac1a9cf6b0645a9e230234a -4371e9b00b0260e1db0dae222153b564 -74de0258ffa05523b5712d7d71984f97 -7728caee8caa768be46bb3e5935a99b2 -e7d43d1c9e3b8a2867bac544d2317c61 -442bca7275355ca1d243480f8789872e -446048d0ef92f96f835f152b29d8c3c9 -6f4595225c1742546849e9563060e806 -533db66c8daa7675b21d06929c5854a3 -d4894f811c249080ecd49600cd8baf87 -91de20ed06553981dddafbc71f6e3e46 -fcce102f54fc2393127bf91092758548 -90813c26dc6b88bd481c92b3ece556b9 -287f94960a19fefdeeab3e305fdf6eba -eb73d3da4b84c421676593777e8e2355 -b15ccd1e2cbe69ad2888204c96c477b9 -6c108801e2848282658e18d4dce8ad1f -c9a37af62da873b493e63d9bdca04afd -0c20ea56c48466954dbb5db83f39900c -28f7ddde20e5f86d71f9876c3627cddd -9fd648ec1f7464c286f96eceafb59b79 -0ad21fdd63f826df4e12e2ad7e6be04d -2509e1c6672bc4d0325b79b98c7fe332 -afeef5b70f5916024e687fd2247e207b -47500df641a8ec3416b461af6a284151 -ef4f3d18c2153c03b4c5ef6fb15153bd -1f54fca16bd38f93cb1b1c9b72feb1f1 -01ff7811a46bf81fb3cdb45d0aa45621 -edc647f9bea27c5ba109d13388a659d7 -9304cd2325c648abaead7575c9870a8a -568ce66622eecc7aef3ac6a24b63a421 -669294c29d0e81fa6bf061c6e11d24da -a1e3a62992d9112aeeeda28362e4ee14 -f27516d1807413c92770f320bd1f5f72 -c022af21846d6a19546cf84ab88f0353 -bf54c20e2cc1f0603003c01974ceab07 -2b716932699999c49de304b438c423e6 -cbc52d8e46d0f8e3482c0644d643df0f -0e207d98892f464ace855b44ed2e6a97 -5a6ad22debe78604fe30a693a5a525a8 -3354c99e3d13fa549c1975a03e4458d0 -cb231afc280b240f9bd06f891a8bac76 -096183df1e822ad1dbcf0a5732625bdb -28768c91ca1316fa7168c8d7fefeb4f5 - - -d644d1dad1639671a0a08ac8d7cf2cda - - -80e05442985a4013b2513e3a4a89731f - - -dbef1372cbf2a09a2937da2ba8de64ec - - -4ba5542783c491b5585f72f6e24b38ed -fb606b68fc0a94ef747bb5b609ee4ae4 -3ce46c8ec132f2f44018b5179effcbe6 -e6e6ce33b1422bf712053607361f1cc6 -4d66d071c1b967db68e1570dee5ac60b -4f9ee63ded566a36de4b77a537defeed -0e7864f7b7f3fd0e500111603c3dbbdc -c7cd351bb10ca27f5e5135c511612edb -52730c662e20f0457d617bd222e3363a -d58a433bac370d044569b7d8bdec99fc -7a3655e71885f07ca9a540c7405ed67b -cb31651660813ebe9130e025d6a48e0f -8ab789172fe09ae5895b1e59ab201ac1 -376b751819a332d219dc4331b9d9f62a -5f080bcf82583f9cef8d07bdd7abf41c -e937dc205ea0564f197bcdf8f758f5d9 -1177aaeb8fe88c302e5b7d7a3a6e39cd -8e2f4a4cd02922d7d5e40738aa6ca7e5 -556417b9941a3d4a517321ca7dbc605a -665d5a5a68a1de104557d2e35ee38f4f -63222c5f758cc294bb0e41787be95c07 -61619d87d4aa8c7b432f47d8c42a9ede -6de95928c986caf142526e2290d71813 -c0287826d7c0e72ab0443149be998667 -39efe21774f3459aecf3b7c5f2673fb3 -72f3897af71eee7f2dbb5070bc21bd06 -12a37231dd9df6bced0a70a162fcd29e -c1fc94b7fd1c4a40071501d0e062c9cb -58b40d3dd0f82414bee402b565e45f42 -aa9f9f8076579ebb988b5fddb117565f -b097eb2697f635ce95aee06d7d3a2e7b -6a12a0fe421e4a943f5fdc7a76c862d7 -7bb4133e9481f1a3bb5047ed1983ee0f -8162219cafc1a2a931892a3581a64492 -b658f44e1c6b6886be7ece9762db3641 -cb554f4400d9f2ab8b0d05d037b3b987 -03ad35fc72a3ee50552a90aacca15c9f -e764c61f036660af1390793f559cd15a -c2c1de58f780372fa723cf91b29dd84e -30ca3cb8c6b80285993187191322a178 -6283f604b51b4c8436c19989d1d04c3d -eb316ffae28674defd706633e6e15874 -1d1c1eaa6cd7ca65cc1cc163f962a206 -77ee294fab4927c6b05295ac7f52565c -a62f14439f9273f0d757bfc005c44467 -af8e31e935468d979fb007bec07e71cd -25a25ecfc0e1b63fac9ddfacc0cdf8df -dede2e95e289800654f3be1d6b4aae05 -3961f6099feabe54add76f6c43ae718c -3d45af8782202cf34ed80274c239414c -2a522071bd65605dee2b97ce28abcb27 -77203c41eb8c95f8c367efc0d10281f4 -a0c7413cad31c78be00757a4d696a9b7 -4c2d7019cb51d6323c5605badc3462a7 -efc5f604f027765105d4e8f10eafcb2c -6ececb35454176da1813e95478263bd7 -689a14afbd00e0f481b91085e129984b -35666c7db479d5ff1399b1487279c793 -43cdfabca51ac1ec8e82096ee825a509 -c5374a7a57b661d075c83e694f29ecb2 -b4e6032229209b334fe3757e0d5f6d58 -0c881a0aebf3f15ffb44a4c400116bc5 -ce61f11c776100d7781a2f1e80bdd253 -afce0de88f049a56a0e2b1d7ef58514a -90d0f624581156184f07e08e3d5432ea - - -952e216a7803312fa67ee61c06f3c532 - - - - -82c1b74104395011f886f59c92dd03d7 - - -7c09d7502b1003f037335975bdf8c7dd - - -1752a7036efef4ab87c293bdc99a6ef5 - - -cf68254069073f12a201863b736e5943 - - -79993e0fd423b00535d60ca50932f279 -f8d11c86b5dfc618655478757f5e1c84 -e7439a0718652088eb46679f10b75f30 -f8e0a1a8f13733d6a7a5270fcebae393 -f334305f7a526767cd39ad271952e783 -97594b67e693c6b57969599b64a15b41 -dd89569990b558fd73df26d470738628 -5db09e799c2817e5d7d43c7178cf142f -ba461beeb4645d9135a8a0c9378b300a -197445ba8fa68273f8d506c6c684128a -988c6509ce54baa98d85a019c9009e7b -7e52e6107c178007bf76b14a8b542dd5 -b94ee3e355209d8e560600e45475d9f8 -e8aabf620e6a5d98b7cc2c64c6b0af74 -7fdf271038be6c5e9018c1cca6d3ab85 -a751778d6a7d2387bb61b5adb378adb9 -0c1e7e4facb9242d5b5299603bb0a36a -24bf5072037fc1aecef2e359d25a57a9 -0a508c373b6e833d8d2a09d57b8565cd -8fbc8ba712ac0c6849d40b83a81d0e56 -8013ac340c2505e26de39c361b326ca9 -be4640834859b04f5a0ef291471be787 -3a778b1f22c9fc3d1b599131fbe16f4a -3bf25c192fbd7a2440342bf0dbf3e789 -6ef0beafe86b835ccf854c1a92cec69f -8f1044e1d1fa94a1136be2093ba4cb2f -f085dd2f8370d44dac293957cdbf67ce -ed467f7a3f09b21ae9fbf7cdf85e92c4 -4fe9a2c16f1741bf588d581012ee7c24 -16f9242faae03079564ce4a8a1e73ac7 -46fc048c4a7514cdb99e9b437f526d13 -015653fc33b263a5b28169fd824db09e -aefd18959df85443c31ded83a17ce11c -80ff9bbb6e5bcbe8f2bc1d29e531683c -aea7950d0d1571aaa570b963a26c47ee -d505eea409a4c2415a12b3240b4e7d78 -17337154b07f2ae57043031c0240a5f9 -2b424d9e6d8e59302b9916a20241e52a -2f20a73be82bf96207f148a3ab31e36a -a6875466be585088add2e326588a462e -634b15f413f91c22de004de56830b035 -8a06f205553f05c953067ca5272f7800 -c03334df58008c983387bfece1426c9d -d333b0c4e981f824e1b6349458ddb2e4 -4b871b31bd8de664d48b2f29458f6db3 -90e542e8785b3a08b183ac28aa574de7 -8e8f2342574c3f374678d3eb23c78ce8 -6c59e43757c9c401120359ee46ddfbd7 -11bd0047df947ab88590059a78e16ff1 -f28b76a2a50fea055e7dee2bdceb7562 -34fddeba90f9a39442fc8d0fcb1f0fe2 -83b0a925f2ca66740d1e8c11a2dab0c8 -293eb819c592c012e300fdc18b3b0ca1 -ba07bc8eb2bce812a1d2040905149fa4 -8373a764a7ee48b781f6317dfc722ffe -abc6ff7471a439c3fd4c7a1e4824d2c0 - - -53304157a61719498aafb6d14629c970 - - -202e57e1f2578b749e55a931c7c3ed49 - - -aeaf00778709d1b32e3202a373db3d81 -de5410f8539db860e90a0c437f592f39 -8fb373f8580dc2f95678ca861a1ba9af - - - - -d7c15118b921e6d79f7377bb74e8aa1a -74a27a4eb92496daff4c8b3e8102206e - - -5c4ba8c3c0f8c8d579a8144c6dc47049 - - -2ac655d2f1be28fd2933cae2d40e2313 -42afecb8bd19da681aaab1da177cb2fc -611d0184bd3366554cb614c0378fd4bf -f4a939c3c11fd0e67994c11f3f1634a9 -a351f05bda1c6a42dc480283d96ea60b -897bcbbda4f5cabb498fac37c621d7e4 -3698319e7851b8854df81e47b6917dad -a86b0ad84cb3ce606036c81e5a242503 -b1dfed485aa260d46c31c32af3cf16ad -c50d66b224e0149040bae1471d3a2ca1 -176311151547c8c1fa7791e1f96d7bba -1e4fa7fbc1072ba458b641f11d742a12 -33589ae7a0009cb26a8515630ac73304 -d162715195dff0e91e06442ca54d517f -11ddd08d54fa8b02bb74540d832dfc99 -d3cc8565b641fdfafcdcae9af57c8d59 -e90b617bcbc89e5d827fd687e1d7b353 -79a28bff4f078b130bec0e27567d3185 -6cbc423fb38b55cf80483bae13f0daf3 -421afea8d2305fbdb5b21202d1d3daa4 -688e479abbaaa0165afd0e3c9e22c298 -d6af3c9d9b3d1bfcdb39aa457460b728 -fc1d9bc8b43e2454db7260a063882308 -7bb5f909b31b4a14985abdbb84b80832 -554ce7dad70ccf08345739bcdb79416f -e8e6b1d6c936cf4d7149500198a7dac3 -bedeb3d6dc2b6517985393fe933f3f23 -1a8a32edbc28dca8ea58f0dcb7bb3aec -e7848d2a0fe7eecfe333449d7b3c4f71 -8fa3e78c68fb039161dc55bbb3f0f746 -903de14ab89a0fa174f58ef73ac64235 -37bb7c54512900c38f6ef1fc5c0f5ea3 -6fc13bae80547277c7899ead77450acd -3d968921d0f53e26e9113ee6489a4211 -72154b5948886cd1eeb03e270f87926f -c27094395975d1d5fee8107e06d0e5ca -0215a306552933b811bc7930ce19116c -7fe75636cb1cec491dbee64b3756cfda -4ce4b06d71ba3840a33a4dcb9735072f -552c968ad48444896dfdb713f9d1a950 -74e7461fd3c4b7edf35bcf567f864bc7 -a6d5abf2300c19feb8afc7ac17de9614 -f5165766cc964ab024eccb8fd65f98a9 -aae36c3dfac9b0f559326afc8c4bef61 -1addc62af2f559c5abd2ad53f5bff10b -2011a9c889baf4243f192e02dd63aafb -cdd5842f24fb7eee1fde3405b5db54a3 -2ad3fa79c3095329ae66eed2711c54b1 -00560e1c0b81e49d69f6029799a6dd72 -397b59991b940fdbc8e0bf3e76241e55 -4c22f876df5b8465dd209a5840a30bb7 -15aab5dd87e29c927b85328dea18d614 -42bf4f22044979c4f2a5da2227b4db95 -faab6d83f12ab9cb40aa95160986e981 -3b481f8b7853c799adabdace62e15be3 -3af14c6c1dc916c1f1adedf692f7ae89 -18e15b3477d8965aa8cb41d553d6847e -1f4fac1c26ce40f9f1e6139aa5ee1bb9 -7fc052151fc84448599edcbf1f583e2e -a5988e9c564c0a0d6580ee763de7a6ee -3cdcddc70edb076a0e93f0df0094070e -4e79ca699e46300843fe180d5f295846 -6d58a503c85896bf06c411f3d95eccbf -81e725d20e4792d0c832934e0b4d1768 -7d22d4c6cc8ad8b5110eb2a4a178f3a8 - - -1f744b872301f7a1ce8e969262a87dd4 - - -d4ebc7510d06937836f84961c55be335 - - -3ae9af24508fe9ffc8664852465d57e3 -47c80f0d87725ea324804bfe3f63ebd4 - - -c777aa8285dc3b9d75301b7a17a6a23c -fe69c569852a83a358f823da141e53c8 -4063d77c780ff6b5b79ec48debf060ac -8aa196e802d6f72bfdefa3b5e8809f16 - - -39c21946426cba4b60723422377e42a4 -e186a374ae736b0a383642251246a03d - - -decc55acb3447421b0a38d668853ebac - - -e553e7e359fdaacc24ac6cf70f4ef63b - - -5a41fe6909b58519b84ed41047c87a75 -3f61d424e62d222059e3d9b114e54573 -8d395ecfd1534bc52f2697ede733558c -810f1f8ff19faaeffff0c4738db008f2 -6e27b0b67f03b2b7e9e27c6f73bb40da -c897a6579efde9449f38572c02968ea2 -d6293a67d76f33b7fd8a479847589517 -329247bb2a92a2fcaba89e7ec980eaaf -8c98501f49d11930cd11018f5b67516c -f759e454f73d38cebd808908be3ab19b -3e9bb121320670472c99be79df37ad4a -f628f08b549f90df6f9332a24a097a14 -90a78dc63d3bcfece5d0d02e19941e5e -c3e33c1816e058858501bdcc32914525 -878398701d2b4f92a79366adece358f8 -5737b4aa9ebec80710fd46a3920822b5 -776d3e7b0b45496e666d0c222d2895ec -9bccc0d5f26adc27cd1d2ad25da2b340 -c701b5d076dec29b96566f6f5ed4cdf8 -41fb79fb13d479fc297555e981ef296a -9187a95d9a20180f3f520d6a4dc17107 -e4ae0100bc2dd1dfa8f9f9792e5f3c9c -3a74a2e94211f9966f39701c25c24d24 -5a78236713f3d2c88291eb069ec7b0cc -bfe22db4f51e8a452666d894c43b78c7 -6992f9b3ce6856117513bc470b021e23 -59a0fd9ecd7de0b42d8295fa58e0c2bf -d1c6fd4dd062fa5f23531e9f99f7d943 -a91c20099677f7cdeada8fd1a0fe90f5 -4d90073c0ff78733556c5d39b861581c -554aafd4e41fbdfe81d88310ebeb8259 -96f101af9311167f4ecabf15f2215b34 -22bbf1056712b882fcb0e3712b8500bf -6e6992107277cb5d6c7dae437de22a71 -00c41ccb3dbf4b9f5320aa0b07ca6c03 -f67b3160455accad85fb4082d15b90a8 -b49063e50418e2d19b5566e588e661e8 -91ab25c960808374d8c43cde798d271b -b288b09cbe915f05d94f37b402547e1e -79cdbd1a21e1a76da2cde3c44e94cb87 -83d7d646a25b170a42992a58ac9feddc -c7ed58416f23cb2060943c032f5fd713 -4f69cb8660473547df5a50ac5b16d106 -3f7ec71ce8bf00af32d17edada11ab81 -9c4b83283c96a6ae1f63a556933c9d98 -56a003fe558d2e69229d2dd6ab5db6cc -3a536e553fae15137a315e22d602eb01 -a31bcd82061c1d29aea61767fb4d9534 -8a781f7bb83695ba35c4db1a77a575d8 -e429800cc74245f0343705f19db80032 -f4b4691d1e7a01e3b662bea34e79bee2 -5ca808111551091c45a6c6b91a6db684 -1f07177e6539cb5747d29ae51b867669 -b744a252a876b7ff3cf19d8fee208f9e -9a02ce2013a481c64f2ab5323ef9b377 -f57ea9c530cebc193afab16022342a49 -7ecf64cf4c33beb7f731a2acd0ac509f -944f5bfde4920dc5075164b83475e264 -cdbf2f00cc40173559dba34b0407ec91 -ecb65a697fd592b4149e4c0a56fc6f37 -f03f9ba07ede1347f117cd6c47de68b5 -67a2b6cac6b5c64a2cfd977d2262a736 -e105f20bcf593d08b574d666a4659fdc -1d1a12787536f6c18207a29abe45310c -750372f7968345d08f8e03f99d085fc7 - - - - -7a60f63f2ed6ce4b34b69ae8a12b9e7c - - -abb18e4402964d4a3e2e90a1227b57ca - - -3c101adddca552fe762857dd51514b05 - - -d033e4f6d584e6c005ab98b75cfdc791 -016f786cfe21feb1af8ef4139fff7b90 -016f786cfe21feb1af8ef4139fff7b90 -a73b8885237ec16124ec960c5ec5af11 - - -ba0b6ffcbfe503f0b4af39f6d292042b -03654d950ab0ad4ad32a5586f3ab7617 -03654d950ab0ad4ad32a5586f3ab7617 -f832060d1857f1e4faf65d15d687ab43 -ba0b6ffcbfe503f0b4af39f6d292042b -f832060d1857f1e4faf65d15d687ab43 - - -d033e4f6d584e6c005ab98b75cfdc791 -a73b8885237ec16124ec960c5ec5af11 - - -86b24af6f0386af9f1e1bb941d2003c7 -4c616984a8663592b3f72f8e917524a3 -e0ae50e17fcd29b137569250bb3040b8 -b07a19b877060edad71d0c8133c9c563 -4b892ef95ba0feca4d59f4469a4ce3b3 -2734646aaa561ad0ac8ac3dfd0868b3a -fcc020b590c8a0a4da3d3d757d630eea -b922a2e97ea572db7617252a5cb09016 -9e9b473214c639b310e3e80ee37d1e8c -cb24ca767a4f89f10142f9972bd9b6e7 -1b773b463b76d2d74594e989b2209449 -e5e56d3950a1f3f6d90e003bf0d7e068 -fae881ec38165f31f2514ab8d0caa21b -e97c0fbe9869a8f6a9d7f9866b0a60e2 -d6b65c66164af0579ccdc3472fa91299 -754d4d0d76b3805edc8d64c3a145d116 -bcf08a6544003c46643fbc2a6ebb3812 -d1a2397cdb479777687296695e06c51f -bd5e00c03c3549fb769e326633fe1960 -3eb009619122994be49a5f3716e95326 -d21c3990b2f101e0d9fba427358fed01 -77798a72efca8c59d3d3103ffc1826aa -58447b5980f81822e013c53a69d55d7a -2ba61c1133bcbdd5bf4d7de05064606e -bac76324c1ff893480227d0ce85193d8 -dfd9488d1730bdef5e7e4651691030ec -3dc1fe6ae24d64bd1036739dc56f39be -67bbb73728d892af28f3d8a26429395c -810c0081713130c8d25b1bc3509fbdeb -719c7c6de3c772441eedf0663abdd7b4 -994f4907bb14f448ac3a44568a751000 -4ecd2458c4065de9d5052f58d486237e -2819ae3efa4e379c614ef1d36278e295 -280a87a8f05d376f5d4f56933214e292 -a0541e0740c2520523ca6a8ec5f827c9 -9ca4d349ff39a9d000bdd45b4e754b98 -4257c313773aaf9f703b7409ebefa893 -c2d23d0ec20e54c789b69f95b297de10 -7995bec1a02a24ab6e41d21460bcd169 -e1f548d95e7fb382a5b2ee9c9fa38b5c -65c18a93c9c296130fc6ec1f039a2c1f -1659023218e51017e544ad4e537d9b18 -70340cd23778a77a387dd8798c2f9fed -ba90e42ef3b6b88f452c3a3d466fa2bd -df0f43fb589f6ce9e938c77297202dec -d096e3503e71e0114b7ba5b821e1a2de -e27ac27a64c55cf2a628ee39c711c28c -26fb46a804553e04d411e0f603562d4c -879e016db1327a5325c54a04a05047aa -2eb10e54d58683e54999b0aa87dc3a85 -3cc9b54cb0b7df0b963e6e58ec1980d8 -fcdf4de995727c4d106e5cfaf62c7384 -b52f589bf618a0ec290822065475236f -9c2b43af488aa616084e49439c55da0f -3a7ecb8e2c75c7fb6be8a15fc4fdb908 -5442cb7e20921a65b3f4024ea2fabfdb -64ae30b6e476762eeb8995f0689190b7 -a798a3c77764bbc441792cb1dea86375 -a1d88eb55e84dad93be065cc40f8f43b -e41a061acb148287e1f8c4fdc3a16571 -36df037980205dfe059f1fd7308f6864 -8e4174f9bdbf487e91f73fa5cb07907c -3fcb4612fa389fad0b849b042dbaea31 -7381e1c8a64778c83b9f8feafa31524f -ddb63fc46f59277036603cef21dc94c3 - - - - -640fe591e3695d8b47d0555cb7c44770 - - -4bf47715be8a8ebfcb74483d37bc8927 - - -b7150383ae7d33277b6edced137d386c - - -ae55a1eefe734127c79202bade1c9bf3 - - -c5277ee6b21bb7ecc094964daab552d2 -1d4d3c60401ae26ff1f010deb0f266aa -53d7d7885ff03fe25ddcc30d60840525 -39ef21fca72b05149d766b6559ffe2e7 -c9b22172e811ed9b1640c3e3972bc2c1 -01b0463a2f3d259b1a73405d14bae002 -b6390a186a02babb56fd815543f36918 -65855a76e55303a76c6f0be1fa835a19 -dcab548e1155b0c379dfda56b4178a6a -1b344a5c954401e30c236c65e6f7de73 -d52137206851980ebe7a88360f7ebf72 -0b0eab64eaa80a0e96b09acd785a461f -a50933ec09dfd04403d15be88975d2e3 -03cf5413ba9eb436693ffa6ca8e80c58 -60b2e4d2a719eb487b456fcb66b8bda5 -9f7faf573ab7aee8a85091f8141d48cd -c3eac116d382d837c98ccab27f9f3a90 -512a614742aeac612106b38f36830c1f -74f6d5aaf64a6a3c76fa5eef1967eb60 -2e818af7d25611b385c63d33d6685ff4 -1052f1d14c1ed7000296df653c8754fc -b8067869917807971ab0c87cc12833ee -645356825c05e2f24653dcd1d6ae5a6c -63259862d9111982fc2bfdcbea692635 -3bd8da7cb54b869814e51db5cc9127b7 -5eb89aaee2713ad9c9ea914841863785 -e2556816007e8b2bc69c0464eead55d6 -6a0419c5a77c660861e642f6b23b466b -a7e69e437e2201a4729b3addad008453 -3b3c3843adecf1550c725cc6eb788885 -f9e4c2571171b37dba9e05f342b6dd6f -8a6725237e3a8f05d4aca9652f4e796c -6ecf16935435936403cd8da4e38d6305 -0316e7a6684ca2c2f06c13c8ac15117a -b3184a5e6f07fe0d7db54f1ae98fe48d -2ea8c9e0cff569583b9f10139381c945 -74b7bc756d82755bfc722244ba59c85b -4e3172d169f123f2ed42e6457098e352 -674204d15d22befafdd4358e070c87a6 -2a6a62fd49941a7165def6478109539e -d15d13a3ea77233149a91517227af14c -3b4b18d60044fe6bfbc33548d90d06c4 -f10a00f26eb8bc8ef7de129bd482dc92 -bf7d2f0a171f6117848b160d845b65d1 -389f2ea1704535252b2ebda860943187 -cf0308117211b637f65c28d27f4bdb2e -804b5912e5eeb307632392aed646be82 -4d043abdec007dd6218514286e048799 -eee10a1f140523369f5d61f48cde2abb -ea260364fcf259f67efc42b29919210d -f4318b158b63b42f8e9e559df9aa9895 -4df2330346ff724461480ae6f292010e -21a632653af19eaa8070fdd6176b5d11 -a30f68bb98cdc06a4c9823a692295001 -3c98ba89d8b41bfeddb43d49851a6451 -ff352494114e6def4abb66e0a60c73fa -815368e4e80aa28db96aa5ffa1bb9b25 -da3a7f1f22d8e177fd667b744d25d4fd -5bd595f803c08f5ec452e0e26b44c8d4 -cf9010320d6a8427f2cebc5eb9ffe5f2 -e225555211216fbba789e9b30ae7675e -c16bd597445766f625bf05ba2b14079d -8e51715957cebe1a603da9ef05daa521 -bb5cc7a600501a46833bcbaea20d7a87 -dc8d46e6ea50a07791978c262648d00c - - -628cf40a4ba7a223b5993c7994cf21b2 - - -b6d7bf775170c096cec0c3008cfafe75 - - -5e3a2c9ca377739914e8ae68a20bc04f -31fd312485aecf39ca856829e83ce728 - - -a58e595ddf165baa3098f33784833dab - - -482aef6f653e109970bbc89144661b83 -cff140b6cd011f3ed1b2b8515dacd71d -10dc04fefa6c077eb0fc9d4cf6b08976 -3cd6621cb7ebf8b18f9c545970472c18 -36177571aafbbc7b748a6ac7f88c7f8c -49fb15445f366f40756933f3a7f4a33d -3225616065c4d6800742c4198d01fc34 -83db029d3e555ba20c33026096385d22 -3162dff0d73c0e11d364e83a257d59af -635897206aea1cc4d3e7dfe2cdd5e148 -2eff43c00544e8d108ac301b7baf06b3 -f2ca8754e05addac7f5608956e99cc04 -e6758c7da41b4954fbe02ef708e7b676 -a6cbe488abf24b390c8ee5894e4ba442 -22744e9c76554e1b64204da77f9df1ba -d672c7ac1364a6c1ae768a8726298e43 -1ce8c0fb4e668c71b60bca1b713d2246 -4cd817a326c70db4b25c865d715c9e4b -8d3b04e9380f76ce10432e1145e5bb40 -fe259e0af5af7530a36f03bda2bb04a4 -3be72ba54273b69970f4deb1c765f2be -d471282b57726f2e8ebf9a73d1d61132 -39a65c3ee253571623ed7250371d2d30 -050efb47569d68b89fdda0728718b41d -ff91c33a9497542a3c7d613e71d68cdd -e95ccf0083061be790bf0a4c5bc7596a -a26643c93a91237ce4f902269437aae4 -075807c22283ddd452460c45eb1be3de -099547d733b446bf5576a9d98e61f6a8 -92268d20daa8335e3888b244e34f1621 -264d5915e61d0d70c292457555a0362f -fdb72fb5d64b1d884a8b4f8bfc48e4b2 -d93d0b2e8b8ceee14deba51bba71a8fd -b10b22cd5e94f18ac574d0717987d7ff -37835a005599a339eecccf470297ebd8 -e28a50ca2f93a95a2b664fb1bda5f673 -4f4bad87986619b74e512fa04524cc65 -00fc8d87b30b91f6c7b53f7b07b4aff3 -f43b829530596e7a7ca5686a2e0c8dd5 -084975b28a1ac65fbbff282a44dab580 -8e1276429504053eaa454d90306e43cd -a4828e471c2d89ad6117658ac6d4baf2 -eae263e4fb8ad72ecc19d7368e3e20d7 -695f3984b4470225a5b28f73ec31e9c5 -6a5b84a20b5d6744c8b378ef774356bc -ca8d3ec0716ce3a9dc106f49163bd2b9 -57f8c6bca226cb035a424145104d80f4 -38e7547ca4ed955bfbf37ad9904d15f4 -b6b19a1f5c8565fa5fd147955c37f425 -38ef2773a2ae7ba320afd4e1631bd1fb -55ff6a279099f13a30c64dd90d25e448 -4aa01ab70881c0b058766bf9a120435d -7771aa687808cb57e8f1ca9b82f9cc49 -2d0c78c2f6c18aa1b6d39647734b743e -74e1dadce9a1bbc6ad0278613b08277d -7fee923b4bce3c354ed833635fcc25f8 -ddda6421482133fc6ebf760e7740e270 -b1f7c3f8a3e263904850213e499ec2c1 -a1261ee684ed9c5180b6eeb47c432e80 -7cdd9c45bbb60ec4c7f7fd5c2793c6e5 -d70fc51a1be7e17a7676400a4cc0e327 -41e8f0fdd4ee766f84ddb8ce2ee8689e -33eb9d37aac780309bedbd367dfa7b9d -a841286cb90b2a5239aa6ae6ccf8d9a1 -0c85c979b3a4d7ef49a1db4c71e832d6 - - -5a24be2dbcae65e78db23bf732ae39fd -6c65bfeac7e5b5b28af498f2d757f3f0 -2f0f661518f1dbda9eedda2b6bee734e -060e9e0bb5a4e5dc1fe0d2fb20b2c801 -b4f2152a14d790847565aa176161acab -2c56066f59944c0167a8e4321f193913 -4f196e19ed8ad0fdd14cb73c93fee1ab -dde71309b78bdb3b366654446adea123 -05e8b4037cfbb469f9ddc37e8fc9e970 -198d39094c81152155f8f35108845bbe -5468e59e8840a0a6799d6db5d36733dc - - -b903050b3c2f2f9c2e14a68d547d6e7c - - -c5a13380a70c3d942c9f47bc9c66f105 -54b267b28293967140a526badcc79467 - - -da21b5ee018be5687a12c5a5de31c237 -133ff41644a3702f60d7a2c6bf429c5f - - -6405ccd00a5c2c81221b82a9a6fbdbf7 - - -b02b670044deb0d0c6c7c0e08e158d9c - - -b1e7296ca42039d382ed5a4af666a4c1 - - -6b2b4d990bdcd974683755a444f0fb89 -6d8d9d876bbfb7d535a2ad37fa3c288b -53e6ea416c84879576b4881f9266067b -a63c5a0d19a26ecf48648e9f258d9ba1 -cd3627c392a4241a15c6e8965a6b2eae -d9e276fa43be5a8ad48c94a4f7089fcc -6a5c8cc05b333d062f330d2430493bab -a44de256251de559963b599511a5e0b6 -c3c1e5581c85375440d5009e6d54d049 -487a96cefc1be133cd1a3a4979d1e182 -2a8b760d0700c3abe671145d267cff38 -bafe6e2b89c924169cb82ab47315e0e7 -e4e8236aca00672d547d1f3613e48d3c -de9e574c0b44c4719bb1f83578b815e6 -3e7fed8b0a65773cb17750532994b395 -b2f6e0e312e6f4fd395ed5eaf5ef3d13 -a296e114b598141152fec8be15f50e54 -e5931e3a09b21d75678e74b4ab9ea607 -b062eb07fa84ad1e905ab499398ccf14 -ec2661871e8f1903ec84fbc469dc809d -a4acafa29fa8877e29fd2089359efbac -c39626c5a90ae521a6d553f950c5ac5d -8a99077724ed433d911e3287f33fe5d0 -c622148ceda49da4faf56ae49a65336d -95a0103c5fda9a5b38a8e5ce90de43f4 -c09ade70ef2e492c1c5220aad72a2bc6 -da084fb806ccfab38f46e2c981a21a67 -d2beeb43f28ab2fb956d236a053cfe49 -fb5fc514e5132640de7feecf3f6cc7b3 -f1fe5e39f45acb48c465866c5de3602d -85cb52767e4db268c9ab7c4b703821fb -6f628d6a5f2c1ec73d7b740d0dc15693 -e5a1edee079f2cca0f52f7a80476b8f3 -8dcee24049e4b61868645a49553171e4 -7f6a06b4122d989a3649f3e91bd988a5 -e587ce3591e950f68827b7677d27b516 -e4a3547bfda39ce77369ba0ac530cde9 -e7118b21bf601e8cd63f97302d7ecdd4 -1e30220cd1c4d69488b59242a05788c1 -ad4ea14b69345cc7e9091041ac77fca8 -26bbd172479da8b66150c1a86afdc0fd -846a1dd4a26752300cc4239b4c84b864 -e672e525da9adefc7be55534c15a4d77 -5731622ee20f93f4b44c3770f8f71c05 -18a99293f81a734a2086c0aca26c47d9 -cfa19319b2fbe6f87683e5c743d0905a -04353f0157697b48f3f3d673258081ac -daec3ec1f80e3ca8da943a8ff57eddcd -1f61c0621f1b3c205552e2c7e5b71636 -0d7b25603ef778a20dc8fbb403d4e905 -799271e4b2e7a15bbdb7c125b0ea9f5d -8998061b08a4497932e91f87a821e01c -c13ae1d3a6da0bb2aa323e186dd1d386 -e5d9746d761dac5450cdfa82fa59ad99 -bfc88159098d140c910c1a0eeec04fa1 -73f30beba864e65933a6520d1dfac7b4 -945573cd76cd8640a58536054efe5517 -31b0fe94d3cbd166075e6cd8ad01330e -3cf27c83b3f3dbe7a4a6f8ab17570f1a -10f34289c45d690c9b22b4f4ca69389b -c547ff36adf3f10501629741f159e236 -f14c76da432414dcc70dfffe6617b217 -652b4c23d9d52bfbb97a5f772dc026f3 -e0b0924f8c81c13dbbf9aa3e6671268f -7ec306afaca26ed3c3000ae5c5aa8b8f - - -e3f2dc130c8b1ae2713f49bed2ee9d11 - - -86e1b26fb22425ba2e5c88d450ebe4c2 -a5b115effaf63469aacc14b2f367d3e6 - - -cb4357c41b35084a10ea91b6f0cb8873 -6c11a20d3f2aee3890d163c714db76f4 - - -b985d77653ca5153e9173b5414df5c72 -38b6b214ec3c08716a4df82ba842f5f2 -96d7eea17d0c1c8137b4b6011173f6a5 -e21236622a913d00b91329f253b16cb7 -0c283c2fedca38ac515c9c38d0d9833e -ae174e3c3923d123da4ed97c38206b7c -8b118d141b8b3e5083cb8522796d00a6 -a5a9b42f09fc50663bae6a30866a85c9 -73c2cf52c013db3a34407199cd61e01c -98bc9064118e90da2c3b75b6b1c18d70 -79f24d886bce41f691dff2a4181a58be -560784bf56f8e13f2cc6704ea91a10ac -ddbc03e4643c8edc265269203e1aba65 -cef0502cc3063495cf0ed8589d5faa1d -bcfbb9bbeba0d02466f2c3e0dbe5d5a7 -7f52a8c1446a8b39f3b2184b4779cf78 -8bd60a8db03080080ddd3db86db612a2 -5213815c80ab888e913dac33e2cf49de -13adeb185bc4da1f790d1799c57a4e5c -9a67c1100d37fd7f8e6d516b4526f06e -6191751d51da5bb0c0e50115607c263a -bf2c298ae86ac9a9017315f0efc062cb -a702e1d81f743786d0584078dae74555 -73ed303d1baa66412a591394baaceeb8 -e9ece6086374f3b96f30d83685c43866 -24c29902d209ca376efbdb43b313d288 -ff320977a1116935f37ac576fd1a0018 -159f965140bec8fa865543d98ff658b0 -7ee09d2d39cebe9aab818ded8825d6aa -812e0b0be7cc0485057a51d49f3d3110 -09d56d5a100b0cdf0a6c0a0a4b2d7be7 -c532162792df71becfe1b557e4615ec9 -4d064d20d107427da0985e39c268dc16 -a6567409e398eb1be6c22e9e7d825a30 -20a6e8978c06ff0d0c8ba10e62b70567 -03d5b8f6a7e05fe561af8bbbe3b39b9a -ec2e4850337430bd8922868931c315b8 -473c75604c49b3ce9e6ef0c0cac85744 -f0d86983e280b6364b2ded29791ce93b -a9a21e63f4c04330c72b8a79100996cd -dfd26c7ff7fbcc37780eb8bcbce4b853 -27b25332e3538ee896152374d3d0cd8f -01449c67cbeaa2a8cb389717019120f6 -a7c255677fa6ddae2000a54d99967c35 -d34dec52f1645063a35e7ea06631d1df -a33c54dafb734391d511d72fce28f535 -49592f24b459f9672bad02c559382454 -26698969f814885f602a6e98cc0ab33e -0f0bde0a6e9b373263ee14b02668160d -f8e786710ced1bbb94a512a87a729245 -66f920be1d1805e448d468eaddebb4d5 -9fe7697855378c903fd6ca477e39ac3c -879a8b36a6862a9f3d16cbde68ef2b12 -fd1e90e63ce563ecbfc3e86d51c9f959 -648b8ee67b57a2131a1681e7a085d1f0 -fc5f2424dc2629f1fd66cce3583c0a5d -7e4a4f85bd80b6d27ebee757f00d1161 -7b9bb98354bfa0cb4c6da385185af33a -cb73adf02a7a885af1fff21930af635b -294a361cb7917e4ad72720426d48f2e4 -61a80b1c45bdf47187acd4a303731128 -ad3b074f50b800059b97ca1ba186daba -46b2c579d215b307ea6f519c47682639 -67d575f4441b2cac67961b696b77e08d -2ac6e19f28ff7a279f44dac7b403cad9 - - -505d35a020c3e95a860024c7a5eb9eaf - - -fb32dbc233692718ee8d705f3795818e -b9065e340d80545ffd52c987d6e1cdde -d2fdf22855dfb470dd12a98d193b0294 -a6056a5f565a5afe1125dd5ec345bbae -758b08db561feca036035c0c2f8c486a -5a29a70d0cce273c9c7e763d73157f12 -74223e79d1cb08e07996a4d82cbf699d -4a01469a35089d4c0fe9b4dec861d481 -b1f41e4a0b970090882c46bfecccd175 -37e189ba7e650c04a0ed30c447f123cf -7813b6214da575376a7226f33ca92d64 -d6162c59f219e35307890afb8363d931 -983729c2e3729c8a76110af3191cf532 -865c234fdf958ffd0a2d75df9d919c18 -d2139add9c63754cc9a46f8e87001b78 -9fb7a245311f94cb5485d0716a91b46b -ab8923da645d6abf8d6b1b1d29a67dce -4ae96a812d3347007b85c60b809b621d -74c1560a1e90e3fd07fb62ec94853dea -701c785c5095faef2d96dcf67f25a56b -7194ff79bc8f0633eb12c043b2fae8f8 -6c3864e371c0cf46cf9894192c93fd53 -84bd4993d9940e95b43efb672703e508 -63d15f15aef078f0b344588d6122bd35 -7a6808af6ee2a7d55d4cfeeeacfb5613 -04b885f006f73d99a0d14db935c649b5 - - -0f205d1900bc5a85c83967b4ab2e88b4 - - -d3854403cf08e84d30463f89a32f2dc4 - - -c834d231620c7df3f385c3a49a6b3d46 - - -bac68714b2912742376e52bae764ec59 -b2e047eebfac3ea92afd25ef98666658 -32d0997f17421fbb3a86ee4c2bf67a9b -ec3a39c8e3b05819cb4f9ebe74fd3323 -45eabec8f4f074109c3e824500dc08d9 -75f56656276c886a12736c9c0a7befb8 -91819a724a8053510d604238e4b58ab3 -a6e50f2dbe1ff84ca43f5bee0ae51275 -22cabd0be8bcbf938fa644ae3a6bffd5 -27cf3a2166066e7c046a92c69e173696 -0be5ff53733331351419a804fec2d65c -02c42629f742ab4a4d9a27ce6c703143 -f1b9b989b039f70783a38b8abcc29d3d -fc28aa5e01775d72c6c509d671993bcb -5983992ebbf53f21ceeacf95623eed77 -90bd57b60223a7433a16ceff05d97344 -5da7eade584cdea9e697d1c0e2f2c19f -97fe3406679f991bec2a84bb0d648907 -c6d7514fec5ea3f911328b5a2ff65bc0 -a08d4045664a3a807699f0537bdb93e7 -7e81750ff74ff1569318f9f795584910 -ebca6beafd3730935bbc822b52bd5603 -60424c97daad69207a74991017e259ac -8b1b7e2797bfd86c3682f589ce17ddaa -bd2acd5c4e1dbf8abb0e8cbcd63941da -aa92065e9d29a0d969480e18d9a7c45b -8cc8036acb5131a42149179eb99973de -57742bc53357148832b47a87e3369791 -7624ab4dba58de5f82b466f4eb08d9bc -d93a7cc7cb0762305676fc94a39a4a09 -ed99d9404cdfa63b7f6a97e287c62b97 -7a268a6642797b76d4f627f39c64a2d5 -1b55b35346283436334c8baf3fa3dfab -565d4f7285e25e20677d947592f18615 -9bc75d901e6f5d74521f9508f66853d4 -aad364a44a1ef32ef0e722b4ddf900b3 -1f99f7b52822d4c59d916447dfd7559e -e292cf48a7bf4a79c9773a31cf2934c4 -4816217f35fd66a1de1c7ebc7c976651 -3270657a91feebc923013a5b1dd26e1d -3bb9937553a7e043b34145d94372c4cc -5cf74ca41c491f9c15151253feaaebc7 -768ab1e7379aa67845b73ae6b7114be1 -c117bb40e20b69f3da526944681473d8 -d72b2aad7510c0e3ef72683b26fd027a -28d916b5a88825b69f709262e601b0ee -92d3ec3fc776d88fbc6c60503afa5556 -2b4d9dcaa5ab568a61ed251819fef29e -15f0bcb8fe5c5b09d84155879155c6a5 -384e3d95df61a3f08137014035ee77e1 -1894d5f165701a24bf022017230c8df9 -76c81607e4038f4d5c31f2c55f4b2f12 -edcebd7174cb5d346fc1bb0e8ad4d6ea -cf70c10a5cecf9ae26fb704e9421d237 -eaba0797ccfdf0276124f6f99797bf99 -cc7099e04e2b587cd785e517e1592eb9 -6bd22e44e3eee865a50c7bd147353352 -5ad064f7e5e4973c6ff8adf20fdc9097 -283893fc0dbd7cc5b7679ae48b412f14 -ec5ee3c5d17db65eacb68f961fb6b373 -02194779d3c20eef4dbc9a30b72385db -134f4b70f31132a44eebd688fa862959 -c46ecff421b412f95a3a1c54617557f0 -61ae7c24ef5c91164263b3542e8b8f0b -820ff8a3aba1d08a4966c828848aed56 - - -a81d80968d54b8e6d31db1fbbd2763c8 - - -c4d652a582af1421eb9a0b1f99c6d250 - - -c4dc9ebb0311552c6f3dac4b11334a5d - - -2122e1438e074327f6b573a239950fa0 -9c40f2e3f06a503013a8f7b94ecf4c90 -9826e5b2520054f478e031f1d8b06749 -e3404b9c51f7af0b604373712eb44561 -2bbc98751301bddc8b98e00dbb497ae3 -d1e5db489cca322903a695682ec464d7 -4ef63ab18e11e0a1776618dce42b0c68 -00e11fea38ef53d0e99868e5e5ca3346 -345c759bba2bada6514baae01c2267a3 -9185b0f6fc929157e4e84a82c413d699 -2ca72172e0dee2aec9d5841bb3a2c6b2 -856af24ec7a610a60d23888ab1d2f27c -23658b4c4f2ccd097c75082fd75487ae -9ce75f5d9bf3295f1f9823be227a8621 -4686f3a2a0357dd5da87c3d4bc6df5ff -76726937ea2d3889c61d6ccc5a09799c -c271dc0a582c32a4937c2e045380e931 -2bd5e9d1c8fb89c95faa6a97971420fd -7b29734a895fb4fffc1fd13f93980adb -e66626a3ce21b7cd66732baa13433b78 -0d321674b7d1e0aaced16cdbe69e4cf9 -31c8d8ee369b1951c2ef80b67e6c0ec9 -f6d252c6803dbb9b04b5b65b6f8d39fb -682c930d5a0ef0d12aa0fda61875bc0f -48c7402486c5a80774f5addb0f109ace -2fa9f916bb83bba6b5ebd68be51d8df9 -b7dd4753a1f73eeccd3e0d0c62aa6c46 -10734b49e0f9d2803b256b883b9bf3fb -516927da047cdbeb264d2ceff1bc7302 -4d00f1ca9878eadcfd9464e911156b9d -812b7f68232db25ecadbe4283929a1c5 -8d62607818f94d8a1637bbac1901602a -5fe30721dfec5ace0d84b86415ea12c5 -8e80a351912e1d9c3e41335ae2b08768 -ae3609a24c28179373af4c58c6ffdf97 -5451e69fa34c32bc892d66e8896aa782 -172e05b5b4f37bc52fc55ec3ddf16c66 -a592c3240592cd0bf5459d0cb91f060d -9bc93c463af11160b7419bb9b9b8c04d -7969843889aa44cb8e63629c88e864e6 -4c0d7c37cc0afd8585c62276f736ea6c -0442580293b0ae840b7bb56095d0eae7 -e3eaad6ac1cd47ab7bca00b1aa996d2b -502f9ec9080b807dd076f238ac6066b0 -050a1b0a9290bcec41595cbe7626c6db -7f5f888e6640de48b7b0efe59ee94976 -96133c2f110639a2ca58ced7482141dc -975fd7e0efc7724969154310df64e698 -6806b9d5ce203fc4e6d38663a71ef27b -23098ec985ada5f5128ccc3527e461a4 -72761ecefe18d122afe20aaaa16f29af -f379f3b87adc4f12cd701bb7acf0535e -ae213dd5d98995ed7abee5aa12c9b37c -99f536af5bdcf5d1c0ba759992e509d9 -94916b5d7126d3375c8eb0f7925072b1 -411dba233b13bdb756c2b98314f5800c -9885b4beb2e0e3e2ac4341a6d0cae010 -093451992f3c1ff768b1fbc0a3490a42 -2bc69e3f4bc2a07381e17120087609a4 -f541e0145c3cc3779ad73392dedacf9b -6b7f082eb0413e1beb242ba6068530f1 -154fc13ae002da4831a93d73a8dc7571 -89b85d46dd17f5f9834192644138cc3e -304125a8db08f6dbf8b04a8e48c6ec87 -0bcefe1dc3173741c0608ba7ceda0ff0 - - -0e5f05b82a9b77b0cb302e65ddd05635 - - -03afb32f7ff3e1eb0d61cf619dda3895 - - -0349dfde60d4f7ea1676e23b85c2e911 -63610106f8fbf5414802aea71cc4a4e9 -686084517ffd9057809a0ccf25838f9c -619a4182d7f8ae40abaa0ad405aa79e6 -06c3338556f7c625361fb1e60f2c64cd -956293d2ad25f84ab223b5f53cef2390 -fa5aeff24e2b1e646f01f9219e1f4b31 -a298abf1d5f956a39f1c07a8c606e862 -5c25d9aabd6aaa2a4bf443c7008bff64 -4298c4c0ef40f1d5c051356f1b2a17ef -6d458a1f1acd9ee6f92c450923910cf8 -0b5718ac6b1f7dedca8615f9811e2ae2 -fb4971d46e41755e42348220576845fa -2c53c5efbd7464c95db97e373d7ea35c -4ff541158352d4ababb236a6aa5e9061 -d16c6bf5384fd64e9a2c9514bd9e39ff -bae54fd8ece7a085248f4293767365ac -fe9f4ccbbc7951fc61fbc94ab3092a6e -542d2f2ac444fa694049230e4b50dad7 -3f8bb8d347a12d31ddd9c44a334e0084 -c710dcb02d9ef4ec99c98005d2d06ff0 -fa798861376bfa8c7e9b814fabb27af0 -d2ed3c4af62db9cf4b48802b67ab6468 -6d847079cc77cf103dd4277e9d4fdae5 -97a29a9a109bf806f2ccb930cf097ada -6fb13b77dc08c87950f0b064f8ebee8b -3907cc81fb7e7fcce1a94f0bbb51d3af -7c09b1415801cd7a2d1fc6bf3122c182 -b112314c309eacbb45235456b3fe3e71 -5463f954c60ef565e2982a8f60c940af -1d61871a075da69fb6a66ca0870a6e5b -6673dcc97bca838f5636c36369a77dc2 -e91392ba55c589df3f6e9d235c148a47 -a5d6f963b9fafbb25bf11297cfb90a2e -a7a7914e881b57a69ee3ee50ba4f39a4 -34ddb664d0ab4de2050f93ae3dfd4d37 -22e9eca179b58a57467cff5659b36b8f -6ff23c9054f454cf05da98f8be975a83 -f9f216704c893ad5fad21cf6887e312b -2e00151a478a8d5898bbd3b486a2a3d4 -5fbe153aece58eab309ddd19226e3f92 -bf9a7425668bde0c9027556ededbd7a2 -56bde2dff60059cacc95e478fad11c1d -5bfd0c6631b801853e954756e42de150 -1013b203fd0e4c2da6853f781df70a18 -c7245b45878f02ef6de41582fb9270f6 -210fb494a11fab76614fbf5d08881a77 -794201010c95f1c43d6ca4c5160673de -30975da6c7fa7b556ac2ad20eaca5dae -87ba4660955ed43c76a894ebae23f41a -35f19f9f71f3e9803a5e5af22fabdaca -81ad2c14e9462f7a94c2d44459d51246 -89461c2afdbe30e1b5d1db586e06652f -2241c36d8f39f9d45bb94662de5007af -20a0cf537a7a61809d6f0ab25520c302 -51ff71dada11446c64b27c892326a87c -49aa5f83f36bb1b67a3178a095a522a4 -a7de96e55db2eb0a7cbc4226c5763546 -f5afbbec7c0c4043ed0ce255c3801fc0 -cf3016d2d8d477406c762d58dabbbbfe -ee20b0b1a78fe03948ee53587a24c396 -61a69f52f637ee714fecc4c723bfb9c5 -ad7355ee1a27a92d56f0ea3d0528210a -c9f3e02069c982036e19fdbad60a3c82 -30bd33dd5867bca8ae4b7c03363db4f6 -b7a418a6de870057dff3eb1d077b2e52 - - - - -2e7dd26b014e5b72329ec8f6ed9975ca -3a4bdfedca9792320466e9c0fed58c05 -4768144a2156d01dad0df8b0ac120095 -9c1afded1ce7798b1cd6ca4cc61dfae4 -fc13f9688977fc797a256646faffa866 -e9427a836bdbdce255e9134de57484e8 -2a3671ea78a3a7b4f1946625737235be -bd10043cf4f91c6931fd27868223c530 -8e0e256003a8d1dec7a5ac13a7ae304d -95e800bc5cbe3202cfe41b1b17c7022f -4969a155bd70211e993a76f4215b09d8 -a5cc8e70457f127f77765c2d77644e21 -62957579a880b5603f9c32a50bdb14ce -a459d5984067d8da16a7d47f35c67b8f -5737cd18191c5c11ece98fad73482125 -3e6cfd8c21d6a8ad1022a3883a0db65a -af13d14c1fc24dd90412b33e20e42a13 -7be86c67bf8f88d06e5b6ce754c5a18a -a03c188d2d679b98a79a82b0342614e8 -dbdabc48188f62860eadcb1aede7f6f7 -d8a6028a77d0aa2a08894e4749a03428 -c01a8e77be74f42d89f956540b2dd8f0 -af58c45143890421c6c0c84cf513540e -68fed2691e16e97938c695ba009ec514 -a92e2573661f4989a4dd972f58345a58 -2c862aa33e458ad30001166581f0eb07 -b0c392b0be31f2861ad74e2f4a5d1c49 -819a0a3761a90a651ec448a1aaa1a630 -1643b60ba6afede59477f1725a65aaa2 -874ef15719b219c69477988f8dfbc3b8 -a2794fb493f5cab0a1c1b4bce6ebef46 -12f0382bcb4cd8d6c8a4aab117c09350 -91ab4e09bf3f12e32a2bd18c0f1c7e66 -32e573b584637f2ef0e4e6c6c9c30aaa -58b24de5b00796597ec404cb95bc84a5 -92d44534a8292ad7002070c4a999c90c -cf67c993408f4d06b374ba9a4ffbd21e -14df362aadc8a850e182698367819d98 -108062868b30a4df24a6ab2ca90b56f2 -15e02ff036a1f2aad1788996d094996f -6f920dc7718dbcebc8bfcd967e8ae326 -08b9a65ed172b1392385a25d673616d4 -33296b9bf12e7de6dd8eff02809e05e2 -6f7bdb6a244ea8a1a51a271be1641487 -fbf62cf8cddb04f96617c487b097cfe3 -08c0505df349f5ff61e7fbc57aeb34aa - - -bf5dc59bca9bc1f7793d6893040eb9ce - - -f4c5e92cfd800f12aa1650424fe5674a - - -ffc48f1ffde7924a1adc4be3e85f96bf - - -accab4230d9411331e5301630048a5e2 - - -c240bb7dbb2e85d910b8c85343d68c80 -c36c3335ffe9f52485f7f9246d991b1b -62957cdfb1790a620593f891892b4cf4 -ae4d5ffcfba43c43792a00948e400a4c -8472dd267a7c0f36258c1b1c33fefe1c -041cd0d0dae4436f410042efe7542929 -b9b21157ffad702054136dfacad80e75 -ae4b2db4b903230ee38d2ee40a2c6e56 -43aa2ae8adc95e1b176fc6e5428a096b -f14944e3d5877e8dc213a0c81ad67214 -b47d2bc1ca376839d48dd683583b54c2 -68ecba33735d58488e91f9fe817b5dbc -4b48b9e8b02f76f13c5f39d17f1ad71b -8b3785fa44dffe6cebbd50d78d84af3b -d4cc0a019c0056f9c6001fbb2210b766 -98e5199b0c3a6d3dab240f22a2e1c17c -8ae6d716d87e25ff59e1c2d3d49150d2 -3c0a6e724f60b955074b1425c0dc52a6 -78450c1ab58ef126f29a21a9ac2e6dc2 -d3dbcc4565d7661ee3f45e84401bb34d -8110985385772ac7b2d9e90adf08f769 -763fa2a8c242e5541f0e9c59e5be0c91 -00c223cc64d4c68665cf8d3c0d32a632 -d7494cd76abc606a2c200a217d2a6a07 -a592864eae4b1fd55af82e98ba07d326 -29ab57ec4a083e9c51eb073002d08682 -5d7b9b21d92eb1240486722d97d74f0a -95d2d2e08aaa0d1426b4cd4093ff5101 -94dab6d35ae6fc0993b7040012c37e3d -c046f7d33ce43b59ca977140b91c8383 -b93d26deda65dbd18455cc7479f06e08 -f35a9a0c87ef782b937b3e24fe981c06 -b26b6cd27dff99f6d51ca1e3a1ef4743 -8f9d5c66907f6a702a3395d2f6202cd5 -33f550335ca0c18fb4af1bbe009e435f -0929f0b5e3254b6e40b527b1abce1815 -b753dbc9b05f352c159b88304815cb7c -fc547a5eaa20d5e5bb777e52640ffbb2 -7929c963cdf3a8850d7d54928ca662eb -1f56f8a03d45c2a8ed59c019d94eaa5c -c1178fffd3c603cd2257f1542c072dd3 -564d13340a864d2ae601a0ddfbb1cacc -6b7052928a1a865a23f59fba1d313a88 -6abb3a6b47621e4b1aacc1e3521ff7c3 -20190b4ea32a3cdaff054deb7c00f467 -8efcc3d6ab70c2ec60d28732b3e08c9a -8acbae37164eef94b59dbe8742676e89 -3ba6aa4f3f9c0a7b3198846cdd8d10db -39c3e78a97c37b5a302826a4684a3e75 -17f4d13b497c8ce80783340248cb0f26 -ea65decdd7c578fcfc738ed1c77bdb26 -885828de452fd48669a7665a5c69e88f -0848a1e0e3751ffe698f8f929eaf59ac -8d7b7ab42b7cd5334f5e18c0441abc9d -f0e5b29c15f18eab63138d7589148fcd -e1ba46513dcffe328ed67ade611e6582 -5d644468784d7d7951291b2a6bcfcc77 -dbc68fab8f657c2fdb11ff969b55109b -ce0378f488c6ac4a0149d63ce950198d -2638e97161f75de012118be31a22004e -9abdf8612325424ada32c03738082e68 -2be3062d24c05edc8df4a0c9b1d2b2ff - - -5f3011c091088583798c8bf0ed4adbff - - -80cf4a974ffe1a69b6d6b85abb391d6f -1e3f6f4bcbcec87e78be9a8cd0c11dcc - - -ad8c831d187419e5499883a1ecc2df68 -bcac19ab85f8691089309825eebd0a63 - - -70ab052ed51dfdad78f49615a6f69e60 - - -254df5a7ff156ec65a3997a119999809 - - -2b250cf01dc18e37e2193a957ea8d4f3 - - -70c107b517f82576cf21b333ea681b3d -c667df92801521d707613b2b5e179c5d -61cb2d4c36d4ba917c167447c2233d2f -6372450456caa25eaaa1a45bd56f63cc -30f9e470cb903ff4484593b5a0c6697c -d5f86a87cb6212b2388a84ede7d51074 -034798d01e3c2c0c2d2bbb394eb8501c -6c6b1ea9bf7b6758126b5ee6527f76da -8bb532d8e283ba1068788410dbc08329 -02a14ab247753e76996aff89e93bece9 -81738a615ab84bda20eec985ab2e23cc -7bfaaf1c3f6cfb3cd6ebf94aaaeeab19 -384cba065ba0bd57ae862c3288fcbcba -d72021d07a222d699ae2345de41cf7e2 -c1a3b889c21c19cf94e40928deba6f08 -bd51080f0518510a2ff4819a60029b1b -4acda9b26cbc697a6817cc64e254e10b -945622657924660c72b73a27d5f63e1b -4a7fbaa242a59298e87bb07fa6d168df -89baa9f6ab06c02e7939a4eca7c2b9b9 -a8ce7e2c7f0c51d8cd52972cfd2afa2d -9c377d1fc734ab4b3692e6049ea498d9 -564a09b37cebf4b1806481b2cfe4ea3e -b526f428e8855806068da83cf63265cb -f71ca4688b411be6f52e48161d179025 -eb9bdf965678a08dcbf378ad2e5daa4b -d934252bd228548693aedbf8169f7ff7 -5bbc25117d805eb14b98b96743a91c3a -7a90e0bb0618c3ae3dea1978c403bd84 -1deedd61a314c31b6567833c89d052ae -21d06f61277c86ed48e6e8f4e49ee3b5 -994719b22ca2628db29cbef70e13c4e3 -198341911abe0c15937eee94088bdb86 -afea44b4611b127391c2765e67bb888f -a139de011e1380dc9a4413f1e0f2fad5 -daa3a460cde0c3e4473b68ff14dd5a75 -b51ffcd2c91d8ed96df607002becd1e3 -b3e45580bd7dbeed7191060313256642 -14a2e420e7492217fd0a86991d52528a -f9310a1c87b2453c24c0c8eb0d525277 -f8f54d966d531f28a305047fe818036a -e11daaa41501227ae40484f4854f32bd -8c9ac43196d509da6187f66bf9683bf4 -e128b974dced4b7a258e148f1533be4f -5c0b1e4aab4fe83bb5330e6f632b1ea0 -b0c2cc96f55278e5a21991575ce8024e -5f9a0a067a1b83b665598ecccf5a7b63 -fb24e12af22a6e0c5492056d6869f22c -05ac3a78463aeb98058b9a10fa9a55fb -008e75649675852a7ab2bd3e8418b215 -9586da17ac1f90d08d20b04d17b49f97 -cfae719624412d6aed6930f865f3c639 -d7664d91439f8c6a2a214320a863e130 -1d017bfd1e71478f184a62b9694a684c -1fba419b5fb66ee748bc47c5c94d1605 -5a12a23a67e5681ccbc279a9f6fbae15 -cb1cd97b07c77e0835240f7e63012247 -e6ef40bd74c37ab1e302a156adb03a35 -cb55b769623d604a50ffab79b3d4d502 -eb6c20862e0fd101f3b158c5591008dc -8bb10f34c327adfe6d2aaa2a077edf5e -fe20f28c0334943984c87baa623b1c50 -2dad3c71219a4201fab5e505272019d3 -aa9b93b7270a1a73b4ce3754b7bccf73 -359c3d1d5b8ac6537a36ee5a83ded4d0 - - -08a21603a4c8b0fbae33477838b82b00 - - -8515eb9ce71bacc468ecdbb2dc766578 - - -c1efaf570aa80e11b02bafff0b51c16c - - -51bab5f9665d36447329a8d7bf2f704e -8adb620acea122426191ffa879be2438 -fc2ec595b049b11e847426aa304ddc6d -de115279927e56ef815339cb99f9292d -be3698bf6b260b81ad7240c97b4c9cd2 -874aa73f22f608126d7a7daa7daed272 -236a7b4215aca10bc6be201f98ff3c52 -2603b84d027eb3201c80708c55d98d13 -59e2ddf05ce1238f5728934ec71d9f39 -e200ede1b9fff1f440393e77bf9e4e54 -26433836c9dbbd151abe4127257f295a -657fef17266d26b9679388339e014046 -deb7252f24c6e276c8d13ce4c1fbc274 -cdedcd32f0a754d4380d6357c10638ac -7b8cee0bd7e729f54636d0dc48461efc -69fc7b288867415dca33e4715a5adfe7 -916e03582ddfffe4ae5fe61ed431e980 -14bc1051609c9908935ec63e13972ce0 -ee5c87f15da9bac553f91dab15ebb04f -1e8e0e7ad08b71bbc48db286f3886736 -1aeee31eff564011fc6673c33e6a9f26 -6ffc7e1ab00dd8f065533835571b9204 -b3026695d2a8b011ce6d8361d3352ffe -9f280a0ef12999a092b8fead18bbf2c8 -0a0b0631d374810a566f573a4c6ef37b -11ac09b3175c0f8c4624f7df4b1b1610 -0e2386bbef9aba32802ac8238a13bdf9 -5761622a2bc204edec20925d46c7e742 -c06f1639ee703e071ef61bdbb9edcd47 -8096ff02b1136d9b70f3122341aafb61 -a688766970c6db6b1174b6323d38f9bb -3f4a0b5d4e4d8822bfed5f719add6dea -8c7a4bb7e9d17c712d10f4138da654a2 -c68e25a630bab4d2c2fd75ddef45ed63 -2eba45864ce36777660fc9c55e81f313 -e7f647e0f4c1ddfebc5d1b1b658e51ad -d07ce5609796ed3bc9bc7d8c2d72b9b4 -8d6314b0b5e183d1e6a60e9abc4d845e -7e97d995c0bc1eeaa6227f89d5cfc8d1 -4b89e81a200cc23ff2cd386504a907a9 -ca2bf6af4d525857ce2d6be3da3de793 -b1be257fc722e3e3596c0f317b63f15b -330876559f315db3896c19fdeb8db7f1 -520fb861891fab9c9aeb827d4cd9ba91 -0d7b688e37f7c9b66889b28c3036ed7a -a1e884c44c8af17e0033bfbf52a3c265 -120a01765437f41df6541f8c4f9c825d -453bd3f4f91a2f2f8dc61aeeb4b314ed -f3cd22ad24a4b750c26b731c0967f8c3 -4db19fbc3e739f179cf2a814140cb0ea -29f6507d7963489bd1684d9593be1e77 -00d4313b95251a7965c14eacfe769609 -99b0c2fe3c7073747f8a3cae31dd75bd -9f7a17952bfaa8b14217ac459e56b646 -de8fdcf97c9176b0e6e2c693715b3d36 -1658cdddbddd82cccff688ee77ecaf26 -4bec359ec721b127e605b42ceff25de3 -bfcd460941562acd26e4b19c3a939412 -2e6ce4c96a92a2ed648368466e9b5bad -adb01d6c3aba25bdb17a9dc4d93d088b -ca894957777341db0a46ad65f0b17899 -6fcaaedaae5ca0bb2c33a0cb75195498 -85fc3d042805f52560599736ce53229d -845216f4e3e20a728963213df76fbec6 -1ff4b830345bc173512425d495499dfa - - -5ff2733687ed023674151563277f9606 - - -b61cb3c36c0363df2b0ebf91a8b814a0 - - - - -d6540fb9a5fd8f71cceb9d70d1c02725 -62aed7c6fc9afdcf4f48f6c28be286b1 - - -330586373bb6e563f84cb097a13608ba - - -09559453b8c02af20aac399b753968d6 - - -e76d8bec66c15432a6b952304c074bb2 -277d433baac7350184bd1d27775eeb24 -1b0cb4219e01fc2496d44fbac2e278c7 -91258c9b718d472e07d903906ee3b1f5 - - -1b82e756cead981f5cdc488918e11fa1 -22925cbc2dff31926cd9465a2981f8f3 -f2999d6a0d2a72f23ba2a011b0846a51 - - -d6a0c9838da7670e7e0e743749adf31e -9e066557cf677056fb9e51d6a8318b1e -6949d9e4ff130f69e1e9dce9c7bc5f64 -928d3512a0c9d91b855ea5481abd507f -851d2b6d36a195c9d2da8810880c3a82 -08cf5c523fd24adecf802dca245e233f -8ae64e6251b4a32ef73969486c6bc677 -be417aaadad9434b5e779d589dfb83d2 -15ca0e1c397ecb962a119f83b0e0d77f -4effc64ea261d49cb41ef4eea26c009a -ef4bc9523da3115da39359c6f8a63e10 -e89f87e3fe4be3c381427546c046f2e2 -9c6a59f403e1912a41fa839067582b5b -6081d09eaba74eabe94d543b16f41a1d -07e0d0321008a117336147347ea5dfed -b33774833944d2a851d7b6e423109647 -19404b76a93672eefa7c381cbd687a1b -0fc4802635927cae7f21af301cce1f77 -5b1c345ae0af8a8b746531f4481a8e34 -f38372dd7ec12c6371bfc69a9f3441bf -ccf3ef03ed707f213f3ff9134cf0d312 -0a07296598fce745fb340b4f226e0362 -ad870aab20024333f5f00dafb69035e9 -0924932b2c03a76ac238c31e55644cbf -e9ea3271dd2ab50e653772d4175c2fb1 -faa918ba3cbf5c46dde471bf3ff2a8aa -63edb5dfe58fe647b48fb10076b80cd3 -fd4ca56fa36bc5b6eb5dd7027e564994 -17ebed1965f283a0e355a911e67cdd42 -d783e773a5632ec96cf785b34c790224 -a30e49c6818076ad738baf78e91da858 -e296aa6685367e788d30a2837597d450 -e7d5b939c4d10f2fa257cbeb76a5fb0f -9337c147a195beb432386401d6bfe2f0 -426d8c4e93926b42afdf63888639786b -fbea47a45ccf651d66b9773af098dd96 -7f4bcf9651de4dfe4d8bc7396fd3ced6 -a28d1de5cbbd5c1feafd57333316bad6 -aee2edefb32ae7de72e8bc2e3a835f05 -c3d392446f6ba7187b33bb74a79adf3a -7f278921f0a176026439244bc1e17f99 -133f1492dcedd08ffcd818e991172213 -bbe779c69c7c34db6137c6615d59c714 -b4e13aaa01146c08f44e6fbce5b655d5 -4a6e5690adc1eb3c04cb5a83e1213a0f -7354ea435851364c370985d7d24d4497 -f492346b0c82d7f7963b0ed24c452144 -c2a132b937c15f5568baed293770487a -54bec3f653978661367752c9e628d22e -9ed5fb2c7a78a2b99198bc9ea8ff36fb -fe73f93158162bb96eeb52086e15eef9 -5672b4a1646cd83c8caf4ffeafcac103 -e07c074f8deba3734bd30033b8a4e80a -7971ee68c1f857464a8ad7dac20985d4 -ca699b3cf1848166fa4a572ae1dcb392 -edbed6795ec27dc155a46ae5f959ee9c -3a5a60ab0e5491fcce784f387d083302 -1105672b1e2eb65c7548c15007eb4304 -875e429bf3e3dfc2f53e81d60e6c41ce -1fca6974e13ca098896e13990a5b2702 -665aad81deacfc0a1b9c6f89ad0585ea -236c8471ed1afffaa68f6c57a5976a28 -8d810500e27b8e755b654caa4df91702 -55499dfa3ca8c63dac57c659336eccb1 -ffa8b499248bd19862899b718ee06032 - - -7916791c506e6d9ba5c997b4b139500a - - -a1d6a4f36840ae414110a5c38d8918da - - -7e342b5d0366633fcf187ceb12ae71bc - - -977d3ef3a316bfe396a1e3361b17b202 -7f761836020b1a3da1846ebeaa8cadb9 -7208e52ce0a5f9c2d809dc08f5fc34cd - - -7a44b6dbb7459c2a40c93785aff44723 -a9a36f52f0294c0c81a33334e0d7e6a0 -69cdff16107d3aca2e48b6b1f9542e93 -7eda495a66d481a45fe354e591859bc2 -36ed2ed2060ed1dafe1c557ee86332a4 -ef0f206b527ff64cd44d20791dc7dada -e005ccaad2996a29de087e640a514449 -72b633cedb07eab057d7831a241546c6 - - -bbc7dac898f2d9150881320d5cb831d0 -cef52f5c9ea95158c9288a038807d63a -d193838abbf2439321c6b7cbc8a20e18 -a56c3abfaf35aa9e194b0f90c66c819e -5e2d7588d784973178c28860287eb756 -457a102391650783431db06dd69b3e26 -417757a90bd6b861b7e867abfee4d36e -b82f5612164a6434f2dc79bfbd24cf5b -bc7c7d9647d26359534f1c6c5c553e8d -60879d6a0e051f089310fbc08c714bd8 -7b021f7b0093f5f5bc0222d17a391da5 -25b1f2c3c7cf8c31f6e9045694cea8ce -a60f3f2c9b72e6a8b0a98733d9230785 -3536e5f1813e79e99d60ac152b758f29 -662dca4734552a24c556c3dd65997f55 - - -84979903dccf511bf370510835e88b43 -3e4b7393748ac9d418b3e8d1fa1ed709 -f0880025694ed8d793355719c284b378 -8988f4c78983609cb8715966f66f3982 -117aaa05e6044dd393d9c3b781cce590 -b70e2b3d059d767893e8abd38648d785 -5950b9e6e85d75c874ae0407cd1ac71d -f7b68824d78c6bf899539449869a8799 -ac56c8281862cc3a9d38f2e76651962b - - -284c50448c5b454c99587b74c1a3818c -468e7de9853cdb5570523d7e687e652a - - -0502867e190b3236948d109e02a2732a -86d165dbcee84f04d67ce982889c1e62 -44dce2769e4695722d904efbaa8af1e9 -67556d8f154b04b52cb4ba3f4d057fc7 -f5a54471eff0ba5a3ae4413dac555dd3 -097b08708208ae1e5b0976fa576e21ba -eda4e25a66473cfb39968d9774738e53 -1537329ac08c21bc452e988e95f7b634 -a02f58f073844edb2e61f267257f5368 -3874242716897a2f720ddae33efeb3ff -e5871705c64601f450e48e17a3c97573 -2fcf9c4e9315ef74d8ac8acbad712f8b -50e62e2fbc605e2196d1a0d446900463 -ef1d7d9d4e23153d2bd0bff65f55f384 -5ea568e43554ec1102b2c6117325bb23 -ef1ea0ea7176bb66528d1f75ba419454 -9acb463e4bde04a0f17f1d483bf209eb -e22fb66f332dbd77ab3bbae0eceec1d5 -0849eb9a2b28a2f6167c1dd33f480241 -60eb6c60d5307f0089e5924618a2fbdd -a3cd90cd2b7bb909ee13a42041ce4893 - - -79e767b62fc79d117ca3c5dc2688c077 -33a20a15ff624caf095a70d941844501 - - -1248dd3c3036921f8dfc9a029acea033 -9307f277c8eca3d6aadb747e0488590f -edf0938b11cc3848f8084b68a31355f9 -e55c1d03dec8ed13c5d3dc07b475a6f6 -03aa90b73362c9ea7992ddebe0c05a76 - - -669da5a688185e4b472e7c0d8166d149 -53f705a8191c09c9a14ba304d1ab46ac -5eeefef845922b742f3c8948728d93d2 -1736b2041754ba66b0f078d8e1abaff2 - - -b2b0dd629761bfc7fd5b8d2d3ed167f7 -829b1540f684e2828f877e3e4d551734 -432ce2e547c5e3f33850a064c373ffec -5d74f87d9094023a958641957469a45a - - -1559f68beb136775818d5ea6002cb2fa - - -877fc4512a836590d97afd52a061a8b9 -8bbcfb26c88be66b335615ace22a13b8 -9ba3289e9a9cbcb00ad24cf05ee61052 -3b0b4802fad7a92aeba2b1e308afed38 -feb97272d66c597cd9edac65acdaaba4 -f03fa5a7df87681274d6d7bd6d450ced -fad40b8184678de95bb0ba0b81fec208 -d0027d668c71a7ad863ee8acce1f91b7 -e66e9eb7cbfabb44ab0ad0907e78bbcb -9db06a7d00754a56a880b0b2840c7206 -d6045b65dbb2ba38a4f113f9aacde587 -aff6db8ba30ebddec54e3fb9e4135758 -0bfbf3d7aca8183b21df3d3e89a5fe8e -da32c073db3a1981a3ee939f99b49285 -f85c610b97db0d0c6d9a4a080f4fe72b -5358770d6c46d49d3e8bd54f426e6699 -181cd7e0c4e3aee620bb6b1419143c4a - - -1666e8c4705830acd13ee691a4741d55 -aad095174c7048e4a69870115ad6b31c -a9534f82f0bdee1b54ec994cd1983701 -5e1923144f861d00820902f847f2eb85 -4cf6cd7a6e0d99a58e3b1745aeb27199 -76f78ddf57c04618eeaf91bececf5070 -319963e6815ba4311bf548ca102ee6f5 -10335c5cbc53b01da174fb889eb182f7 -a11dff5fe4e86ecc62be49088ffea855 -91e614515ba574d4070c122565883a73 -c45eaec9eb14a27da49011c02adf3a51 -a9e4f979c124b66bcef17fe804848dee -7226d89117fc5ac6857b99c8be92bcc8 -db7179a1e24cbacb8e38d9aa20649e91 -c5ca42e5b9a303dd6af35b105346e4af -74ed6ef670b00441f37e64c157720ff8 -a7d644a48b076360087a7a79ef16eb15 -cceafae6cc15d9f207d1343abb1ff87a -03ab5f4dee17c243959ab547318f253b -01255ebdaee025b76aba812ac120a8ac -db06b5525d74d001f4d5f0cc6b34a12d -50997d9fb65b02489760c78eae407edc -3b4fa04dc11a6e53545ef0477ac5183a -c0cf1619503636f2e510a4ad4b5ddfe8 -49be3f76782716d636811a5ec6ca04b1 -c9a17a1c85b85d5d306f529c8a3adf46 -e871685a98946ca4c8b69a788445f1ce -0672e3b38e39e2da6b12396046b2937c -8a8b1be3faf887f79648add1f27e1b27 -6cd7b0f700ef9c8a4f198075bad202cd -1aa7a4d31b327012f0d82767b1d3c2eb -a71bbb5349e4cf1e586f57a3d561bb69 -69703c2680a20175e0f6ff614ac78058 -c2e66f879f8c7063b30ca7e69f31f1b0 -6aab61a89be474d3834ace048aee8215 -29a83e90e646d322fc5927f85d4852f4 -5b94dbe7748b69a93e0773d961faf144 -16845ff77ddf90cc0ecdb71b56af8ee8 -5b9638d72c2e3da6f9f2f3065f0bb838 -7d75e3b46ecc1a8e9127999c2b395343 -234f6edca3b318e354044327427104c5 -519bf115c5c9e778efca8d4c102d5047 -75e036f626780dbeb1dad742acf50799 -d70d0fc33efbe51901ad0d0ea441d086 -91c5d82c8305a0e3e21d16b1eb375660 -8f34c8654f8e475af529e3bb7459f54e -0016a818ba0e5e80338f772d496b029e -a34ab3d3db924dd1d886b28355b7175e -a733db7d8ef9106107b0810d2d0bdba9 -e6db5f2f060d5f9043679494dac018b2 -22643a84c533ce44120c10fb36eab40e -0bdc181700120677a20a475a986713c5 -a11dff5fe4e86ecc62be49088ffea855 -db3c9c925a27a7b21639195b99f8e4a7 -e80d05e8f07bc7a9c28bad9218fc3065 -c0e04a4fddc99fd59f7597b5596ce974 -339da1ab31dc9cccbcf13e19787f32cb -91f86050486e00b05570c05a19fc19ae -884910e45e2af8b06310473028b89efc -339da1ab31dc9cccbcf13e19787f32cb -cefe770c34e74c464ecfc1d631e1ca7d -5f346f8ec0669638b98d39313d395af1 -7ec2d1bc85219648e666a51798ee852b -68b62695aa7282666496e8e717d50d9c -74f64a752fe2e6ae40410c0cc8c6409f -87414ee7df77d4c9d1fe67d5f1cedb57 -212ec409cb0cf752f27376cc5cafaf9f -b66742d49c03112fdddc0f124674eda9 -89da62f432454d38e9d390c6755045de -86b708daa84d59d331682bee9892e85f -2c93bd8b0859a6063fc46e9936349be4 -4fc646f85aedd3f6f2875a164839e864 -7b32bb71dbde86104e8a2651a0f678fd -3fd7cce0383f0a53942f944e744bfb2b -56c557bdd702896e8e076c3081e473b2 -b62825ff9f9334fd7f805a5a4fe8d5cb -1f30aa3f9407a10e4f703b1af6b16f85 -248aa4981a7cde501e58f84acb3877cc -e0b821fb1bd51698f9605a5f10c412ae -e80d05e8f07bc7a9c28bad9218fc3065 -1241ba263a9be7c581f875fb4d1fa7c5 -1fb4d036eff2822c256cb5fa0d23d220 -019d661924ad0e08fba33d4640062948 -db621a89d6126c8926c2674d68701e4c - - -5d71f443ff4a119b970d1446eb9e4331 - - - - -1806438ba173c08d6608d66abcce16ec -86414fd484ecf3d234ed74d44a654a12 - - -cb682e94976a833702918c30350cdf92 - - -df3e567d6f16d040326c7a0ea29a4f41 - - - - -6318d2b6f7fc79b4ed0404ffbc2dac1e - - -70dd831c761a20467a6ba9e5ae736f91 -778f8940843f53dc769d8058c68ab83f - - -10c1c4d475f9050f55a4f30d321f68c8 -3bfda8ed81210d7473e60dfd1c5fb2b9 -5da336a24e940842244ba5365f8f391a -f3f0b68b3af528ca89254103743c048e -3d403bb930953d625b0a771484cc85e9 -a8642b488c4247b15aa815bd0fb20c3b -82f4dcbc8b788985f547dccef636c95e -71a6cf09e9f6d0f95ada2ec5d99b3865 -640883a64b98eca9219958f0c9a3c777 -166b5085bfb3eaa3d73326a8829a34b3 -e24a05f22bf8f9d91fb17899c3ac56fd -0813f938cc098ddc751cbef6bdecf7cd -030c9387085c667ce9014f8f17dc0908 -11510868ce8e8ed585a6ad563ee22a9d -a1fef4cefd9e43603349f8e4d9775029 -e38d30e0053468a2789af17d38f9c444 -a6472d528369b797a46bfb37d6ed972c -1415a98b14e5cb9afe748c674bae25af -ae7676fbfbf82586f79479b56756cce1 -1805943c3c41a0aece435f873cb86703 -a19b5c291ea2495e2432a27a54353606 -14eaed2d73022fca3bebfae0052b0c6b -c4b9c95d9f742081196beb6e72ded20f -b1f0a29724f70701011af095dccf9da6 -58d03455e940b51010a2a56a8cb04ef8 -a0bc93f53f35404900f567504449f73f -0c7f9b9d0824505bd03fa82b4cc753a3 -9683369b3890d4830e9e0ba0e65743f3 -95cffdc2b1e72e9b8baae9e00aff08ec -fbcb93b073c2737f2238a68e0e8d173f -457178c3e1e5a10eeab9f0f920df8926 -93e6fff7bffc55153d9c2859ac28e48b -6d10783b288fe54b3e50f828992d0745 -4ab54cbceb647be525aab443e86249a2 -e9421d09d8e14616be9571c92125933c -166b5085bfb3eaa3d73326a8829a34b3 -1b3f37880568ec36e07297ddc71e2baa -746058795a92d2278489bdac1c9eb850 -6d10783b288fe54b3e50f828992d0745 -a23c0a40efc09de6a7640b5d0d9f4bb7 -94ac3c915312d3e4445343bc99be0c54 -68b71eb39de968b214aee59c7aee63f2 -25b67ef8c30f1bd5520742c943025538 -bd17ba6ddc0c45fa6b7b7dd3704a88d7 - - - - -17093167095a9ea2f4d7015fcf1c039b - - - - -59caae8ab95b2eeba9444ba219446c75 - - - - -a39f2e668c624cb0b7298c633486caec - - -c724101436b085bf318e695fd784d658 - - - - -7674233880679083e8ff7a23695679d4 -2cdcde2cc55e76e3bbf24d02cf0d5edb -3627aa8209fbb1c672443bc6bdce8923 -b7a2f3050293050b58a79bca2cd9833e -b2b5a3ec23189f079c587821b665d271 -87d3ebf2feaa2b176b4eebbac3c088c4 -4869bcd4fb1502311f94519cda884950 -800020de3c5e41aa2e1887c2fca17095 - - -77404b5590596de508a542979f3cda84 - - - - -96e717a4a3dc49d675258c5f28825006 - - -befacdcc4c5bf6a333b8c82fbebe282c - - -278509efbcd2e9f657549d42026b8bf5 - - - - -16af6f6d04e4cd2180690cfcab4a7f9d - - -af5ab9d4a4d612302de8ec9585c2490a - - -e9ac9384237d8d1cdaab68d31a22005d - - - - -a6191ed337fb956171397255b5b256e2 - - -b220fae58b4e0a9995b87a5d5a629c54 - - -2cab0bd74fdd7b997aba318b7c90eed5 -272ead8eec497be617cc3d390c427477 -b340ddf06546f0c481260cf31af607f0 -fd9e4859f8b774b936461669096cdf31 -ce2c91ad6dfd86639dbd6fad1fbef509 -31f3882cc425568f4276987a0aba2b0d - - -2e0423b24a7ed080aaaab4e1f6976ab6 - - -af95de23736bb1eafad749b899ac4d40 - - - - -02087b98d2508beeff533581d41c148d -502ec066ce17658bc228175aa6d2bb51 - - -fc667c4366fe133c30ab122fe2ee7f20 -b8650f06582ac88ece68948bac1bf734 -8a4d45166ebeef73e222270a8113d66f - - -ea413228af8c99c7afe67a10acb0ae39 - - -8ed32273f32368492ee999ecd0aabe32 - - -8c10865beddd7b64913db21f12059c64 - - -4fd58f34401bd65ac6e428a695289076 - - -6105439c866957299f095b3d7846bc23 - - -952e216a7803312fa67ee61c06f3c532 - - - - -2da765d2b1a8e8992a48a676b956db7c - - -fe4e06252d5ce74ffc29c7f7f5478e77 -82b2d5fec7e2ddff86d3c5317793ce5d -80559b296b0e6a9d5bf8c874f87926d7 -38022cf76ca5323acb76f40157455a33 -d8f1f839d819e5a5422e19c9d846a26f -20706e57cf4f66b384e1c97f4d979ec8 -3b0a4f3b0163c594c2edf81e74c5376b -d223d3a210dae0c8c4450d2d767bc0f8 -953b41e51544b16e28af08c8036ec664 -4504e1996db85389682d7494173f52b4 -b76dfbee5e2d20e8f8dfe1acca2eb3ef -fe101b83892261f6d154031e760dc8b0 -311ae2c1c1e88e46f811fbdb1aa0959a -c0f621725c1a854f5883923c10774c78 -d9fc51a5f9cbee44a00ac11d054be3d3 -32b424542cabc58cd1b48d03faedd6f0 -6657d900bfc5bc7e17b7d3e59f0bf5f0 -24bf5072037fc1aecef2e359d25a57a9 -80d1206a9520fc1d5c0514bb5a5f96fe -4b458e4a1c672b1b46f0527067f5591b -9ad8c1b6a3a1090ef1e9ca2cc4011dc0 -d3302c5817c5e14efadaf79f8e60289d -d0e3fb63def4c4ab3adb6106526084ee -7f73d5e04aab56c6a59cb8ca9b49b3dd -f6cf516b7a668b636bce3c5d02f4761b -a2429a31fdd47c1041ce0251c2134293 -b58fca4a93a1198c875274945f654449 -c5893d068b103ca774c452f53231f2d1 -c779d67662315aae394469c636e9a503 -8d7e4124317ef382bf6d0a287be4c46b -d2a8d93b1fce8d3f7d94c48f5b09a8b1 -0db27eb29d36875409041464d20c7ebb -7acea37f626cfe23c2ffaaa2238b9199 -9e11c7384ac4b7e6123e18c918719a2d -973f3cbbd4b28320f06640b6f6863f6f -3fd47d203a4b3cc1b81dfee881147e25 -1dbd2d84c6c8de8fbb57cd9bdc36c6a7 -9c3dee5474541512a47b8f597fe8ced5 -7249a77c5170e115f8cf2708e549183d -7aff809832eb6487d3c2032d3e42ca84 -f1c004946d7ce517f2404c1503ee9743 -ea8f05f3e2dc69ff98dc16cd23b3a88e -5b06bd221c347124078cb9f718c9833b -191fcb39e7ebd469b742960329e960f2 -83bcea63258aa7e2ba9b84c363e1dcab -927571178a7bc2392ddf51ed9c7671fc -73b48a65098d2479d6d17599d2325eb1 -ddd8c57cac45d04eccbaa0fcf34bb16c -96a11168844b45dd2fca97f0bc837143 -4776bad83eddbd7ca0b0bf9ab1268a4a -1628c9d5dd6258b71e6b29f1828ec052 -19179da170c46f684b02f761b92d1105 -90266c6f598dbc6cf93a656778f8b187 -a35562e7cdd0b804bd17ada24f7ce67a -830de31b0ab7362c161f3bb33321dbd0 -f62d66d8f69ade8f9ce8813ef1478415 - - -fe6176c431b43e26a961ab3920734dbf - - -449b52d23d51c23ed29877609090963b - - -5fa3923b76e77bd28b072bf20bb0acf2 - - -5a24be2dbcae65e78db23bf732ae39fd -6c65bfeac7e5b5b28af498f2d757f3f0 -2f0f661518f1dbda9eedda2b6bee734e -060e9e0bb5a4e5dc1fe0d2fb20b2c801 -b4f2152a14d790847565aa176161acab -2c56066f59944c0167a8e4321f193913 -4f196e19ed8ad0fdd14cb73c93fee1ab -dde71309b78bdb3b366654446adea123 -05e8b4037cfbb469f9ddc37e8fc9e970 -198d39094c81152155f8f35108845bbe -5468e59e8840a0a6799d6db5d36733dc - - - - -1761c41741b70f05925340d5506387e9 - - -bfa0bba21e124aa73b63eae9b9a6c47f - - -3dae2c76a373126a1e0f557be13388e7 -b96a4e2d85b9f8c0b9eedc62d7c4eebe -7e6e4fe81e0ec0764125e763e637c8dc -473ca9e5542894f994dede38e28066b0 -8e807cf3b227b692047cefa6853a6d94 -7a9603c07c7c3e954696f19521a15d73 -819fa45bca5f27217ba7548bd5a7f845 -0ffe86a454e9a2e570b96610e0a3555f -ff5ee012df7e6eb1b184496b487b502a -d5dff411425653893b2da14d14eec340 -4969a155bd70211e993a76f4215b09d8 -5f826dc572e1c8dcd3c558d780ec0063 -a22482d39c2459c642da4302f3a8e1b0 -e12203a069336f9295ba7dc2799db8e0 -3e013fd6dc388618a30da7a3f1b5a8ed -7df68de6ef4b2321ad1fbd2b99a17a40 -a3db8a782df812506b9d6cad27f8e954 -d89a7e86895762a2607e598caedc34db -7786d1011b89d457e8e6b93e84cd82cc -763755c2a64da8d115345fe9efdc29e3 -0865eb4eba2e849d7a0695907ab9cef9 -c034d80005cbbe505d978c18200358d5 -fc565819ba9a958ea560b84032c25423 -dae7a05de8492aabf5292e1627843166 -6602994ed72d4352ecbb2c9850146b09 -4351922fd2f520fda06d12a2b2289b3b -daaf526c37518f8f8ab2f3e94ad484ea -920f3546842878108f3e2b6ee8ce5257 -214546da09bc6e0308a2ad20b6b3044f -2b84890e6b3235715348b30628a7d988 -a34665a76b93875acb85a2aa370f3607 -cac02cb00571d77e1e4c5b43d255304d -0a9ebc5aee36ab0a70d52a64cbc6a8d0 -b46ae112d32a7bf573e91e1a5317b1ae -0034ffb7a27471f3eb757631582f87b8 -6e549c4c7afb8a58163c09b4cb05b9a1 -cd35055300e57f0671b50fc9c387efd8 -014d8d796b91bbcd60b3eedbc75863c6 -a2edf8c5e77fa7790cedb28ea673adfe -7535a09b90cebdabf4dfb79035e945c2 -c91d55c71290f701def881a2ac4c187f -1f0a736e423e47f3d8227b20a1af8a86 -b745e148ae7a29be55d3b468c02358d5 -028b01567cdbe95028d6badc35611592 -4f2197b4ce860bf58a77fa2b3d13cac3 -0ba05d36d4770ee2b157a429247fdadb - - -c1f4b71c61e227690c2a91f5e22ee912 - - -5f3011c091088583798c8bf0ed4adbff - - -80cf4a974ffe1a69b6d6b85abb391d6f -66be5c2031ea52e84d32950433ab9e1e - - -bcac19ab85f8691089309825eebd0a63 - - -5ff2733687ed023674151563277f9606 - - -b61cb3c36c0363df2b0ebf91a8b814a0 - - - - -271a12927f090ebc5287e8b0b5e9d9e6 -fa289af1974267e9531614663efea272 - - -79e767b62fc79d117ca3c5dc2688c077 -4c09ead3612beefe457740591551f103 - - -ad61a40e5452254cc2c0984b68f3100c -7fe43f107fd4873f0b7a4750888b0e7d -16af6f6d04e4cd2180690cfcab4a7f9d - - -669da5a688185e4b472e7c0d8166d149 -53f705a8191c09c9a14ba304d1ab46ac -5eeefef845922b742f3c8948728d93d2 -1736b2041754ba66b0f078d8e1abaff2 - - -b2b0dd629761bfc7fd5b8d2d3ed167f7 -829b1540f684e2828f877e3e4d551734 -432ce2e547c5e3f33850a064c373ffec -5d74f87d9094023a958641957469a45a - - -1559f68beb136775818d5ea6002cb2fa - - -f0c7e782bd7bba13c9662714c7b8b08f -5c8369ba5b6db0212bd4430bf2dfcfd7 -6ddc99ed13c9297a09bd1dbebc2685b8 -bd499cdcff25d83aefa453d16327fb31 -4be815e975625b73ee6e925d97b9d1cf -618e818af8dea17de322d782157dce72 -a05ff7085b07193b2c2e8222b4a049b5 -9a756c5551ae9339d6e1d852c17174be -78f064f5f4b32c4a2cbae653f6946f8a -538514e549d114f3d68b1d54200857a2 -3ce8b7b6c087edc1b162861dcf29ee60 -1e0c1dc858a4dc5d57c6f5dc4beff437 -bfa0bba21e124aa73b63eae9b9a6c47f - - -1806438ba173c08d6608d66abcce16ec -05a2e51b59ec243e96c710c5a05462f6 - - -d41d8cd98f00b204e9800998ecf8427e - - -b1602ec5e9ab160fbdcfe3a4f4e4bb4c -c7fcdbfdc4bde8825a57450051950df8 -fa2bddaa89b6129d309a100838daaf79 -5b2c3dbd4abbc7eff715977d4442c50f -fe47afcbdeb30fe417b7354de23997ea -d7c38727c22bb427515f94092c323d51 -c3ccf7492299ddea74c15ff331ea0f9a - - -8a4740b64e36fae06dd6317922c94629 -3a316818411b5a80ef878dc5c8483950 -38886cd44c85297638cb669771be9efe -0b6ecf17e30037994d3ffee51b525914 - - -e9df9178a05deb95474788697500028c -65e2f06da6de8b5a9bdc7a9fc8b01458 - - -2a44fbdb7360c60122bcf6dcef0387d8 -2b99a5e48d3c3957d03027d36a25e8bb -527d96cb51eaa54fa74a90db078008c4 -3c9852ae1a4d25e9cbdadb68bb0e1f1a -afc0b83bada23f6dbec51c8e28029efd -3964ec1cd6fcbc20fbc2ed63d320caf6 -3e450c2a2c66328d9498e7001ad7197c -7ebb3ccb0f2a3defbe84b59a1c07fd45 -50200576c149315cf45b3293e427a671 -adcf31a940ace9fb4c104672cfd2d6f9 -2b8885da50e2324557185fb0890ce2b7 -5a3be2d8fff8324d59aec3df7b0a0c83 -2b6a88b05b94c56fb478fe70dad68cdc -0dea943064353cbced50464e82de12ae -6572c4e13eaa937ff62163ee7faaf33f - - - - - - -c78db4dde38bd36c9d6c8ff0cb6502e4 -cee2d3d516d9940ddbfd859d2dbbe55b - - -8692e6efddf882acbff144c38ea7dfdf -2a44fbdb7360c60122bcf6dcef0387d8 -9c46d7cab43e22a14bad26d2d4806d80 -f4254356c2a8c9a383205ef2c4de22c4 -6e7a87edf112d7544015589f8291e752 -119dd0c2e94ad689de873ef39fd43e6e -72c593d16e998952cd8d798fee33c6f3 -3e450c2a2c66328d9498e7001ad7197c -c12c6510dad3ebfa64c8a30e959a2469 -5a3be2d8fff8324d59aec3df7b0a0c83 -ebe6b6902a408fbf9cac6379a1477525 -6e9e2694b7318954aefba787732dda44 -e5a8f32e28fd5c27bf0fed33c8a8b9b5 - - - - -c3006f32bd19f09628292ae1b3df25f4 -a714d87749fb1eddfd91141d931f483b - - -8aba3e2c8aad049e56a11eb5ee095941 -f040b255ca13e693da34ab33c7d6b554 -1c7fc3f027768438a5e12572a3ca1233 -c18cd01623c7fed23c80d53e2f5e7c78 -d26e8f463195a7b86f86b7d550cfc114 -79f41c0765e9ec18562b20b0801d748b -ef9a6ccfe3b14041928ddc708665b226 -384c3f17709ba0f809b023b6e7b10b84 -b806658954cb4d16ade8977af737f486 -342bc03f6264c75d3f1d7f99e34295b9 -ebe6b6902a408fbf9cac6379a1477525 -5f1847175ba18c41322cb9cb0581e0fb -39c5a5f53ff0e6cebaec731706427bbb -e5a8f32e28fd5c27bf0fed33c8a8b9b5 - - - - -8bc18a7b64cde9d8fd204e30a8ad7172 -599a8439ed6125670db4a61b4f93b406 -b955200005bc73bec30a42c1d1df16d9 -eac70f4024955fbba9bd6a6e94cae7db -cdfa64990c808af7009d75478134f966 - - - - -8c62e0877101b378a2fcb4e818cacf35 -f1092e3ac0dc38e9008a43981ff31799 -d8f8fbef0fe895cbdc998c2c28b513fb -b2c067e9a9585e997bd726dcf567c009 -0b0ef7ff9ff85dfd27cab71f4731cc3b -d678f496270f4b144ca5f60807a09cfb -db13d00b66e6af44559f19aadb24d4e5 -5744f9f3abeda8979635f87a1c892949 -c52fb7a817e7519fa2779d73040b1243 -3af2127003919c5777dd0a36074817a2 -581242fd17550f2bbb546b12f1829c55 -19c611ee5a7f93785a4507cd723e03eb -1331764178f082e53bd0938583ba9c9d -0c66c85cfffbbf9b5bdf3ddb943626b4 -8511d7bf1fe545d78d42cc051a342868 -4106b75e02e999e789a40098db344738 -4c5647ac00f62f00d9584c17ab7c3504 -a4407ed736d6d821d839ee517b3afc21 -5b9dd9d9eef220379a2de503d1ca6418 -d70d9eb28f1fe2f749adf494a50faa66 -fe1ea2158d814e4fc7227c8c6ccd7ab3 -edc1d4fb346156918a78fd447e3a921e -0f9612a2b219856f8fb9fb980703983e -ee9e3fee14270b7b27fcaa0e2cf2e042 -0ffba049a349094a1c160bc0beca3649 -0f2da7e8eb75ec9c688677631f81c8fb -8aa24366a73e0e02cf427f7631005447 -35da51dbfed52e2f12ba3a0a832cd1dc -fe716a15ef390f76327ea4b14661473e -c4cfe1c0db251f00e4a074d1c3556d27 -aec4b7a509e24fc101d78bcee93aa3b3 -20b789a8c2053e44309d5b83f9d2ff1d -b22d8fe6340c759f3df79e12bb972805 -5081f3ba73ec28380b8e0e2ac7e94d1a -10fbd2cd02008e6878d560ab6ff2ffd1 -a73c5af628597d1fc68576de7ff5b58d -21c94faa16f9fdc7bbccd9486d21428c -63098ee9b67be59c25279b7ad5613637 -e5b3968f64661f1893cf740191e959c5 -af877a7946403c96546bf83e9b9916d1 -bd7bb74aae07122ee6288f5f5ece6134 -59e5c87e9d8a26adc90e35532fd36d58 - - -a2058d7d2a0e947e75f659203eedbc6f - - -1f367bfbbc77e33c28beb1b3f1a5f88a -d16668a2d16b057f04eb2f93372bf631 -3c01f20e2abba61bf212d959f0b70143 -8cef2db6f12ac34456d346f4f0df3bcc -49e3f006018662f60f1db2aec0b2cca9 -c87720a8b6da87848cf717971cf8e28d -4f26ce66c3f271d8055c7416b3f4ec82 -81534c478c919097a58b0154664c1ee2 -244c2a76da3dd075f12892010b51429d -08a9454e4631ec0d88335265d8dfa2ac -cc519c456cb22964a334a6b41ad86e0b -0a2438f2726be075c1c1519f918f3215 -d0788051f22804e9f4f323d2c6a2a0f4 -907f37e8b7df4713213a505f28d6467d -7b9776076d5fceef4993b55c9383dedd -4e0326a0563bd2fc38a1b14e47fc7ded -c8dda8025928ac2a82206adb6aea2fd6 -0fe870dbba4c1e71c7bc3bd764ac6648 -2341f2c853fbbb21188c6b2c2f7064b8 -82ba001c7bcea7af62c33d716b0c9bfa -f6cb8de2bdfe9b7b87cbed25494dcd3c -a67be66f984c8e31cfad2c93fb5d0a1d -9c63e7fcef29b28590f35af932505ab1 -8ab6c24f02ec882d1a900b9151ce32ad -79b1f2c9d5d8d3ffdfa3a1b3ca3eaa85 -88d9eb0ff69518f9acd61ada0912104e -857cc080b63fbdb946570312693498f5 -32663e0333fcfb98bbcd3c2073f8aa5d -43ea1dd926d28fb13254881c45cd313f -820f48fdead90505fa70b4e47b2c652a -f7e2467d8c6614a748e8629cb60614b0 -6157b46b1a107982913ab0320c36b7a4 -fd5f09f2fb6e899777af95c277ff8c60 -65d6c6f25dc89018dc74262179cd56ad -d01a7384c6e8436fb43e0bcb2df770bf -572748bcdafddcef34ad0be34ef144f9 -cbcec86b5b111de63a9408378ceabf1f -47dbf2c225c18685e68d4fa4f11c7443 -b7fe7170df9905bdc6e4e0964d4a8639 -b8285c08b99e9db14a03e1fec65fd080 -b9d0598b4e1c295dc5466f6e55b59579 -e45762e446e2f0cb2bef724fa339b4d6 -4c8498c7c7c582df2fe30520e64d8656 -1cc5116a76477d8f0f5de2efae29cc3c -ae9696e232037d480c25f242f0dad26e -feb67f9cef255056d3c1efa088faf1f3 -0a363eb48ab32888d2ccded705697e3b -b52db318cfca6f9e1eb261af3e650ef4 -9ebf1d0182dd9eaafad691698d6b5a04 -2ca61b76e22053571dd8611e5aac4900 -1a39c6f2fbad7f8ec87a16b41f10e4f9 -fc4180203086f4db5723547477eb472f -f2be13d5e99973c73059b469fd10cb04 -bc8bf1b085afb48f0a833f55bc7a092b -b9241b8074890b9d26dba5509b664d28 -953a8f4b78d06742b24778ad0fafd7fc -785563ea1eb9f66d8be27cc41ee95f6e -6f8ce689f014d52dcf5b160816caf2ab -817762ea9da214f1f4584401ccd51374 -be7c3c0f4cf51faf0a543446b97d2c55 -30bf39efa0692914e6ddb6443425a173 -ce82206856d06c84b34b4750cf97fdf9 - - -4c4e6b894efc6381846a0764f1e70f77 -7ec9405a31291a374be5a10b11b4d146 - - -8f88d990024975797f96ce7648dacd2f -64f2d23d70cb2b2810031880f554b13c -2998e23d43af7c7857149b0e725ccad6 -9be5f327f16bcad317c8ad0ae92635d8 -d48475e6c742940f44e62622e16865b9 -72ead25432b5a84031b8333aa5fbf259 -94b34ff5224ba38210d67623bb1a1504 -574c1fdbe98e07b336aeee94514cba7f -9d29134dd5e1c2192916ef9104dd877e -6c56b94fd0540844a7118cdff565b0ae -a8c664b8219ffde978db3d8308713975 - - -92288a4ab5a9a07c392bba16ec19b3d1 - - -f1e6c13d39826544090e00e128207edb -051441eb8008be7093a760ee03f777ab - - -b0cfd2a97c10400d18ae40f3b97c2fa0 -bd968116e9ade41f7ffde91bb8f6063a - - -751419260aa954499f7abaabaa882bbe - - -3dcde5f0c575c078fac213717ad57cbc - - -b122a4394acc1a0a683cb787ad67a75f - - -8c086d220022ed8a1af377485f653ef7 - - - - -9deb8b8b4db1cf94cb88bfe20d998071 -2405ad70193cfca2d44064ec2227fb2d - - -d5be44e5e4de9222192bb2757b79c793 - - -04a1cb8a2794a605461f8211fe46738c -0953547609fedb241a4f6e86d47cc57c -e7db69e4cae5a975d12a9922bd62855c -49816c1abbb0646aa7fadaea57cc2d3e -b12a9855f2b25f5a770753ddf9546b4d -b2c9c2e53dbe4590899b644e74e21cec -0fc278d1ef776f8c1edbc7ab272fd850 -04bf5d1e88e09bb87b8d51a7411e5dab -b8b601fbe718b934ec74e2e910c28afa -cc50cef418d070dc204157ea11f44ee8 -aa2e592ba6fa4024a2e5adb63e4d2f6f -fee93c289a49bd1a98399b9bdadf4627 -4dded8247005cc26a611a713fdd31335 - - - - -2390d98f9f4d1a5dba76652050b17323 -3206540bba1bf1310c08d32ca5bb42df -4404135b901f042ef20061bc675ebad6 - - -e6179e6b20a5e08f351128a80b13568f -53d9502fe340dfd1a37d536992d24c28 - - -fbc4bf2324c8edc1c1586003479d5e5f -3f715592e948a265751a35186b46cde1 - - -4cbfd7c2fa4dbc351c5bd7ad9429ffd0 - - - - -1b5d2294dc2eacfaa647413ebfde352e -70c41dfc17c87cbad54cde7e24433348 - - -a8c67f65e8618cc76fa3e94fe2a266f5 -dab22708cace926268ce9e71eacd43b4 - - -6be0b139c13bcccd53cb26d71b9f8634 - - -ead9e5f733592ae8f9b227507de37ee6 -ed882314c841932770eab4413337b4b0 - - -7a4b4c6ebdb549fcbe47408f9457493e -3888e9f93e218814c97a146069d104f1 - - -69f1f3e08eaa1371f74e265511deeaa4 - - - - -f0b2d2ec92fbee68080605d968cf45fc -969a6640722a1ab4b936c07c99a2e6c3 -6309fb06dc9f3d55d762718d30fa5f48 -4f332fdf2de4e25eb3f5611bf7b6c354 -fa9079fe13a4db2dd6140d5d7112375f - - -efbd0fc3617ddb7d7f31ce74f2e2162e -c01d40afca257245eb8374dece73e0c0 - - -ac467ef8defc620b6b5eb80d2047bcb7 -bd2244ac282a5ada48b0d79cacc59426 -48cda2a2a54a31f7a666547c862c12e7 -c65fadae5a0fc27f401f1a00e66f518f -9a8269421303631316be4ab5e34870e1 -7363cb7630d1d4b441183345fd15ae62 -13ad2158a4889c26a851f99b261e4c5c -8c366c11adee3cf2988614df4c96782b -783f5b06082bf73e9d1eaf79d838162f -5ee15843554004d12736f0404f8d443a -2eba6780fc7d3663bc44808480c6bd8a -03e2b564224bfb58ff20904bda244043 -5ad12582e3ca901894737c3dd44a5eb2 -bf30d89d69dddfbd8e5f805a199c407f -fbd3929a893b147ae0940d48d533e023 -132a505684e7b7b91f50ea29c072112b -661505d2efc05b2347492e4949f564d5 -12ace1a918403049a6d2fc152f53baec -38af291953d5b90b0aee30dd0d2126a4 -73c25b185fb78cc690675cd4a181ee0b -0da66bdb013f9a9d12ce7219e642bc25 -d2040c34ba1ffd8fa5b72ab37be11eca -fc517da02d6a64a68e5fea9a5de472f1 -787a96924e9b114e75f48b540ff480a2 -a3112ba7e266938321394347e2a6e107 - - -90e40fe8ce59e8284a89bc54e2076deb -4effee5b896fb71cb6d9106340118b7c - - -05992d3434d3589b38a3a5431842d38f -2165b99c89c8431e7165530ccb5f89fb - - - - -a3e000456648ad121c8aadf7d918a4e7 -ed19ac112bb57caba9d0d43886216071 -f5e90c30ee80102ae8d460878f8aa080 -f8bc7ca757d08b874579797ef5925bcd -ebd0cfcbbb8e8ececa8f05617a98b324 -75e009a1fe815df846b1279590cb207f - - -0927262e8bbd59ec33eda07237e6f19a -11fe256b13a09546f7280198d8e98239 - - -2d22c61e44fc9adb7315b121f8496708 - - -bfd10864f928c910add9a134c48c003f - - -dd3692f9ad17ca6a2a49b6ad446a1eb7 - - -05d03f3611d9e86afe538b53ccf27260 - - -3c66dfba890ce9f8819b909bbaf6bec2 - - -bcc3797b5ee26595de904538fe84e289 -08a3028fda91d443f4d5e93307c96fcd -26567c0e378766f38baf34bbc73cf0dd -0266cfef4017307566e781d815ca07f4 -cbda6a0e1afde69875c104f6e809f1b1 - - -6e3293266f645e19a91e415f8418aa49 -2d3c4d442a16d6402ba14307eca0cdb8 -9d53983237bffff6a75dbdb2e883082e - - -9dd0da9a4d871790529883dc56679b75 -db5cf23edb637b47a757468a06e6a717 -54d542cddab7fd969762d0f1d37e79b1 - - -a3ffb8abd978b0464f7b5b508fcfdef0 -18b3e43abad26bdac6f4cea944777b62 -46878a9b3ede269c4e234550c9c89cd0 -9ab0e28d85d8ab5eb954fc28f6ac1e80 -feda280e7bffb057ca4c87491aab6943 -e009322a00011359f76cf7ae59b4d33d -6c46b98e0c60e6dc2ef14f9d4a6607b8 -dc335e786863262f594737e26198009c -262d69b7ca267be1994fca2aba46be32 -30d8e72bfdae694b1938658e1b087df0 -02b42894653cfd82e52aac669ad078ed -0cdd968bdb2f2852ec71e0264b3292cc -c94a07253c14c98fe69dffafb59228a5 -9c2613b4de53f939bc770983976f66cd -9f41e1454905fd7416f89aa4380a65e1 -5e3c0e0c48f48c23c45aef7b72c739c0 - - -8300eb5446df027b01ddd21e03c361b4 - - -e8c268d38f2cfa22121c876022676cb4 -11b9e8e10d8acb2cd1addb502efc7f89 -04a3ab30b80f9112937f2d586a622c55 -24f029df1781b0656c5c7c1bc666e934 -d529d0aa82ed3aa96944387904ce88d3 - - -6eb77adc1ed55d94c3c598d424843dd1 -ff683986021d3aea2c2e0824d3912882 -cd7073388fcbd89d17adc9e9b6489c40 - - -db163b6d98c20097ec791f4d7dd938fd -d88c26dca0ca8c159befb1a4f91a817c -ca51657e035c8ec7101a2ba3e4fb027c -5c5791930e0644f718c68296a62251cd -47d63ecea460265f78ab03b88d2b0b10 -9f6dd30bc97b892fbd971271d1a82ce7 -e87e86990aa254a676d19240d7707204 -fe1c7cbad0cbc0e2d90a0291658dbbcb -ab27137e3f7161c011a7b8bb89782c73 -33873ca90e5739a504ea50ed6c675eb9 - - -f505cb61cdfe745c5e4d7c74471e267e -ed3b896536e996435d8b4ec1abb17aa3 -955a446a7362ce4ee8d73acee3ef9790 - - -739b03158aa5894431ecad1c8fa1c82f -da93d8095a72b3b2acbb64290dfdc716 - - -9c9723b05901c04d7bf4d62630c4dc85 -7fec3bd0a15a6b67ebcf152c696ef3d5 -a3f6bf488479d822864c6346c895c623 - - -91355952bf808fedc051c1a96decc2ef -9bb2d1bce5ca6c1dab92e70aa744344f -e01edff939ce9d40212a595ab009357c - - -c3616907aa8a1b91b1ffcc2cebf3705e - - -ef1cf954f3d42f0812e26142a6704e0c -d41d8cd98f00b204e9800998ecf8427e - - -1b821ae194690f1401c6c0e4deaab357 -3e19546cb0b05173cba819b7f87fe580 -c413bff917e683c47b2de0392b626707 -8ca0880b98f752c0a5cc5597e4ab9f42 -27d7484b1e18d0ee4ce538644a3f04be -4a74f57aaa0c116567fba97068843900 - - -938572504fc8537a0711d8ac06270709 - - -62ba1c7207971f4f83d00d194263e7ae - - -24ec97e48bfe034f3ee795ae9ceb282f - - -33d557efbd941e679c386377e63d949b -d41d8cd98f00b204e9800998ecf8427e - - -62fc08bff6c9c08fc68bd5ddab35e443 -0ea32bda75dc7855fd061f23d129c35c -e122c4a3c7fd8e1814f52d447e2d1a87 -2e7c67c1f808b58e33a5d256c282f02f - - -a7a90ee73e8f7f25267dc0ed66b3d8aa - - -9f9e7fb20c0cfc32dd7879ea99bcb3a0 -0a81d81144952f49baecb31cfc610fee - - -43da28798d8e2b7eff42912662cd5b68 -5c09b3d75fcba736c3353468236e5338 -d41d8cd98f00b204e9800998ecf8427e -fedfac2139ca74edbddaba770b52995e - - -5fa21d6616fd146640d8cb59d52fd6d2 -b30fb8f9811c1fa4d96fb35456366a8d -58db8a40bb1bda8bff6432c4f295a426 - - -af876c926d49c59376d8b6d642ce9f66 - - -0425a56b168d7f707d31028ad6122c26 - - -af321d136a1e674037ba2c163db3d2b2 - - -c62cdc02c0cdbe78853d0f432054d985 -d41d8cd98f00b204e9800998ecf8427e - - -687073a85e866b16aa6d4d753e78f080 -b0b778a095e0e2006640d7229fbcc241 - - -46ff31a1787666ae78665dcea6351800 -453d482e2c6217d080e4ba4ac382aff7 -d41d8cd98f00b204e9800998ecf8427e - - -23a9fe711137f3cb4f06dd011d38c23b -d25255649d1fb417a7e7041ed86dc8c9 -031af7d7688f3a9a0d48d2647a99e4a3 -c82d5d5abb089b8ef750558b75e23f81 -f38b902b5ce63c83e6dc6ffe2f9cf0bb -25b3ce6e2f12f227c4a1ac8db9fab357 - - -b6f6be0343ebb230829409ba5de4565b -1228532a69cfc2e4ce917fbedb9321aa - - -8d01e83c7ea6584ed8244fe84628bd7b -d41d8cd98f00b204e9800998ecf8427e -7d845e5c3c1ac2c7b1c49de0d7e1c7e9 - - -644741d234cd1021c70506f7a86e7930 -1eee3803a8e4cc3414f475c2af2021a7 -dc68419754462144b6a61cde63251d67 -abefa8f7d035ae87eb5b45b0c43843be - - -b3d36970077a9568ad3cf810fc556313 - - -e3670650548097d9a7aaeb346f3bd5ef - - -d41d8cd98f00b204e9800998ecf8427e -0ac7cc84f48f255d71c0be34442038c1 - - -ffb22ad3767850ed93e7a462fc8616e6 -de6be0f3faeef94e762c4e1ea1def02d - - -29edd079877a1f97269ec792704ba1be - - -815cc5332012f7bddded6e6b2dbebdd9 -d41d8cd98f00b204e9800998ecf8427e -52517073ee32fd105af7fccfde018e29 - - -d41d8cd98f00b204e9800998ecf8427e -5b69636b3ce9773a65a8750f65d31ee9 - - -32df7d91f327cfdcd67d831f6e7535eb - - -d41d8cd98f00b204e9800998ecf8427e -0cde765c7d578d103c71dfc4197438c8 -3d18b6afcda65c40d3e5b1565e0ae3f1 - - -58e190fe5c72ba2cd4db99fd17aac7ac - - -9069ff50c20cb96cb418f7b75c3a905b -4776d6cefd9a868dc15fa24651c816b9 -d41d8cd98f00b204e9800998ecf8427e - - -040fcead42553050d648d53d01d642b6 -cc7d7a963ee9ef58ede0680241f53de1 -ebb2e597917e22900853dfa300de88da -40ae96657f888af71df1a7bc45d158a1 -3ba16c045e8e62e38dcc8b6c24e75b37 -4bac12077505462bd962adb666852966 -3ce4735205d14eef357f1fc90d655ece -6a692cc606a48741b08fef765bdaec4c -212fcab202e934b30e6fcc7c5128ed3d - - -d41d8cd98f00b204e9800998ecf8427e -fbccc9c80db24316963f00108777de22 - - - - -d6e07b8cab924d1b1b4e7b467aad3e67 -6a1a6da93f9c2d77d68c8edb90139899 -3285c87826c9621ebf4352cf2a3ee2a0 -3e8b72640f3dd0117bde24b366b7a8f5 -8a1c4f997f37fb274bc58c905649c0e0 -d41d8cd98f00b204e9800998ecf8427e -2211e75d50ae16f94e147f2f05a85d91 -80c65c798aad65e52c21289ba4fc8db2 - - -977109b651acad563d27a9f05efa820a - - -63a86b61d1158210eedd7055b3bfd935 -d9f10175f29b8f142255f95be2d07965 -d41d8cd98f00b204e9800998ecf8427e -648275f02e4c1be714897110a9aae56c - - -926bd78111e0f27f638bb0705f92439b -24fefe7d02c78008aca2345bc2f632c5 -37d695c0d624c79d4d5fa14dd131876e -176b79460f070f5adf9f22c1bae9e4f5 -8e16469fd236e9975f6a14a9e59c147c -de594cf4764ee6b3bf0d303096378308 -4703a36c950de669ee918e763e014fe1 - - -bbcb1e28381494e4b974e6c82013a613 -c0d5162e14b2e33a1241be5d99bfc943 -1178c5bce80f0c2cda291185b55297dc -2a452e950585fb39d94e41a414471df5 -79cd6f766e78d5e866d1797d13f4c698 -d41d8cd98f00b204e9800998ecf8427e -766a0aae54b748b5cbace9b07031030f -056197c13985d9469bb0caba11e38b39 - - -abe63d0af307817515898833a870bc29 -f0bd1599b002694c6ec351d6606921f4 - - -d41d8cd98f00b204e9800998ecf8427e -8c73a6f5b6e511bc183fcf2b5c1f8783 - - -ff4d34cf67cf4cf9d6d4211ac9b36cbf - - -e669f981e82f640ed242b796c4d8f2f1 -d41d8cd98f00b204e9800998ecf8427e - - -9828a8c09e33d2aabf40388aa3d71d56 -977792fd978561c2f641a42ff3af515b -0bf49a329273647d1ab966c8bf1852b4 -d41d8cd98f00b204e9800998ecf8427e -896db0e30e08e595ebcc6037c1f43125 - - - - -58251447f64e61a8aa57f4a820fc21ad -d41d8cd98f00b204e9800998ecf8427e - - -d64e97da94df5bcc6b9e82a379085f61 -b59142bd8cdcd219692f63fb46cd3a49 -32b9f7e276353924351253cead6eef06 -d41d8cd98f00b204e9800998ecf8427e -d3fd9ffbdbd2e8a25f32d3fa18653196 - - -d41d8cd98f00b204e9800998ecf8427e - - -84262a9209d682431c1484b6ab0be1d7 -3c7be843008e4f8c210d80e653934963 -54ece365991ca0dbf3892b5fe1d2046c -624da46dbfc287fa7894fe66761c3f22 -0d215ccf216116ad98f20c48b914bf34 - - -d41d8cd98f00b204e9800998ecf8427e -8ea20800d43bbdfdb20363355521c20c - - -d71afb404b4f1946d241bc44ab27df8b -9029f09e1592da49626e9fb5b6399e1e -823e0c612e7de62db2d41adf37214bea - - -ac2861b424e2b7e30a532f37b33d6889 -45b742c58510d055adee01e93aa33ff3 -35433c33dbc3525adc99ba89816d3733 -97bfaff0b5c453d074f05fef1fc4c3df - - -c857cbd23a138dfdef6dbcbb475ccca2 - - -7cade8e0372e270697be4c7ccfb6deb1 -7724aa95e287dd12bfcd6a4a9c0e0e72 -830365de65420fac0ff53836c6ba35a7 -ba5074adaa5d00355e3b689f8f5647cc - - - - -d217b089bf601472e50a76fa6a645b2c -b847321521498c0da0627d9de6adab94 - - -f80e903b3aef314dc7e173ba95324c56 - - -c234c6e7b71d97e977d881538fab1d5e -a0fa0788291ee95ccb306b8aded3fce3 - - -56f08275c87353995ebdd5373f678de8 - - -758456bd92e4f81e1fdff423d4f914ab -d41d8cd98f00b204e9800998ecf8427e -a90f7b32ab9202da3ea6974de66a8a5b - - -69caa949b7e0f3137c6ce7482f38e0f8 - - -d09f8b867632a7fa062c38fcbe196b7d -6d6695e08c63ce635ca3e2f6a1d6f402 -edc900f68ee6af819ace6dc30b968d80 -e5d6f1a85bcb2c54d64d10ff8c9a2e10 - - -dd1e24b1fb6cca8441671b624b5785dd - - -5813003639fb8751dc574567dbf90989 -a377699a88d8e920c8860ebb24aeacf2 -b447c8a39fa7d8217dfa5519af90e911 -4489937620fe0ce4998a18b327a79cfa -0987559b12f37ae2490c1a5f5dd83076 -5343a79284c9127377a8827395d5b204 -7d5356e01799df3255d499f215396934 -f075b322db82ca5a1082e18033cea0f6 -e047fd0ab0886550203c49269e7ad1ca -b3bf4266b0325db6ed8d9cd310cd2ef6 - - -40740d08bf47c6ed2b06c54450350450 -4c098f7e7751f35b9f534917f09f0431 -5403d220d2de9cc98862fdd5db840084 - - -7f6bef974f62fb589b0c2d193750d714 -39d49ba7c06cf79caa00531b355e754a -849d81f9f23ca9b07ea52367b4a666f5 -7b09d4f614806db46728a2fcf577f388 -1ea47e3f2a830596d139ec65f559a508 -1e47fc4e62453875065109ef46259108 -967aa7e79415181dfb2963777a90720d -105fea1b3cecab53fca1d10fde1a8823 -448ed84f8c692dae865030fdadfabb3e -6a605a7186f129ee54393898a6d9f4b0 -4319bac47de1f786312d238dfd731820 -942423fa65f36d20685e565e76434771 -4bdf86d2111c1a361549dbb6523edb65 -858f4d351d6a865bccffef7fa262d99b -1ac98104d83b70d49e94c367174bc797 -32769f39902632408013c5860b088804 -137deeadd05e585718350f7c15185431 -66a88729f0af41a466b40b1430f229f7 -2887d01ae3349dff6c04d5902a5d6e5e -e62424215546778bde995edfa9692ca0 -0c89a620fdc2487c3cf242fa34acbfd6 -69be8c3d12533054535cbebb7d7efd07 -4f7695bf300da817cbee7feffaa21508 -edcd9c936456f8945c9e05797b68a0c3 -95b144da8ce3ec2fb644f2e76af8634c -772b9a692d9998d6e7d8fd6e28ccb042 -1308090d5cc23d9ba152a9a56c2fe219 -160320f871272af75ca3826e1400239f -e549c764f41502093e349cd471306f3c -83b13b749d0fecfd2a003f191a27218f -a15a84422ae741b74da10e8a0e2edd72 - - -efb759421cf7af30d38c8ba28068d04e -6b60f598e3cb5d1c1bc8cf2f99ce9ddf -8c881ed6898d96ad95b90cfa2c50ae90 -e4d3f7fc63934f317f14dfac5ced7bbf -b5952d80732558fb9d8ec7835ac8647b -d553d9d0831894a4e9d6fa12e8baf6f9 -f40d8a85b086be3e17f1f8ff08d5ea0e -562a2ca70bcb19565d7b3b6f8421a55f -edb2a9815e3bd84c108ce8402f8b0361 - - -42b9d3d703feb637b4babe11190adb52 -0b3730d08a8d573f9195b07f58ccf09f - - -a08eb617d4122bc3972c2c04da32cb70 -41afb11aefb73a16398bd906a0201864 -dcce80148d3ea055836f7f38ab71f0c1 -e79892f863bfba42a2658e43a2e8546b -32320718dca589c661f0b456442a09f3 -01cacadfbda4293ab21e779e06146085 -ef51c84433eab6197f43d0559f22fd4b -69a64091740dccdfd8bd2f61df53fba3 -978cfbff83d963db5c848161fc3ab286 -5abcc5736ddd1748f943313023e76de6 -8b3806e68b169d4cd2c1320a5ab6fe8f -bf729609f42e090aed2a970401930e6d -937159f009bc845bd67dda6fc8c86b77 -3c789d0f23ee478dbbd5e66123e8fcb9 -89a36b8dd5d33e53b92b491bc3edddfe -2a6afbab650385179de02fe9205455d7 - - -6623f7b88310af04446f1fc03c15f793 -90662aecd9eb51bf87b91f76d452381e -10b05107d83798c17e2de027dfa923e6 -114d8997f2920c105be850fc6ca8cdc1 -381ef356a676703edf225c3a56071002 -82b37046e061e6b9037410d6f4a33721 -c1be7df4483ccc0e3b2ee08f977d911b -2067170df6bc861d12d11a277986747a -92fc4c52f6b3dc513b79c023996a1a6b -48aafbc6a3eb1e8054ca602d572ab095 -80f1b4396367b316403e0a81ae68c9ac -2cf90126aba2b06f593f838a592ed66a -cbafb5e0cfab93c9964b37d5c90b049c -773f9a324037de24ba20edfa4f69099d -6ff462498bec936a81e4762d3fdbf31f -a1ce81dd3436a5f87396dbc8213500d7 -35b24d3c1592ad0e60c99c81a94be6b9 -1f2562ebcb87267a49e9c8ec11f92d90 -c5ffee75e8c1246cfb6f85738560233b -5f6244d1e0c7f706ccaed8c71240fc35 -5f00bbdd645ef9bbf53ea25feeeac3f3 -e8f85ee5f1ce535b1a6933f18ed09ba0 -fb72e6073af1b2f0763f9edfb4394d6c -0a3515245bb3d4e69adc2abdc367c65d -19e39ed2f2ac92ccec072d8d3d741104 - - -d41d8cd98f00b204e9800998ecf8427e -c6bdcb7ce83891f04c87e2ffa5f9f5e1 - - -d41d8cd98f00b204e9800998ecf8427e - - -fd6a54cb5cf80f075d7687ad66dd2cb9 - - -be5e2576e65fca0640a3e943edb7b4a2 -d41d8cd98f00b204e9800998ecf8427e - - -5982465f278f6a2a2286dcd59dabcaf4 -d41d8cd98f00b204e9800998ecf8427e - - -7febd21a1cb275214aaf40c072227bdb -d41d8cd98f00b204e9800998ecf8427e -c9cdf98160b16d240ed8add73a7af5c6 - - -8b44e905dde9b634f064f0935ab9e546 -fcd0f13441889c51c4e2b1c412ed6919 - - -8eaae160954df9b829e2224b11183b05 - - -a95f9c55c30f17a2bd663eed08cc77df -9a9bc8ef82e6931e665970aa3d1fd443 -0a17e58a96e640f889fc9070e4fcf3aa -8aba7bac050b7a93d81f2fb0397e9e15 -50236f936e048a8953fee7889cd2ab0c -95c7ca5ec245de21b37e979c6e60858f -fa01b9e83a453a602c9736c62aadc43e -a6c72cb370c9e55150906f312a05a9ed -870efe9d8455708067696e513098c340 -2f30cfcd9cabc43375f3d5edef4d3f85 -3bfaed2d9b4913f2ff5ea9fda2fb6a48 -c8e79249512f721402fdc34f31cef7cc -3881cf550f647144e11faf16cabc3e74 -b50098209f4586d052d09d18e6672fcc -9d871a762278f29341461fd4bd2a0719 -419c98285a5101b7e65b66ef41ca6fc2 -de631767a5e5238053ee4215ac707f10 -f23353ad2aeedb13e783f99f240f3052 -07832ec2dceb8fa0f5759a2d0b430418 -dbdeb732bb6a49f0ef571eaef465b630 -5940f895f5cf54de4e7dee09ad2a610d -d752aa2cb86ee2e75197cd8d53caccf6 -91da1e90c3f6cd32d5902d4bd2fadc51 -7997949a483102ed8cdd178dd4125e25 -fca90d3abb0bfb755ae271cbdea4ba74 -47974ace4d5716d72e1ebaf69227640a -6201a56e2fcb1ef7fabed0107256a963 -8a178a0988c6af37314e5a88141f9386 -bb7eec1d1fc8a412fd3bd679877b81ee -0cc3f7ec629e5c1e3b7570ae84171e36 -db52dd37da8f4d01e9bd73087e01ddb5 -e778025aed4b71cf0b35cc59db17914f -82404512570e65ba253d3f36323dd512 -9a4de4051a24c667567cef34bed1134c -8d5b5034a1e4e7a49bbd58b0394e297c -a10954460c6482acc8cc0b5605f6ff1d -706e774159e5f4f92d0d04e2cf61bd64 -9dae47569eabc31005dcc53d82f55cea -78be79141544a09113a184f10b9718ca -9f0c4690ec5c15a4917a2e0824355227 -13222b403c0b5637a36c957c30ae78e2 -f51ad0b8753b6875e3d5b9f3feba98d7 -c9fb6bbf2048ef24ed569530ec83030f -a0ad0bc98c00366343f4bbe3d48beba4 -2b45108b647a41689246e6a726357a4f -7d9961c1a64a104b06dbba240330ae14 -11ae842cbb6240295f83fc48818d93f9 -94ba857a9e348ef967087e0a0f2bd260 -d68ba0b4e94776bda11ebd012dd33631 -5e31a7f4d56c406e92d76ae16d993a2d -9f7e3cecc21d680f70c61b4d408b1519 -a4d3f9fcb11bbb6780f8cddf01f3df0d -cdc24c750fcb7b7d8f40326d5838d16f -0721784fc7b394a25424c4fe80d621b7 -908362faa2570a246cf79ff161309612 -306be05385ad5bfe1d47029df6a40190 -c17dd5f65c6e968bc6fdca856fcedcd5 -9a33af7f281ecaaba4893441ab7731c3 -7714d3fdf695cf71124ccec8f7f6240c -7599edeb5ca8506e201160234a11ed8e -507a9041fdff731ef6c6716909e25fe5 -1b646e0ed4ac3f6e89b5ba191805f799 -a6b34460aecbd9dae2b87637dbfde02f -6f72af0f6f70e967f1c147908fd326a0 -697fb94351aa15d8343f1246586b9de8 -e9f7247094082ef2086a8a56ed2a0979 -7059eb3a823c49481c54b0b0d484e1ac -f0841e7977e192caeac203b1985081ba -0c760eaf667d6a2ffdf2888ba0411290 -1d4896154d273c484f9f2bdbdf7460e5 -d6841a83be394f200c67a19719d18658 -ededb940bc9bef974f367e7c9efea53c -a2381a7c9ab3a6f6b66ad1dcb7409c70 -f6707f432cafaa7ebacf034a5e7b8b79 -744017d51c4a1b65dd914efcd6dee89a -f7ed98adf964b0d1f7eaeb1ae7ae1d79 -5b4f2ec5c81057dd754094e56d17b548 -852360d6ce9e30ded7ed335bf0928aec -d8cc96eac70bb0096f1902d26fee2592 -22f9b960b151a3c1c43383eace1d9788 -97ab4d152e9f9d54a3ff5f334bb8512a -c96044ac8c8d614777361a6a8f3eb296 -2b979555b95d565d2da4a14870e67ba8 -1bcf03b6f199c75e20a7c95fb695fd0a -3b11aa9e5f65c636d59330c2b66132d2 -35a7834b8d4895a10571040af531bb9d -e46b985ed4c0371a50ba81b5ac0f1e20 -2ae0d9ffb567ae1ddf7a7d5a03bac665 -eeb05514d54d9dff4cd06bb2b04f0c74 -84dea7ebb8a9aba891cbd7ab0961bfc1 -0b6ed8c1b197087f362fc613e76f5624 -a72108ee4ac9447deb2650c5b515bf01 -1a3a3ba8cd6438c88ef50342fec90cd8 -e0e82394851c881f35521d4d21c46fe8 -264c4ff9c2295b042c713a93a3993281 -edccc56944500596de3e0fef711692ef -7f78f4bcf7e09094f5f00a89893c4112 -4cea68b0954db9a90a20c8daa8e67fd1 -9ce19a88c421af557ee1e582d6012619 -aff94e0104b3ad4260f091de695497c0 -8346ceb357687c926662ca02a8f75ad1 -5590263c8ea5b205550519e7a6783e80 -a05f65076f315f2eee5519530fbfd410 -c62c35a49b043965ff1ef41360f6ced8 -e4aa5b4a5a46c760f67d94df1be2eed2 -9f9e70a652890c3e0447025ddfb10ca5 -5d7135a2c1a8cbb81bab9e3076ab12bc -81efa23aaf89119b7fd9e9b11dc30df4 -308982c57a51acafe60f8b4084fc7948 -303f8b77eada534d2a692a21030e3c15 -2830e34c1f8cda84b2cdb3e1c41827a2 -d4a0bdb9b117fe6398b794b3d2a85fc2 -dc7c911bc134f62089e165f9f6238d05 -decab1eab38578ce8f10656fa88632eb -ca16eaacb00c2092255318739a6e4435 -4e6dc4503701b0435b3693d5bd4af78d -7368c7e3e36f72cb692d0bbe88ded8b5 -e1b0b1925464362a6601bb405e271b1a -b3cb6582207021f393aaa68f1124f876 -cfaeb6d271a44adb9450d588429a8d77 -de3eec1f74d4cfb0c8e6d2687356519b -43393ce9ff522e32554ad2d3f6e3d33f -07a50bc6f098820ad61a6c393958fd3a -838792bb47c0ac0e42556eb004268f64 -e1264759284525a21b6a958e9d156dc5 -c917893feeb8b3ec20476f31296aa7a7 -abb9212529ea1c95786d874ffaa8e538 -273e2fc842de912d144386929f1a15a1 -cd1f94dc0145b45cf1684adca5a7d999 -dfabb405ad93a07ab2841c886ca4e462 -364b66c43bfe30562e1c3b71bcccec4f -69eb7be92d18de3f1fa61753da831437 -bced56fa7bb4106a1960e05fe7f34176 -4ffc025c283f97e2272ca0096f7fd613 -8f7292cc17ee42ff37ca7b512d23885e -5be613b2efde61c389f121d049d88549 -8bcb07333ccb34eca1b9e23703b68d0b -a029949b76ced819e49be8032254d4fd -fffea1ce068253ab612421df3b142a5b -661d7f2a20d3b74ef02d617bf8550f09 -29144704bd977783e94061c95c4eb3ae -e003f03581891e2c61571b3ad1e5f309 -2513ce80972b2f97bdab39d4c88e62e3 -5e072b9b0e3e156c239555a2b4f80d9e -6ab6a6ee25845f894104ae501ade432a -3d3ff14576e13b075f5b22778d64f765 -9cc1f78c10304676914fd811bf005d5b -5088de3dd49f974a805e735ec47f1294 -2641c969a5b6fbf9ed7e461ff48f2b93 -08fcbc38b1e54899f352123734d2814c -26976096369ebed0fabe1361ea2255c8 -f8a4ef55656e01616a014a52c2ce6620 -aaba1ec9a857a24c0711dce31c2ce358 -a1f3b7c9035afc1c6adf1fbea8b04afa -daaef7e8c61f8035127f088ef4ccf716 -dde265a2d92c7c6aa9d7d1f6f2b30b06 -bbe8eec18966c8d314f4cafddab57faa -a3f7d6c890cb03b49eda844628c3caf9 -da55328a7af2bea41d4e9ad503ac3295 -e1498328c13d553f1ea65b60ebbcc059 -8dbaea6b99bca98cef1ba9134e5a9d1a -1138747a959eea9293d867b90a61a467 -44084ca81c38c43d97afc07db7dd9e39 -0e0885bc9bacdf96fc115d10989d35d0 -1102674d7fa02fe846b6ee296d54221b -05a86a89a7706b14ffa729065db2a34c -423d4e07981b521f368f59c832b88daf -520759623277c904b4e19f9443bb55f2 -678aa3dde0b9fea6ba7fd960f8b543c7 -237989e079a9c0fcfc02b00bc068455b -e411740ac09af617d4520f7c40cb0e62 -8e4df13522c5d026a58a8e408b421e4c -e252fa19cefe392c3ab0bbaea485bf15 -cdae2b8186fbb05b0b046e0ae9612a55 -1c434e582166e850108c9643ea309d17 -917bbb90e894b702738b0a855e8ada5a -b5ad7faaf39c31f3998a3e0efc9aa50b -7acca8f56afd23471be616f32da76177 -0aa65959c3c77cfde92630b153f4af9d -ebec4df08ae79d74b857319af28875f1 -b9dbd2efdd7d1e99a0c6ce93ca420a68 -99376bca382ebf503851dcfa232265fb -3ff20a4f65a3ab8a00366de68265cb87 -735e294a463f0637a415f2319bc9cc48 -aa54e78021f4d1bb70ba0a86603e0c9b -d023cb2be029d35172a6be518ec52b20 -d640e67e5c7ef6207ac712410e70bb68 -b370c0afc9a3d8c815d2cd90cbeec89d -afebab5c174cd3d8975d70576f4719a4 -edad2a8e3d8da0a10dae94003d7ac161 -f3070298832387524dbd69072cf4a372 -7d15a3b9db850d75ea9ae24ee8f4a5a6 -65d92b9b0477c9837efbf38a7b7ea5a2 -c7cd77d3a582802375ae5bf6f10e8c83 -c7e192544c7db98c438d73674fd733f3 -caf00c80da73b8c91ff6b60ff11a3f38 -8c8272f0266d1cb615fe9405821a4437 -0f5af26918b6ae65ad194e3d88a5d05d -883536a92ea0bdaac3deaab6c8d1d21c -c16e216295084c86131cb82725ab3285 -a803b15ba1cac06952ded820c39831da -125193d261478da895f83eac0c3ee2a9 -f9176e0e28bbb10b60f66bb41994ddad -a01b692086c81e90b5b83a480d5f11f6 -dabfe122961db54391e8be69042aa5ee -d1fc64e4ee3b5ae7e17225d9bf79a1fa -941c96f3b58c6abe677d572498852c4b -9d26b4498ff3172bf97cf5673253988d -19f19f8bad8acd604d711c10eda065da -e017b0f3828150c594adcd2c8af90b2a -e75f360ceaf5f2b4594f7b76edc19241 -669ef64c49628c5b887a4411fc5037b5 -9fc15430e24ba6eb7b33b6e7c0874487 -4353072fbb98500f1de0e9c1d216d347 -a6ea3ec495783c9325c72e581967d0cf -cb8d8fc2b0cfb2fbd1a1c0929c50dfed -1addbbe8e3eb6069cf18da622d4e1a3e -053d44baf2a0872ef1d37cf9daeefc3f -ed04f0a6c4339c46b4c282a0a854d611 -b8bef994c026b37b9b4f5974ce893998 -00659687e822e2f9f75abdb5e39652ba -a2b8c98e5e937d4030394c36cd21798c -4636fab0a60123f9ad85fe818599b405 -9dcf43b010cb84be93e62d66c21cf8a8 -c33107fa8b318cad0239936f59329ec4 -d41d8cd98f00b204e9800998ecf8427e -bafe9a2396793b2d4481b0fc3322609d -d0eb2a9ee1ebedf25725c0e422649eaa -1b0d0fbfc5a4d2b32d81bce7bf6c34e8 -63266c563c9378f163cfb618a4223059 -fa81e6e5abf211dc296f3964074ff075 -1014be1042e4412cc779114e22efbbb1 -a62629da5ea7bc3341e15a610408cb18 -1e940f915744cbe7787e6f3dde9c8fbe -124ec451985b7754981e1a3d0b809919 -ab63736c9d2e0387dce37a93fed8b831 -ac52097252e781beeae5890fe7d3f465 -41f1714268f1d0a0bbef4cee72891417 -a7ddea45e89cf5046ede8417667e088b -0d30256680ca56fd6be3ec868ebf9112 -df401117f1e4e634e060e5896b0240f5 -5c13687ece58c88ebcc754ae96d2da5a -20cb0e11b79a8070f468895c39df261d -b321deee7f5aa0fc2f8f3a9c342bc443 -74e9a7d184ced2eaed45be6eb951207e -a0a6b643fb37e4e0e73c70cbe17be57e -6be89520e9f97b641c541f81f1973dee -a674ea9f402bf34e9591e5fc84af47a3 -c96c4d6d3a51f13b6867808bd980bb23 -f62284f438f2bff72d7ad66fea455718 -511546bf8e95b5182d62100e6036203c -8358922d9616b33e01f9c513e21c47b1 -eb885966b385e68824001c4659e8a5a8 -04d46f95ed1924b06d194f4363b44229 -b43ddd1f1f10e9bba3c0c525ee7d4002 -08c80c9ccd4e404eb3b73de619810aca -902f764c305194a3a73a9558048fa0f9 -497f8512e0953fb4756cf1ad4912302a -12b7162e4a774c78b84c42b425fab3e1 -6c9e288f6ebc0fb0f94f24c7c8ec1fc9 -8b73753754751bcff226ee7dd6549b24 -a8976625526965d9b732935b1b65ee8c -fee9113860ed82f182f3673569d7b773 -590032449b973f97052209de37499ed5 -ff2149a9aa9ba3c7a12cd24fa38b6c3a -3726e556e61c4e08b84a71720b92c710 -cc84b9bd6eecdd832d4c91a9a296c129 -8d0dfda9e7b61c89fa871faa0395c6e5 -92a614f463ebb1f0902e5e73066ab3f8 -7189a729e24ea4b61cdf81bc203672bd -468580feaa8dae4b9d01122c761717a1 -89141ed845bb6407ca69b3e30ce95d6f -b3b1762c0ce26d200a957dcbf1983865 -1ae24ce932892fdbbf8f3575c5fa055a -fd433dda5c496aeeb1a82160f5640d82 -c6e0c775372d0b0f61b22bf6f999c36d -74bc8c774af57da5d5da0ae4ef35c596 -9374dcb3a45b7ee9ef3e769121c1e82d -c52cff0f2c9a03165895a7f852d7efb5 -fe4dc3be74c34cb4b44c7e9ef84a77c4 -cf880b45d5c11814fde64efde9887e65 -f8a86d46ba12d4b2c1c1baf732aea268 -5d2832ca505883e28c9ccfa9df1e02e7 -25c060c59f1a42d7063342ead6ca017b -64abc99ef44667ecb0ddc88e6f2e42ca -a004a5899ecb34c0a33c4d3851797b98 -7139fd1e3087aea679f7feea411769fc -d48ace57786f8427c01e4d43a3562ab4 -1e73d669f76e11740d335e913c553063 -a10e9702d48e5048011ab4e1d2ae46f8 -8287d3a6b2b47f79235f2d002cbe5e51 -29c29a686431b1e8a3beae057b567d1d -1482fa90736d256021902d0238d2809e -55303338e01b4c1efc8846afddf328d9 -b7f29d3d198bfaccda7387934113172e -2d8279165b4f5b8f873a6c6d6fed4321 -5c047944d8b41ee4db64fb9c56791411 -c9b18fb3fab2ed84f9129764baab45a9 -729c9f1776c1910cc47d91543b0528ab -06966c408f12d91fde89e4a09e0e4231 -df98289d4c783be26104a3cc0f5f972c -c26084608571d2f470bc2e5c85e6650a -d2cc8acdb5b35f5086e559c7d661a164 -936cb381d73c073c9497bfb59b9097b8 -98e669b273b77f609525f3671b358ba9 -374309cf388558483da86c1f1c0f297e -700c6dd2c1ceb7224a275690b97061b0 -d698cc3319fc4a96c1c578ca857e73fd -787bd1eafb0832b76af961c9b7593f6a -050289891130d5c1f34b133bbf3d3315 -e06bda46ed85ff27a1326e217a4882ab -1f652f0b2357df486e198847f1daf161 -dd43c46c7498cd08b64e12fdf9b85bf9 -cf0529c14a34a139e3e11f928e020b9d -12fd148568db6022b2580a387a26f276 -e2e2f26ec6e327dc547ead040ca0cb81 -62f40a247a0edaabd8cd61eb3c4ae5ba -e8d8a728c19d9d4f20bad9729db999b9 -cf9afb5756d9b72c9e91bde16ce18799 -175f0e227e1df4dfaecec6f7f8710459 -e40d96e9d1d26755db5b2612719b0f39 -6141c9b38c36734ac3e693268f3e99af -c98f6ea0b2c4e0feb871e8746a7a7b82 -7cbdc5ae412bb5a4d7af24bf3411e3b2 -48adb9629a799d1cdc8c1f7c9d71c14a -eb1ad326ee06394f0e3739410fd51c2d -b6dfd68bf49000efaa4f081ebd336c76 -7edbec184b7eb38eb8f8641dbadf6952 -ea50234b0110bac0bdff0550d30b5d3c -438e921cc8474128e2032719df13644a -b5a9d9588c575d16f974013fd7f118dd -f0520dcd06229c1a5985a89fc925fd60 -7b9798dde04e40214c4af8a506654f94 -415aebc88045887a2d4b5682965ea9f3 -f7354d7eedc28d35f4f25af5de1fde91 -a03abaa2558779ead5322ed5e9dfc85b -3c0037c6d0ad364fd66bb84e32ace401 - - -9119b560b46eb91bee49b65b8824ea1d -754f2fc01e28707d7ee83880b2bf0d3b -8dfc90aa3c80e1316f8301badbf0fd3c -7d4f2074184515e186276f5a551b51cc -2898169ff7e0444eac1d9caeab4fcf42 -7b90e5e1670cf28ff29526ddfcbc5485 -e5106e2c4cbf2b007632c4763dffbe82 -816dd016d43d9647153e5ad6faa4bd1f -876e2b05a908f2ab509649e25b35a2b5 -91d0d2e3307059f2955007e806e1310f -e54c91b1cd041573fe19bc08b4f682e4 -88c9bd17ddb511a5eb6dd1d5fc052148 -0cd73d4a4b23bcf9f5e63f7dec722b76 -f2d71624ffb8877879876d53ec1cff34 -6a096dd82502f825a00ada38e271cbbf -1d3a43e4445dd92c27cb046db4de9eee -88f01eed4560ed2ae32c903e4ce98b23 -d41d8cd98f00b204e9800998ecf8427e -56427dd9ee65473e097692228f166030 -b58f682c915c002e3ad587e7d379148c -20424c1aaee3b3454d27c90ca309e34d -491e1bab087c7415ac018447681f2f24 -673ecd84d976c942894743995ce530c3 -dff8af468df0e1d24953fb5e44314386 -9004c2fb26521798a25590f61826e946 -1d1c9396cb13e2720667e927bb6cb7f1 -48da9ab18ec1144ee2016df7323bcc9e -29172733b93fad2472c7a319607b98d9 -f2baa3176422453a2b03672f443c1f05 -a2c4390f37092d560ec126d7dca9c854 - - - - -6b13ba90bb8f496316cf3f3fda0f28d2 -0909666b1b90ac3b59258198682d13b7 -8bf560ad944f9d610ba157ae3bf05f75 -b811691553ecc5a374485b99cc49d8d3 -d41d8cd98f00b204e9800998ecf8427e -77561da87fe3133029a861a02582d01d -69944464ecb776bebbe88c651177cefa -9c86a871d7737524ea95492f1f9d8ac0 -1c1e32b3a6b9e848477e744a78afb206 -2bd811f0bfa3b661bd51c50bd79d2c99 - - -d41d8cd98f00b204e9800998ecf8427e -53e8b917b687d6975ba6d2193a0ba108 - - -d41d8cd98f00b204e9800998ecf8427e - - -9152d7f1724ed8fbcd2e0c87029f193c -52670116786d66463e6299d027941a0f - - -af0998c2932337c7594a4a87cf264883 -d41d8cd98f00b204e9800998ecf8427e - - -cc5bac8ee33a602115fb4f556412e1a6 -eb274f8f5338861fd9640ce24d1e6572 - - -7f38f489913ce9934c7ff4f79078cbfa - - -d41d8cd98f00b204e9800998ecf8427e - - -d41d8cd98f00b204e9800998ecf8427e - - -367bd1d310e5fb48a0e8064b5ef466be - - -c3805051dee9d94eb19c13a73a8a6089 - - -d41d8cd98f00b204e9800998ecf8427e -ef9dd946d113396c05c480c3248a415c - - -d41d8cd98f00b204e9800998ecf8427e - - -27f1dd4bcaa604c1d23b085771d341d2 -df6f9a31d6f12dd8aa27e374d5c871c7 - - -2960e827e1369ec2a9feb4d54e950a85 -d41d8cd98f00b204e9800998ecf8427e - - -e5d212490dfdf4fdcaeb0adefd22e927 - - -fa2e51f371a895c26f0c3cacc6c22e81 -d41d8cd98f00b204e9800998ecf8427e - - - - -bbd08125b8541bb823d72ffcfa24ee98 -d41d8cd98f00b204e9800998ecf8427e -36075abf6beb80dd2f71bb3688a1cf25 - - -fa2e51f371a895c26f0c3cacc6c22e81 -d41d8cd98f00b204e9800998ecf8427e - - -aa76e118ab93a4f2eb83dd312d7da2bb -d41d8cd98f00b204e9800998ecf8427e - - -d41d8cd98f00b204e9800998ecf8427e - - -d41d8cd98f00b204e9800998ecf8427e -50e58dec4a51d418132a75197857b088 - - -d41d8cd98f00b204e9800998ecf8427e -af125c0b7eef9b8ba9a665d95859733d - - -aef6cc0632b185df36db50493dfe8673 -2b434301527bead71e0dba59a91a4001 -176beaf9164bd1b837c53570d0353876 -21b9589e999c54b614b1fa7422e81de7 -f0d5864d0e870d4b422af7df1bc718a7 - - -2fb346f0383dd975a301eca9a423c12a - - -ec6e9b70815bd520f27a47332f47d97c -5a28912aca5195e4ee88a965292421ab -d41d8cd98f00b204e9800998ecf8427e - - - - -07d2097f5a71a50b264d0b8454c2280d -d41d8cd98f00b204e9800998ecf8427e - - -d41d8cd98f00b204e9800998ecf8427e -445d21689c1142b2c98614e296c15fc3 - - -3f5993acb1427876c4ca8913cddc9174 -e382c60e94762914d4451eefa38fcdb7 -2bb25c5563c0f23357ab8023a08c7dca -79fb102cf00e5bf2a76cf1330fb51577 - - -368d57ca80f31c58192581ec7ca7f649 - - -4490cf4f1c7d53a2562bcced23e2b880 -d41d8cd98f00b204e9800998ecf8427e - - -26c66f78f5db62e9af07cb11280afc24 - - -120b660df099ef9207e084810b95643b -d41d8cd98f00b204e9800998ecf8427e -28d24390fb0fc34b881439a3e1fde041 -a0765816715c1bbe18e9f87846a2b710 -f180d27636c3a69c402e244791499c59 - - -d41d8cd98f00b204e9800998ecf8427e -3e693506b63ac541c1463b20ac446350 -1170a4d844bb0b829cf85f02e29e2cfc - - -3d9cc4ec66df38298e16365e009dfe66 -5c25310c78417e37fd75c8769e3c172f -22cb27adf9a761ca0cb76e0e54b71890 -1798725090e74dd4d13d14a8a5533455 -c8159d7f239eab452f238023b0b11392 - - -f6824fe35ddbed045eea82cb1612c2fb -8ace5113760f987144f54425afffd195 - - -f14e522e1e5733145de616ab0ae9501d -4e43b862976f2b1a0f0d0d7a5dba9d19 - - -809e6f0b71137a2d0d489ef24a383bf7 -cd26e28d19227f52dbb7af6285f49684 -5e83bbea91f6deaa37b247ac013ef556 -4ab5cf779b6ba8737731bd949438e279 -c533e3d3e66811df956313981c8fdbac -ba1629cc343a821009875fcc3d23afb0 -d5f4a934ec62542d5273a41e8fbcfe24 -8e9667450cc2157e1157e8785b367225 -7c7da4fdb0743389e825481f72db8fbf -1051c422df2cc6f77c4cb08eebf9a222 -6ca183f901d31980b285e187778a82c1 -8e9667450cc2157e1157e8785b367225 -c533e3d3e66811df956313981c8fdbac -7791ec67383f276b58e5f8f3c32409bb -c8a144d7c8add753a44e8e8d55595570 -98cf56f3f039afe645291a4f8d232d5f -e605e982c1935f82b08f81c61fa61b3c -913a37ec8bb5444e2aebc3e37ac32f01 -f933a0d4e4f4a2f465d48977a62f71b0 -c86760866ffe32b359549745a00f78e5 -6959d7207e6206827d65ddd355ba7506 -bafaa6d8e8c91f79ee22242ef6fd5dc6 -cd5792374200bfcb7337e03e45454e50 -c7701209d9f6520754d641090de4ae63 -765e3ee60bd9940d57172336fb3ef5aa -90eb802715ce63e5e3ca4a55a42b8397 -8bb0f71417f315eb04c44bf1b07dd157 -44854c50928080752b377841ec269639 -8e9667450cc2157e1157e8785b367225 - - -f734bdacbce7337ea1b52b95b295c49a -e186597ccbb2c1eb388198d8d2a199cd -b22186030a04c7a208dd219acfe203c7 -37e28b4e4e22b80c1d39d038599e2dff -5e4cee9e9a747519c7ac8d53b72a1e15 -8d14d57b64e6d0941a4a3da42485c835 -e0074fa750edf8fadaabd21713776fe6 -83063c2136d912f6cf89a173cf71e7d8 -0ff637bde43375a809e583841634f760 -ae9923bf8191d4cce6f6aff23d7a92c7 -73936e9491424f1091d860da60e70a7e -f4a0423781100f09efb4546515878611 -6d28eea8d332c17dda186d63f9ae2206 -acc3f08c46b50f9b3b66ea831aadf3ab -9e95e8dc5850c73b8ced6dd0bca3919d -b6ca1dfb745e85d611fbe81cccd4da33 -22a1d48babdead60060ea6eb841464c3 -adbd23ce0f80d78b794b1bf265c21e5e -74107c8827b62bfb576c7525db0c50d4 -dc22d6ec2bda0707404afaa8259ee219 -b9c630a949e08d2aad90b54cd97276b5 -b6342a142293dc8e125d11ea43972d05 -d41d8cd98f00b204e9800998ecf8427e -b2fc85cace867cd419febae19227a5b7 -ee172f657651ace5f45374cc6a5c3639 -c71ac960b798f1acac68b17b7fa6c803 -ea0cd1165069b2c5d4bd5916fe10741d -85a06666e72e0c9522deb1041e2bed91 -570463ed73e7c93d0989adca95a0d440 -97a2ce5955231c1b3891e8eee2445c62 -35df8b42457569b02c19be41abc87f45 -6e4ad58de75dcbd3fe83e4680d5a94d3 - - -cab0ab4445e82168d2cac70036925a88 -5d3b6699db4bdb0b80adcb87bca2cbda -cd4aafbf96f9ca00ec1ea45ce445273f -53752275e001831a1aa1af926cbdfcbd -9e36c55b53a1b080066d9947a92d2ce3 -8e9667450cc2157e1157e8785b367225 -8a7351ef099da26bbaa63ade1ada8be9 -f69743db39fe49a61499e443879ce394 -ed7f8a63c16ca6f732b8794ff0cc2d28 -0ce654c1f24e1190c6c3022435e09ea7 -77bde3efa7443489764569752b420eb1 -35376294d8fe982540141abbb4d1714b -f6c51890eb3d84defb470c9101e0e1fa -7df3d6c0f7590453f08e362b6ce20940 -f4e4c9fdfa66cac3028c2db1680b46cd -1ba2c9d892264fe1db8eefb1ecd3bb8a -3f933eec8c50faea176b3e58b18a3510 -a346bdb285fe8580f4b5b8dd5f5451ef -07001b443cc63071e2a368efeecc9ad3 -33c4116fccc3ff06e1c82060d90c1aac -ab59944ef4c329f4d5c3109775c61f5b -131e9c1492e737f2c9ec974ca6266f1a -618d61f6e80aaea18e3257b4d6cc2728 -25c9d80f42b34d9dcbfdefdf50cec661 -f48adb959a22f1724228581645cd9e67 -7714b390ff497c388fbdcfe8c0563790 -8ace5113760f987144f54425afffd195 -10feed256eef9b9ba87cf7fa3ac0ef36 -deb4efac7c2229e79dfac38516e78fb2 -acf42861a59faad7e9c5fd30cd9cfd70 -1b474f0760ef6d41e1ab690197d6c3b4 -2a2a087b71d3730e58954da48d65b1e0 -e5f6f03a4edf8b78cb561640dd021ef9 -a65c4d66168635b87ecbc720e2a50703 -9c85a247cd59245d62ad33a6f6d8021a -dd1e24b1fb6cca8441671b624b5785dd -351226b86bf32c35da86bc84d37710ac -c0bd3c7c4e7d1c006b2301eab5ecd948 -2d042b078ffb9cf4e0321fe8a09cfa88 -64d3e67ba4a87e02faa08fcb6d92d628 -b28a87c8e679b0340ca2bb5e6bf5f6df -3f995da98d36a1ccea1ed8fec6b9f4ca -9e95e8dc5850c73b8ced6dd0bca3919d -275999a532356c158f19fd8a2b06d399 -10feed256eef9b9ba87cf7fa3ac0ef36 -8782f385cdddac89c3704c05a8a7ac7a -e945c933045b11d928443a45decf52ad -7f073b1e3162a90d38273edab7adac23 -4af4f260359b0ce9c42f77ab47caa6bb -2862f528c2d606a7c780b75613b90761 -43926a83973951e9b41d8c0aab0e2cd3 -f2930d262bbe944d1a7850e4a18a2e50 -c2664fbfabe5322a1a136ef9e6ec28db -9fe6aca4313338fe6dfb496ee6a37745 -5a582fdea5dff2f52a79aaa101278172 -4f37eab95abbe47905271558dfe2582f -85e75bec7eff5d20e41a993927acb5f7 -26b7b52cf3e0d7132dd00290a55a3192 -a9c1b094e5f90641184b3cedc1b2b372 -c6a9a7d9cc31a6f650c60a8012a0d0d3 -c5f9a0849fc60d9d903496e6752a8961 -3f4c833d31becf6c023f35d3a8140ca8 -d8aedd7beecf9e743f5f49cc11429c0f -ec291d015307e2d4798886aaf95677ae -e2c4129a196854d4e004313b67cabbb1 -16bb485a90ed5d40b877f42ae2c1e6fd -946e88d5612bd35d2f9297a1419ba62c -7c7da4fdb0743389e825481f72db8fbf -3d64316fad587349e5d9dd0792249162 -7c26f8ac117a0a43f236900481e8781e -adbd23ce0f80d78b794b1bf265c21e5e -25c9d80f42b34d9dcbfdefdf50cec661 -ed08dbc09e01bfa10b36e7b6ed8bf9d3 -5dffe1f2fb151b5ae395df7c0a8e7b15 -e6757cb7e9e8dac57b24af8395a27fdf -7f073b1e3162a90d38273edab7adac23 -9a58dc01b905407823d94c3099ea0c44 -061e57284f369a77f4ab7a210edd6d16 -c533e3d3e66811df956313981c8fdbac -7cce79ebd74e8f71ce17f811dee41f34 -7389cc51b77b11b297ccce79048a1c7f -9b70d8debaa8065353104c699e328325 -c6e27842c8603e8d0679cdcef7cb6504 -e496a23a58f66890e5c69e7a1699aa2d -6ca183f901d31980b285e187778a82c1 -f82a70bbaf24434aff018e689e86221b -9d3d0f55c282fc3544043027b119cf37 -b15fcefe9e55b29cb20d1b1de229edec -4b35eb7636936f48c6d40353135af307 -25c9d80f42b34d9dcbfdefdf50cec661 -de2022b0af088c7f59b35e323fd6a662 -3de564ee11be8e8c77599abd1e3f3b40 -acffca6d808968e0ea67fba273d7ee2b -9bbcc89b736a13147aaa5aa74b4a0440 -913a37ec8bb5444e2aebc3e37ac32f01 -c39899fd27e0b323e6b1c026e9a9359f -ab99e28fc193ffaeee2c33dde09bf167 -6d457a2c2911dd34f7786ddebec78a4e -70becbe01e0a3028bc1f911d157502fb -c48848adc73b20b6a2e52888c8a7f9f9 -c17a32a624ef386aacdbc3a683f32048 -d41d8cd98f00b204e9800998ecf8427e -8af57d97c02aadd073dc0c67d2546a9c -a79fba50514b6341e89f4cfab2538074 -5fdd9b86b6f8470c71db5a04bcb9e11b -5162c215a01d7254e1eba6755450a163 -c1c1d802683b4599c4cfce0ddfe6be0d -5ff452c2f13647b0f60f9dad9ca3ba21 -00ff70d955ff73a44e75034c2d58204e -d5f4a934ec62542d5273a41e8fbcfe24 -5f7594cc680f9f8e39152b67ee04d492 -9e36c55b53a1b080066d9947a92d2ce3 -16f15b5dcb1b133a53de211c024611e2 -9f011bbff1b13ec5fd8307610210a91e -670fcc17fec05077d89269efc0ca2a0e -8376d641f582ea7fbf4334fe8ee54403 -1ac87d92900f2a381db91de8cdf0dd46 -e1d238ddd4e573b085cc34b028b24883 -732ded5dbab1e25ec84bb0d1d021b840 -115c4806f36aeb531699b370720312c4 -a671cca2c79d9135464aa9f41e78b026 -bb0fbf39951397d1d3737a3d7006d18e -aba33e5e98071280db0d34c42349f1bf -76b75be7fb2191b64616144f1bb6f324 -f17b1318317516348f82385cc233ff0b -441617b20516fd76a40c7ff1b11690cf -879bcc7a49c8a8b2dd20672d7fece36f -ddf9cf9d441de3934800e1a2cec8af0e -d8aedd7beecf9e743f5f49cc11429c0f -798ed84c7b3f98e34a5aa55074cd2616 -43d6877df934dd2b5a134e63980008a8 -b11a03507e5b25abc28f38627259e6c2 - - -6964848f5af43d68c6b7218d3d3804f2 -ba1534f65c09d9e2f771405acc34e47d -d41d8cd98f00b204e9800998ecf8427e - - -448c864dda6bfcbb4d6344f5c61a3331 -c0bd3c7c4e7d1c006b2301eab5ecd948 -94a9153db495781ee4c317420202a2be -1c1dfcfd97b07cefb27d60e989f82427 -b61cf71e2798c651c607f48940a4e09f -e2e7935ab2ca6ec4318baf7d9e4db6c1 -b3f7fd8c8d2d111960bc1ce63edd8d70 -136042c53e8cdcd5c877a55278b800a8 -02c9db9f7c03e235dacf85a337b8887b -1d2a82296a2da8e75073715f5b30c93f -d3dffe4a4ad4030e443985fa8ae1a91b -db95c9c78a2b762361c7c2c9c1195145 -e5f6f03a4edf8b78cb561640dd021ef9 -fde64db4462dcd2dd78d40ac1e490286 -96ac8ec152e9815e48efdf383dd7e209 -a03c8d2492d0ca2404593ec71b479eaf -85d404bac8dce61b4c6aaa8023b3a56d -b57af4b9947810d411c878d3e9caa276 -222b20d8427161e4a655b346014e0408 -d3064fa8b7429f42e62da1f2887161d4 -ecad6bd4ba98051aa8d375b71b0e116e -9d0a732a0ddc0c0ad033e1cae7e8e1ce -55418df59f5b95c989be04f945a0002a -767c14923c466cadc2b4d21941ea8f59 -c78c3ce42e3987678f28f5c2d5888a31 -67f93528ad1ccf9b8b72651e16c2b83f -a6212b5e4fec967f17c519c9c6ce0171 -6959d7207e6206827d65ddd355ba7506 -f46842235b8299668e3c493ea36de3d8 -0c4097fb424dfb257639732a19e5c2ed -7048b07a1e0e0fde5c6a1b4d756d10b6 -913a37ec8bb5444e2aebc3e37ac32f01 -e2c4129a196854d4e004313b67cabbb1 -ed3a68794bbf31b3c2de610200b5a92e -0bc1e68b3aef15b66b82bc1f4fec9a02 -47efc87b5dd14b2464b2403e038d03f9 -c0354a0f9fc6655fc9323757e9e0b742 -8707c43fc89f7fefe22678f3a25fd20c -4b31ec814f6c455fb7d72f4d32589b3c -40132ecffc9bec07aafcc30c6286078a -30840a6ccd63f38c28920cadb162e188 -b3d6f3785d8cfecff48833b17b56ccdd -deb4efac7c2229e79dfac38516e78fb2 -2fce4bf86219c914595c178c2d7e13f3 - - -ad54dd3c9b754980becf7ecc311038fc - - -4444d699a1f01f6f639b0462ad5ce76e -d41d8cd98f00b204e9800998ecf8427e - - -d41d8cd98f00b204e9800998ecf8427e - - -fca0ccbd4ab10bf1a16f9856eaaf88a2 -d41d8cd98f00b204e9800998ecf8427e - - -25f7de1beeacf1b5799e272cbf27470f -16e262f3f18cf7836e231b64a353af7f -4e2c6546761cedd8a8a3e1419b42f78f - - -cd26e28d19227f52dbb7af6285f49684 -5e83bbea91f6deaa37b247ac013ef556 -4ab5cf779b6ba8737731bd949438e279 -92e62681dc53e8a32accba6846001552 -ba1629cc343a821009875fcc3d23afb0 -fa5f8193240995285a30de76a124744c -034863b5c8459093e35c529af988e293 -9c419b4fa2cd1c7ad6772cbb28934b51 -2f8d8c187982fc14d5563c7bdbc43e37 -6ca183f901d31980b285e187778a82c1 -f2681caacd54b4b43912e489c678a3ec -cbf00fbe06d62b8503f79d19005b84d5 -cd4aafbf96f9ca00ec1ea45ce445273f -e605e982c1935f82b08f81c61fa61b3c -ad13b311bf3894d1537bf68d32120589 -c6c06e5a431452048d30850fdb6f1baa -f1d99169e9f6f6e4880a4f2859b53858 -8475cd05414226f2ff20ee97df8bcf31 -71042cbc4ea8acafe754fb436feff958 -c7701209d9f6520754d641090de4ae63 -dae6f405639ecf3eea0e3d1bf52936f4 -90eb802715ce63e5e3ca4a55a42b8397 -8bb0f71417f315eb04c44bf1b07dd157 -92bcad6a72829412e19818ac23d99c7d -0f35131bd73ad43c77503abbc9b8219d - - -e186597ccbb2c1eb388198d8d2a199cd -b22186030a04c7a208dd219acfe203c7 -37e28b4e4e22b80c1d39d038599e2dff -5e4cee9e9a747519c7ac8d53b72a1e15 -e0074fa750edf8fadaabd21713776fe6 -83063c2136d912f6cf89a173cf71e7d8 -0ff637bde43375a809e583841634f760 -6d28eea8d332c17dda186d63f9ae2206 -acc3f08c46b50f9b3b66ea831aadf3ab -9e95e8dc5850c73b8ced6dd0bca3919d -b6ca1dfb745e85d611fbe81cccd4da33 -22a1d48babdead60060ea6eb841464c3 -adbd23ce0f80d78b794b1bf265c21e5e -74107c8827b62bfb576c7525db0c50d4 -dc22d6ec2bda0707404afaa8259ee219 -b9c630a949e08d2aad90b54cd97276b5 -b6342a142293dc8e125d11ea43972d05 -d41d8cd98f00b204e9800998ecf8427e -b2fc85cace867cd419febae19227a5b7 -ee172f657651ace5f45374cc6a5c3639 -e09179e576a7f1706c632d9c6a4be337 -c71ac960b798f1acac68b17b7fa6c803 -ea0cd1165069b2c5d4bd5916fe10741d -85a06666e72e0c9522deb1041e2bed91 -570463ed73e7c93d0989adca95a0d440 -97a2ce5955231c1b3891e8eee2445c62 -1ade3d7773887c7f5089096d1afec3eb -35df8b42457569b02c19be41abc87f45 -6e4ad58de75dcbd3fe83e4680d5a94d3 - - -1e99a575dd2737b28288144382810210 -5d3b6699db4bdb0b80adcb87bca2cbda -cd4aafbf96f9ca00ec1ea45ce445273f -53752275e001831a1aa1af926cbdfcbd -9e36c55b53a1b080066d9947a92d2ce3 -b2f4d01512267ce06fff267cf4136d6c -8a7351ef099da26bbaa63ade1ada8be9 -7695d1ec2dcfe45c3f713cf420f707c1 -c4df95964fa512230fe0133cb6d83d2e -a4991dfd1bcc9681bd2dd5688f2e86d3 -0ce654c1f24e1190c6c3022435e09ea7 -8f120e35f8b6608fb34e38edf9a2687c -9ad922c1fdc252eb8e61dbfdcf32ada5 -f6c51890eb3d84defb470c9101e0e1fa -db77b35764831af0b616bcc87ccda46d -3b719c139541347e5d868dc81867d444 -12bd3c14cc3b96cf90d3362573d85559 -8816de8b6e1f9e510d6b37002b1981aa -a346bdb285fe8580f4b5b8dd5f5451ef -7178d620bb970d5b1c9b337ec3fd4ee7 -33c4116fccc3ff06e1c82060d90c1aac -9b143135252fb96d644dbc11c8bb1978 -370330c7627ec45797aafa9e99f84762 -131e9c1492e737f2c9ec974ca6266f1a -618d61f6e80aaea18e3257b4d6cc2728 -dc1b29caf1ea591b1b835b96d3869db3 -cc9d3aa2b9dd98d94377e40b25935c24 -7714b390ff497c388fbdcfe8c0563790 -8ace5113760f987144f54425afffd195 -10feed256eef9b9ba87cf7fa3ac0ef36 -0ddff84d392b7fa485c6e47623f9885b -1b474f0760ef6d41e1ab690197d6c3b4 -2a2a087b71d3730e58954da48d65b1e0 -268b73ea43444081e3d46c8754bcf74b -a65c4d66168635b87ecbc720e2a50703 -dd1e24b1fb6cca8441671b624b5785dd -351226b86bf32c35da86bc84d37710ac -c0bd3c7c4e7d1c006b2301eab5ecd948 -bf7304dd5d19225b698af27eff949294 -8b7bc49f97c95c9d641d3b3c72ccf1cf -9e95e8dc5850c73b8ced6dd0bca3919d -fb0e617a4e54b963f7c2139efa874d10 -a9e38adb81052e1178a2486de8a87c28 -b72c3b6c763f26a3ffc3c2d6c0f6d49c -4b1644100e7aea8a79bf8404381b8654 -4af4f260359b0ce9c42f77ab47caa6bb -d345a084df9b7c46897877130a475f22 -f2930d262bbe944d1a7850e4a18a2e50 -dff0c705648f53cc2f2a186ca22546e8 -2f7a8a40835764d2d62357e2ecbd1d28 -665abcd595667e221eb5bf99589f8a05 -4f37eab95abbe47905271558dfe2582f -6f1285c463f6d6fe42e39f34d733cf2c -0474bee65715fc6918a92b668178be6c -c6a9a7d9cc31a6f650c60a8012a0d0d3 -c5f9a0849fc60d9d903496e6752a8961 -c64ea6bf2afef2560c8b642972b04663 -4a436addc8ecc176da90d6f8e7ca0a8a -ec291d015307e2d4798886aaf95677ae -c5e70aa4ca496434dce0517017aa787e -2fce4bf86219c914595c178c2d7e13f3 -946e88d5612bd35d2f9297a1419ba62c -9c419b4fa2cd1c7ad6772cbb28934b51 -3d64316fad587349e5d9dd0792249162 -2f1531eab3f5b51c4c6725608f4eb456 -adbd23ce0f80d78b794b1bf265c21e5e -bbf2ab3fbf2474796961f01fb3eadf10 -79a72d08df258b0ca33c240c1d7746c5 -9692f8944e4499d5f0dd89a7a7dbfc9c -4b1644100e7aea8a79bf8404381b8654 -89697cec3795e0df248044ce53e74756 -7cce79ebd74e8f71ce17f811dee41f34 -28d998536cc67795eb0812a1e4c5a6ed -7389cc51b77b11b297ccce79048a1c7f -9b70d8debaa8065353104c699e328325 -c6e27842c8603e8d0679cdcef7cb6504 -810dab21a178dd4bd8acbf6c0741d2cd -2a82b000df718dd6e6770e2d50b03862 -6888fcb054283b54a92755d30b41e5da -9d3d0f55c282fc3544043027b119cf37 -445b34b4ac5dbd8cbdbb2d8d52656cab -b3b82d32ad1e02b6be3078a24ef8b28e -752f4b5e92e81b70cae0ddc1be19e468 -3de564ee11be8e8c77599abd1e3f3b40 -3f75ac05a676ab5c90483bcea3b7a6e1 -81707b9c0d2bcc9c4494fe861b4fb962 -bf803d2d0ea860bbc5e35c4b6decc800 -bfd0bf42e6473229d91e07d0b3f9baf7 -19e9a1da7c2e79b9b4d18cb4224bf018 -47b54d44fec79b69f1cc151a1b2a9a43 -c48848adc73b20b6a2e52888c8a7f9f9 -e3c2928ed3fdb5baff03efc59a6d35ab -d41d8cd98f00b204e9800998ecf8427e -2e0eb0e3d978cfc35b462a199aeded78 -7d389b04b1d62e932d0e2696c7e68e9d -05681d69a9d1601e222762698c9e95d7 -e7e6b8d7a9b989619beabe01cdff3bb2 -d5f4a934ec62542d5273a41e8fbcfe24 -9e36c55b53a1b080066d9947a92d2ce3 -7921881e4e473d7284ea741addbe8810 -bf5474e7c85243d85f6ce742204bb692 -4d444d41aee1b2c9d54942654da1d042 -8376d641f582ea7fbf4334fe8ee54403 -03ffa8f7c09dcea59dd5c89f136c7da6 -e1d238ddd4e573b085cc34b028b24883 -115c4806f36aeb531699b370720312c4 -a671cca2c79d9135464aa9f41e78b026 -aba33e5e98071280db0d34c42349f1bf -5a8af818e8fb9bedeb55d5cf3427e2ce -826b0a139421500b614b3302c87738d0 -619c0c5385acb19c1fc066b3ca4ea883 -287ac7dbd72c235345b20a09e93f4df4 -c5e70aa4ca496434dce0517017aa787e -c0bd3c7c4e7d1c006b2301eab5ecd948 -1c1dfcfd97b07cefb27d60e989f82427 -6151a7c4134040854886bc5006a0f7c9 -c5a1b32584b43642dcd623f195e146ca -136042c53e8cdcd5c877a55278b800a8 -1c081e65c1f4d55f0874c8b3e21e874c -d3dffe4a4ad4030e443985fa8ae1a91b -d2e1f32fdfd8eed8580f1b72973330d9 -92dfb008bc785eaac8dd2878e17f4a31 -fde64db4462dcd2dd78d40ac1e490286 -a03c8d2492d0ca2404593ec71b479eaf -85d404bac8dce61b4c6aaa8023b3a56d -207b36b38595eabc40f7fb975b9720b3 -d5f4a934ec62542d5273a41e8fbcfe24 -d9e0bc0764b65a6d2a0515c80c52314c -ecad6bd4ba98051aa8d375b71b0e116e -55418df59f5b95c989be04f945a0002a -767c14923c466cadc2b4d21941ea8f59 -a78a833c5c28843ef5c49dfa04c1c970 -b3ef3d72a6836a5291a0487307b5d8f6 -a6212b5e4fec967f17c519c9c6ce0171 -60805f7fdcc0a187defb87f4ecfd9bb3 -a6879b7e59ccb7926635047f0c736b05 -16f911dcd53ddf0a2c59fe6173f892f8 -4454d66db639f71ab544b163923181fa -b48838edc93500f2bc9d4fe8afe1d6be -c5e70aa4ca496434dce0517017aa787e -ae2b207691d431eccbcc781baa57ab4e -0bc1e68b3aef15b66b82bc1f4fec9a02 -47efc87b5dd14b2464b2403e038d03f9 -8707c43fc89f7fefe22678f3a25fd20c -4b31ec814f6c455fb7d72f4d32589b3c -cc9d3aa2b9dd98d94377e40b25935c24 -739a60ba606586c88e8626e558f16807 -679c3a5f9bbbdd055430363726db4664 -2fce4bf86219c914595c178c2d7e13f3 - - -715f17cd829260420265f6d293640e04 - - -97ff898d2a2fbac0152ab6936046e55f -d41d8cd98f00b204e9800998ecf8427e - - -d41d8cd98f00b204e9800998ecf8427e - - -fca0ccbd4ab10bf1a16f9856eaaf88a2 -d41d8cd98f00b204e9800998ecf8427e - - -263890251d7bbc4c692caa22c2c00dca -8b066f77cd96776d1046ebaec421c36c - - -9257a0e2e2099e4060656a32c57b55c2 -adfaf6538827b606a08c514b218ce02f -1c43815c33aca84f12c41fa1bf03ac9c -cd4aafbf96f9ca00ec1ea45ce445273f -4b3af70f24c7bce743e39a08dc227f19 -4ea78b1e4b0a34928ec2abc4ba8a1ea1 -9afdc285279a1dd3e17a321e6d531ddb -0c77a1573722d25c3a6c1be4a294de22 - - -236333d97d78268677b1575df7c334bb -bfdc0eda7b92250bbc3af11dc4882d99 -7c28ecf37a5112e346685801e6f7b7ce -f1ea44ec38125fab210be1674be67f0e -b3dd447dfc83ed5da9eac072d9998262 -b88670b988d1bfcf10d160c3a5f13401 -f015e173f86b564e9f485af1c5643602 -08e1f9036ad91fd03b3199040a865faf -03e2b564224bfb58ff20904bda244043 -c3812c74bc524179f4ccf5d2db7b3cbf -33e8113b927871ec7a037f3b84b9ca20 -e997d11209c765632062e4dd60e01007 -754c92df6977bb4c96bbdd144f967bf4 -7796308f80795e5f6dacef6ff7a2db2e -0ccf49903689d2f274b8c8a91049c8a9 -12ace1a918403049a6d2fc152f53baec -bdcafc9e164189ba7dda7c7740661f0f -182b591d18dbc56324b1d2099a03ea6b -f21d60f6002be2b1fd44642d414a2d46 -ab89c085311cd936ebf65d70c1dc73a6 -608997bad3fdb828797390380ec80385 -7d7ce82b25e32e97c09f8e1a25dea530 -d41d8cd98f00b204e9800998ecf8427e -d0aec8831504183d456cc4e0de1c399b -1f6ec0f59547ec12579adcda6581ecc2 -8ef569dec9d762a539028f412673116d -136042c53e8cdcd5c877a55278b800a8 -f1d191833ef5609e44f2322622805794 -29e72d62c835fdac475bba0a45871657 -b508411bb915ecf32b1a995644f67fd1 -395a36af64488793bda90511461c1814 -cf1cbaab94fb9e593ea0423e8ba4d390 -4f252769ae9a32ba0d4e1b27759edbdf -e217f7a43c29d1ba1baf4fd857565a0b - - -a99385ed8f77646021d94ba3facd3a97 -08f95e2a0c68fd61dc33968c49d16a10 -bd9b10b04302be0e53add9368bd0f05b -b7cfe9e33cab51b6db6b1719b3aef919 -e9708940060441ef594907daf7e51c4c -afcb155fbddaa030bf66e006370353b2 -f7a36035b7de1c50116eefeb9ce7ebd9 -d41d8cd98f00b204e9800998ecf8427e -ec6685dc57f789909eee81e478235dbd -b5ce0389855bd84afd83bab3343ce427 -1075cabb9ceb8dbdd282ea942a2aae11 -102806ae9860384fd3574d4ba60ed957 -4650405d73ef5385afa60eea56539fae - - -caf1836f1e59187b389ccb270a20d3f3 -f3ba37478e4e4f5e6025d24a1f649502 -cb9441c877ca30d9c4cb5fd3dbb4bf1e - - -21c8119beb6f441ae3cee8ba5f56cb88 -17b566296feac4f9e98afe91a74e34a5 -d3c3bf844a6b83632433bc164580854f -77abdfb77700f022c7ab0d27537e5a1d -0e8f5f08ceb1d48ce3372f323e2356be -f37f6c723a49a7d2e75e4684d79c242d -53de27921ab92e2392b47c4b62f2608e -56ca1be6d8e073679cc5c98b1330443a -4f0d3ae4d3590264504070de22cef435 -77cb3ae7fad9e2ee7cfc00f8cbc7a91f -0c70931cbccf0d0f5711e9f5a235ba9b -96a88cc2799db0e2ec37d318b12d4bf9 -5fa9a7c0e8eb9f88642e19b7361071e2 -51f7b61c9921fc7e5aa3400ad960d53d -0e9cfb992296aee33204d1d3e9916321 -9810b1cef4c1821ed9909a6313cf1fd1 -f3d23379be8d4c8b6b802f705b8b5389 -d41d8cd98f00b204e9800998ecf8427e -a0818d60c6be30ba4b2674df5fea75ad -b88c100ff05cfa1af092543bf1f61bb8 -089f6d1e79197140a55a05a958142387 -2ff7a61d2bbd8a04df03c8e5a694cf15 -f4483404356faa91731805a543968f49 -f2504ee0583ce12c58aaff9c569217a7 -35ada07724a911510aa0cb2f20b9678d - - -c9498d80aaff704d6dc9cc8703a7d4e9 - - -e7f08d9f0c21f9f57cf6a47333bd221a -43bc0fcda05ae2bddd4daf5a07395889 -3e388f0f6a16e442d7217f7f5ac0ac70 -c49bf80333dbffd2ef9aeeb9ccfa700a -956a9467791544af1691056173191f19 -2d5c1290d23edbcdba1c5425bf16a0de -f93e4f18a8515ae7c23e5e6509fe7327 -4ea257c73e8f5c6c12fd12d154e5d482 -e34146dc177448781e5f71137230f06f -ffdb8c9ff721c1dc405c07c27b06c44f -01e4f38286a1328cb456ad497df0df84 -df30cacec99cd536a46d4d710d4cd0d6 -7a9b60008090747570d184f6185eacba -04fc9d2d2d778a1c51f7602b043968b0 -80a5fa615caaf397e32a2ca096814061 -33acf6ed14eeaa977790e7123fae9d1d -331b9a1b7b9101c7be2f660910e6e001 -6f45f24d2c2847d3be377ec767ed6740 -d4dd559531b0440a1ea9244340e3def0 -93e655e7608796ac9d75390f82b58d19 -74f4000b96dd405ec94f8fda2981f7ed -57cdaaa04cf6aa2fe0e9cd2c3b039f99 -0bc993144907f56385fe151e664a5940 -a44dba6545c02559a2ecb2cd96a46fe1 -cc7f036fa37b5f518b78570821a91d1f -2123bf0843c54410a6360155c292dd07 -55ecbbd7019bd1c65e0338e30e354c94 -f91d4ccc0c3346a1d1541271fa945b2f -ddaf35fb0f5f6de35551c674dce5af13 -c31a9db4f598a1edf31700198ec50d26 -23d92cc0b164d881a2872cbf878f9aea -05361076eb73c940aee3a92fb488289a -792f95535c7f2d242110aa879717cf2d -5993a2e0b03a08005a23ec0bffec49aa -e9769936000050d61aecb36ba7a1ffcb -66d9642b28c9a9f7ea35df000e6637c4 -e552713e4d8746959be3840562cedd4f -afe6a0affb85e6afd2cdc8608dfba913 -be8e24b74d91c7f072a83125fda2e9b1 -5f1f96b69c23bc6d72f8d7720c5de271 -89feb1c83c324e468f77f547afd6dcfd -3cc54618412944027a27f4d573ed0b47 -c8edc74a6de1527d12f1552554b3965d -5aae4c3d4f831d29c58fdd1ea90b414c -9bd382f432b178b65ec6e8f34438806d -aeb2b299359fb35bdea35fa92ea24da6 -1d88c537abadf776846ee7004edd7528 -a10710d2b0e460db41c63198261133d9 -419a456a86c786662a2e1258ca40b7d5 -7cd3cb27cffdb26ec9bc893879022fa2 -316264e658900c47c263e62642485e1a -8341937457bd3fe384540c016f44ff79 -289e3a21483c34cb3c7163a0b0339048 -5a8689e206254ceff9af7228494442f6 -708fe2c3b7aa7192e8cec80f5fcf8ca2 -3a981c259bc9f2329c96ed7419d096c7 -54537764d66c82a60df8647121aae302 -3009f0bd6501a7e643490484aeb4fb7a -8da0e7aadc18ba23942146b0b2788fe6 -12ea19cda7f7f76dfb852ac21ee8121d -7a5b075120da6d2eed41cb179255794d -01882be75b36720c3dd35d483f0da9b7 -4624db3734b1e0d2d2daf2e1a3075de6 -4b47b691cc2ce2801de96d512583468a -dfd395e63be421047109a6d2d50f8cb9 -af9aab961fd64d502ef4c6c9037a9e33 -bb3cd2dcbd5d21f1ca284ffa1ad07831 -aabdcfe7e06c7512c2b386fbd477b7ad -98297a39a6394970272a8bdf37c2c467 -b65d09069ec446c0014036cb3fdc748e -a1cb56d5ff9ea5a9fcb5f879460f8356 -000a9812bdcde8014b7b80c58b98452d -d296cd3a0c82798fa66d4442b0514c65 -b4cda49ef47c67fda458c6b7a187d219 -6aaa3a31de31e3a5e9e426364a6d750a -a8dcc9c1af18986c1de6eef93bd9615e -eef6f3da813d1d13c22e834a01269715 -192002cd9aba7a5237f2ec5a8c8ec267 -1dfb81be162137cee56899d3747d3918 -c226e7caff0213c3f4a60d70db7ac5ba -18ad47ae4370502b626a9c97da302c98 -5148c1862c4c06f8bcb22146d8ce0bc7 -29e38139f43d33ba7cc2ee457fe52628 -a1fd4462ddf33d9959511b042bc85d0f -a0c460e80ae4880e9c1c32ae397503a5 -dbb6d599916edfcc0e69df3ccbaf11c4 -e1e9cd63c97e490b1295848e3b6ef08d -b5e3cb6ffa54daa488d049b692ace165 -9bbc219ad2d289762be4a42cd4156e5e -50c5e7bb6d90547b30c88a38a2d10653 -b332396ea15d7546b048f5ccc42e7104 -6b88763de381191ebd21b1d8f815eecb -ede909c44382b72a00e182411787c9fb -872db466b81af407670160cf7305b3c5 -0f8e90793a5d0075ddd55893d5d49067 -29da23f210ded21179562ef771e281bf -f05b20cb0d940946b92d336b3ee16230 -72c68a77f9cac4ede5ea93a8ddcad43c -6ce707c982c104bde6300faf6ee61b14 -89feb1c83c324e468f77f547afd6dcfd -231be9007edc9432630b44369f2d819d -44f6219f5d9c34527a71c0cccb2306ce -997c11c97bfa8a076bb99c3f0b0ea340 -e46207a40de4c55ebee22d22758c7f07 -c25970d4e32e1ed12911ac276dce9f1d -560540e2be01c0ab7bf34283ad36e8e0 -5becc14b56e314c5f35e99cc6eac3457 -2ba292598dca941a2acb16588a729569 -585642a0258d4de2b55bb520bfbb51ec -dbea0c8432a121b189f443ed553ac590 -4794032e0a29bc4b968ea9cb25dead45 -11e6ed8c7c12811fade97c7fc50d23ef -692688f55f454ba43bfb627269347df7 -65f1c8f81f6ea903dc7f721720d18f8b -0531dafd783b28ec7570e6e1a311acc8 -efcfaeae59e264f27c0a046f83bbea3d -6548fec65e29cc9437d7a69750d06a0e -b8e083dc6318358cff0019d29311814a -fa36f20b7c0d398fc4385c6cbe00c20d -9d53f377d19984caf020df658621f38b -e97837e90f79a8c3b9be2aefb707c986 -9b8ef286299fa6cc52c9c1117dc116f9 -130022e7f6155c7feb3a8805eed1fa17 -be2a5064570cce93cb27f66e6c63a450 -1b21bcf3a31e16eb01575d546a8ddc73 -ff9be4f9f663192885df9ecbeff2d3f6 -7c966e0ac8b005230d2dc6f9c2bdfb4f -b5b6c4d5152b8fd193b79201b70dbf4a -e7c9ec2d12913127c49c73ee2a643515 -c69ae88d065c858479db70c93cbd59f4 -448fe3d8d40dd9524e92308363fef9da -e8066d5925cedcee8e287efda7be0b83 -a84b4ac562f48fa0db41bb9482328faa -2b285856d7f32d4c4c9941135e983ce2 -90358cba38f3616a16ff65d2ac76f94f -2dfb77eddf39f9fc6de5677f5070d308 -05d984d940df2e0c8e95726d1adb0138 -b6167341a2c1b0ce52edcd03353dd464 -04b609096db2728072f46ffc835a581c -b3277971df94b3cbd68f45e6d7078b91 -8233503381ddf79b86cb6f312f4aa4c9 -a1fd4462ddf33d9959511b042bc85d0f -3fb04ae5a52c47da617faddb535e463d -06bbeb64c794faf5a9506ead75159d9e -fe4eded2e82a49e7eeec04a57c0eaaca -a6a731b2237aaacd679c87fbc30952ea -99884a8900f579cd62619119a011311f -940ad1b3ad78d603c00c6fe0fd29158f -73afde9ef9cae4a2c17bee5094028180 -d3c4da9f47d4872f8c5c3743ab162314 -fd785e8184d91ce160641378dc942792 -f5c80364beda6369b49e6af373c21588 -d4b3d1f5fc991b0582f804eb4478881f -f79ff4f531fe57fd76a48b29edd49ff9 -e7d410ae84757632ff7fd39171bdb36d -a1fd4462ddf33d9959511b042bc85d0f -eb1f7b820126acf733ad86f742297ceb -49fe0d286d5b87cf808bf352e5882b01 -e7f08d9f0c21f9f57cf6a47333bd221a -ea9cd085245a4c6048bf654b5833a3e4 -15cff0d1924962e116bd0d6bcaf12bc0 -e2c40ec99dea692cc920781b8a25bb9a -357e70827abcd6e1b13e310b22a72cbe -89feb1c83c324e468f77f547afd6dcfd -1ac6898f550c88000b9ef9141500ab87 -377cb88037021a342c2db782d3718564 -40566fb3b79a6a5857623d1828e078aa -7cd3cb27cffdb26ec9bc893879022fa2 -f90a482881b094f398cfea3473bcdcb0 -2bb6eb2d060824aae199568f54e00503 -206236098ed73e7c9fb4f76c4ec08ea7 -20d08112c34bad25f91560d50ab42afc -3e287254af9d483cc20dee24c615e38b -8f4b85af8b4e91a099a99ae6add93734 -c3dde7f9f3d18dee3ffb87074c27cbde -8feb74c99d8748eb7e8154762c615561 -0fbcd2cf77d097cd0767ddf31d97a062 -8413bd4ab3429ac93c55e76ce9ff3ef0 -9cf91bb999511aca9c64f1960b7e5347 -27b26796c01e90c01be2369a04026d60 -dc332a44414046c93eefe7a804c155f0 -a34d4ed87f508bb060c12b369543fecf -5103ae9bde7811dc675132d8ea32b57e -4f92ebd3e210ac270c9d4a9e8e8ada1a -d41d8cd98f00b204e9800998ecf8427e -70780d43b2301396dcdc3ba883615534 -063fded4fc55af7113065bdb6a6d13bc -93add805d11b487204cdcbf396af297c -cfa4068beb4bb0a04d95faa83d490b1b -d274b3bd9ab6cbe0847492e09bc17b26 -d48919324ecd66c95b4439d87903254d -f94d172647e3462d128294621a43389b -b26600b0e4fb912d7a7d0409d98faa63 -aba9db6d3ab58060e1399c434c169ae1 -48180e06410b3f3d59828a1d2f3908d0 -723903d5fccc803cf724c2bc68eb78f5 -ca82a0b827867d8e25b3222842fc9290 -85aea855ac1f3e1011d2362d3cfe59e3 -cb4e550f50734e444aef59bf6439c1a8 -67f5efd3f354d95140a192b2b512e417 -e7d7ba0591d03fb54886081dba55842d -c8d0c70a5fecee469664a73b21baad7c -8c47d4eb5625b0fbba21f7badc7e9694 -941fdeaadb5826f363cfa6e480b588fc -30720d9dc4dd6183d098a1ef7ca6a515 -4649a28d1a99856537807f623692f5fe -c7fd803906579e2870c37f7c6dc1f287 -eda152bd86c12fa304b0d489d61f8f00 -9e866e4d54f4d332f44de7f26bee7758 -ac382f23e177acf31f79ce371101769a -cc2c1ba385841b4e57e7c3f8d2bcfc52 -99aae625b370db00c75bffa40d22515f -af054e807cb59c2a8862618cf8e7a120 -4fdaafdcf368b7a90527e8e8c5dcf541 -31ea4b1b268235ac09b462eb15c1178b -712730dc8eacbcdde49e3058e87f9453 -3fbd3dacb5989dd794dab5ca6ae802ba -4c811494c0413f7ee4f513c2f6622914 -c79db6af25efa8e7d808c5c3e824dc87 -b04e6c6785146e49bbf046137761016e -4a89044f17e6da2ebaa0b323cb3eb547 -e11278e9bfed8b1cac83f3c09ad6d175 -60087a56245dd11337328404dcfd9b68 -73e6adddf2467b4c68caa18c8d6d6c67 -a65c16f8dbdf88a88822ebdee750ffae -7cd3cb27cffdb26ec9bc893879022fa2 -0925474a60a7d087119ae966d5cc926d -35df884aed8ffc1bd04843f914bdefe2 -57e8a47fbae98efe3ac2ecebc93bfac0 -f9de0a1fcb3c19c973e382e65fc31c4c -79bcfa4d08d9b0480e45ce8943500b75 -43da1a13de6b74b229e87f2254901eb8 -cc986d5a5621587f7d86cc3d60338083 -774aa5e83df34cc3f91576854f011220 -19bc9d6e776897451da4a42998962117 -dc4ea9364d8efb3881905f68d1ba016c -a4747d339b09c350f180530593b4e446 -0c3ae02d04c3fc7100c51aac8de78822 -4e2233388b4cf5719ece9d5e4d8ee8d4 -4eb34d5348d9f867cfade02a16029422 -ffdabf9c9d9a11a4e1070c3de6565306 -30937ce4f4feb25d781acf8f0d952308 -64c80bc09a3568badbb471e4d7a8fbe8 -02ab79dfd7f51b02b60b860b7ce8afad -d24f6b1b1a4167bf6d452edf43fc43f9 -03e1ff43ea8046535b3a1e28d2a3d5b2 -70c946e159dbb8bff23b0074ba847a2c -5b998f19eee37b6e4b48984a2778a6c8 -1247fc5abf94f9875f6a322242024412 -00705230d6d3a8a360cf4ccebb6b4808 -48d1afcf90739c7ac285fbfb9a442f98 -fe1a4f8260d6f21ea9f9d26ec154df59 -15e3b3359f5d0e64efc557727a57bdc2 - - -73890f2c43db03a3ed7c1f1480a7f2e2 -5e5649ad914663e345a5099988dbb88d -d41d8cd98f00b204e9800998ecf8427e -6ade7ce02d0e1a57764ca09034e581d8 -7921881e4e473d7284ea741addbe8810 -6151a7c4134040854886bc5006a0f7c9 -eea3e104501f53967997a20a03fc42dd -71a38f6508c64163437075c7d5b717d5 - - -8c49590a520575d276b6a0326149e776 -a21c063e3ce67f82113249d9a321033d -1c4e7445b1d02e274233de0d43ad6ba0 -35e12c8186c66c2a2f67846325c4a8c9 -fa410dbce8955725b4c6f9ca7a295498 -8e011d62a02604e497d41a6b6d87f201 -0e2b3241431a43eaf252f31907d318ae -e22fcce83c8d8cfd111e129a3acb8b88 -f8e14f44ebadb45a20922f45720e04db -ca177a7f8289f4ab89dfb86769b2eeb9 -9091d512039b8b0e0d8b1a70c4766078 -fc0b12a212a9193b26dd98d1755b96d0 -3251c14ead0497ba25cb9746cd1abf52 -96196defc1997cade2eaaead0ed86ea3 -a54e48ba4d68b9b2eb5152aa011f2093 -ed0cc9c5c5e4d088be7a1755f07c0bde -e59bace8bc73863ae6abee0fb8e17801 -b08ede2bec19c7a91a16b7320a571c58 -c2f13d2c423baed06d1d6f417b009087 -472f9ae9fd09507ef6299f2391bdbf4b -2cfcc31ebd3600aec994a764e357639e -2056360fe1539188c7e00a09abbc2153 -4606fbca4fd91f7c6782dbb86e462c12 -daadeb6fd24e65df65a8c4f11439927c -c0e8485b73819e041f753b23c7690305 -b08ede2bec19c7a91a16b7320a571c58 -704437bd4ad9b8e4f312cb61373555e6 -7fbb218c536d691c6b2d56009f9dadbe -48703319438cf8bcf4a083ce75582d4e -c9569b7d83a6358e34c6a24e6eb3745c -3ad6532a0682d64f0d1d65d2ce9202d0 -52d88dc054798f7076bd0a0c174818db -d4392a1e9591b20a9308663373478137 -53f8536dae9fd7ddc59dd58e604755a4 -3114409c3a14acff26e9d052a2b345ea -d41d8cd98f00b204e9800998ecf8427e -a3d47f5cd664929981c1484d55115ce5 -662b61d9e2cd1527c749db30c7a84c5e -961aeb631f9a41e8401ec7f18a868b3d -91d7393c46a5a613836330b0f075bbe2 -67707f51c299f4543c60ef1bb6c7cd45 -2dfe1886aaa2a005ca58b3af4375e404 -73c70503cf2dc4a268877aba2bfd95fb -8a8c2bf8fd9bb11318840ebe0fab16cc -01a0efb84eadcfc47482e3f36eaa6bdb -46b9db57d6e0e660bb43663c34e8e183 -42d09f0097af4f8431f883bd161bff25 -b8b49d2126b4a75840c876c0175da3e2 -3d667d0964566c0952c7159984118bc3 -fab2d153ebc8fec58518da89099a3ea7 -f1cb6f0bffbc3ca0b63dbbc51f02f5b0 -3ce4d9886ebda3d54fd415961d616cd7 -7681cab460ea47408a4b60590c3256f5 -e8b1b6347c5957cabedcb3318f0178f2 -33e3055c8d99a0e108e3dcfafe2f02bf - - -22bea718176473ab099137f013a20550 -d0ae25b71adb33404ed64bd1a131bfe7 -80c455a0847b726d4feef02c6e21c98b -588128822d625e390a58f56f3612f907 -7a4337ac238b6eae1362f898c65b4e1d -be4d3b90a08e3e7370f81557281f346e -beeeedc3193a46c108350c79c818dbef -228ee6ed67369e1632959a3b26568fbb -8043b6508f6a876a0ee5cdc266238c98 -62becd9604eece6fa4ebb00625ba0e71 -e4f9546a7ec7b751aa49620aecddcb6d -c25b136c1cb3bb145495c25b35d93754 -fb07076002b84c04f14f19c7cf6fe332 -1d488d377762e65ab4e8b691ba01e5a4 -6cbfd3ed29531044aed9b4edb3cca9ad -71b64eb90d9c86236748d5cddcd936a5 -851fb8cacaf19c098bc7fd339797948f -fbd3929a893b147ae0940d48d533e023 -d41d8cd98f00b204e9800998ecf8427e -3665b03f0b6b099595415224ccc68285 -9445d29997b70a66fbf5e9430db2b49c -076db93d2f21b03534bff93f0cb68d33 -564cf8498bdfe84aa464c7c93c384f41 -4edfa5cd18f12847054c5a603c345c50 - - -65e13576f2fafd29cba77fbb3d81e47c -6337a2b8215e8045c73c165d1969afae -4e2c6546761cedd8a8a3e1419b42f78f - - -cd26e28d19227f52dbb7af6285f49684 -5e83bbea91f6deaa37b247ac013ef556 -4ab5cf779b6ba8737731bd949438e279 -92e62681dc53e8a32accba6846001552 -fa5f8193240995285a30de76a124744c -034863b5c8459093e35c529af988e293 -7c7da4fdb0743389e825481f72db8fbf -2f8d8c187982fc14d5563c7bdbc43e37 -6ca183f901d31980b285e187778a82c1 -bdca821b84171d36d4ad692ad9c11742 -f2681caacd54b4b43912e489c678a3ec -f6d558ae332bd91dea66be7e702e7ed5 -cbf00fbe06d62b8503f79d19005b84d5 -cd4aafbf96f9ca00ec1ea45ce445273f -e605e982c1935f82b08f81c61fa61b3c -c376d9324174a12063c9177dba2a456b -ad13b311bf3894d1537bf68d32120589 -f933a0d4e4f4a2f465d48977a62f71b0 -f1d99169e9f6f6e4880a4f2859b53858 -8475cd05414226f2ff20ee97df8bcf31 -71042cbc4ea8acafe754fb436feff958 -a174947c846b0105d6556d7497e5d2ab -dae6f405639ecf3eea0e3d1bf52936f4 -90eb802715ce63e5e3ca4a55a42b8397 -8bb0f71417f315eb04c44bf1b07dd157 -92bcad6a72829412e19818ac23d99c7d -0f35131bd73ad43c77503abbc9b8219d - - -c797a7830343e4700562dc7f4acf1f02 -5eca57a0b130d1f5a4cd73d4053f44d3 -be8a7ee2b863d701cf8d379676d3245e -d29432daede0438dd797ecdbdf915015 -038daf9b3dd4ba6f83911814a80b643d -1a940cd57dff03f0f9f8ac3513e816d1 -bfa34f4c07c482fe4e7ec8f2c13e8d08 -45e61dc0820ab58a6097c676507874c9 -f6858cdcdb32713ba80d87cd99257e51 -87f5e4a61a397aeffc7d8fdd96673988 -b0844a2326bceb13156ab3950a60b7b3 -3c22e69f2f2972bac1f8df3e48f0eb52 -88cb6b600eb10287e93e27079ab792ad -db6df0c5e4d7490f31a4e9ecb6e4e958 -40a032464455dd72235e79afa94beb15 -249398348c5370aa367828a1261e823b -2c92545e15695b5d27839c7662657ab0 -4b0b0ba3958672efa8a88a275a5615ee -7946f4323bc05ed1418e7b056ccbfb4e -e296916aaeb42ec20dc1768f076ff326 -7cf564871684986dfe050a9acefab1f0 -75744ffb286ebd32ec6b56a8cb86a2e1 -ebc05e1e66b1eb6dc5a6bdf27e2eac01 -c5b2fccc94d752d454472d6fe7a9aa3b -03561d6f159b40a276ae7eca3319970c -a79636bc2b90ad32bd15c9015ff17ae2 -8bcbac102e83193d933a2c936857635f -c85f0bebb04ba27eb017570ee8e36251 -1ee75057ea44ea31b5d2167d8588e39d -6271882092ed28f4227be476c54535cb -dbba0203d75b6632646e0d8ce4d94fe7 -d41d8cd98f00b204e9800998ecf8427e -d8386960c63e6b27895685c70c4c435e -d7e4cc99c44cc6add3563cb2ac5d16bc -87f28d57fe2a6d30d4ee3975ef4a25fc -4f1c6183c66d473cfa9a2e027f53908d -efaeb3402e4a2da275228cd5416e735c -82e00073816ed7e897c897db8eb5c32c -c4b077a4e3f7d8c58bb112c6dbe6674f -3afe38c6b38b07c3bdfdcfa982e9218b -5c528b3369644c9cfd8bab9a46de2eb9 -5ddea6a4cd5005e849f6f307f1d40928 -f6412834592319407d829327cf8f23c2 -10cb1a61683843039f3f99527f0447a0 -d956abc3ac4cac362a78ba0f2cbcbdc7 -6c83356f69563552d5d971e9f956253b - - -1e99a575dd2737b28288144382810210 -cd4aafbf96f9ca00ec1ea45ce445273f -53752275e001831a1aa1af926cbdfcbd -9e36c55b53a1b080066d9947a92d2ce3 -b2f4d01512267ce06fff267cf4136d6c -8a7351ef099da26bbaa63ade1ada8be9 -b97cd0ed145854fbc8b148ac0913565e -e80502a829c7141deddf60ac87e42e46 -c4df95964fa512230fe0133cb6d83d2e -a4991dfd1bcc9681bd2dd5688f2e86d3 -0ce654c1f24e1190c6c3022435e09ea7 -8f120e35f8b6608fb34e38edf9a2687c -9ad922c1fdc252eb8e61dbfdcf32ada5 -f6c51890eb3d84defb470c9101e0e1fa -db77b35764831af0b616bcc87ccda46d -3b719c139541347e5d868dc81867d444 -12bd3c14cc3b96cf90d3362573d85559 -8816de8b6e1f9e510d6b37002b1981aa -a346bdb285fe8580f4b5b8dd5f5451ef -3a186df0e76f4b69fa549fe809aa77c2 -9b143135252fb96d644dbc11c8bb1978 -370330c7627ec45797aafa9e99f84762 -131e9c1492e737f2c9ec974ca6266f1a -618d61f6e80aaea18e3257b4d6cc2728 -dc1b29caf1ea591b1b835b96d3869db3 -cc9d3aa2b9dd98d94377e40b25935c24 -7714b390ff497c388fbdcfe8c0563790 -8ace5113760f987144f54425afffd195 -10feed256eef9b9ba87cf7fa3ac0ef36 -0ddff84d392b7fa485c6e47623f9885b -1b474f0760ef6d41e1ab690197d6c3b4 -2a2a087b71d3730e58954da48d65b1e0 -e5f6f03a4edf8b78cb561640dd021ef9 -a65c4d66168635b87ecbc720e2a50703 -dd1e24b1fb6cca8441671b624b5785dd -351226b86bf32c35da86bc84d37710ac -d5f4a934ec62542d5273a41e8fbcfe24 -c0bd3c7c4e7d1c006b2301eab5ecd948 -bf7304dd5d19225b698af27eff949294 -8b7bc49f97c95c9d641d3b3c72ccf1cf -fb0e617a4e54b963f7c2139efa874d10 -a9e38adb81052e1178a2486de8a87c28 -b72c3b6c763f26a3ffc3c2d6c0f6d49c -4b1644100e7aea8a79bf8404381b8654 -4af4f260359b0ce9c42f77ab47caa6bb -d345a084df9b7c46897877130a475f22 -f2930d262bbe944d1a7850e4a18a2e50 -c2664fbfabe5322a1a136ef9e6ec28db -2f7a8a40835764d2d62357e2ecbd1d28 -665abcd595667e221eb5bf99589f8a05 -4f37eab95abbe47905271558dfe2582f -6f1285c463f6d6fe42e39f34d733cf2c -0474bee65715fc6918a92b668178be6c -c6a9a7d9cc31a6f650c60a8012a0d0d3 -c5f9a0849fc60d9d903496e6752a8961 -c64ea6bf2afef2560c8b642972b04663 -4a436addc8ecc176da90d6f8e7ca0a8a -556e7abe13d8106bdda27be2fa1b6613 -2fce4bf86219c914595c178c2d7e13f3 -946e88d5612bd35d2f9297a1419ba62c -7c7da4fdb0743389e825481f72db8fbf -3d64316fad587349e5d9dd0792249162 -2f1531eab3f5b51c4c6725608f4eb456 -adbd23ce0f80d78b794b1bf265c21e5e -bbf2ab3fbf2474796961f01fb3eadf10 -79a72d08df258b0ca33c240c1d7746c5 -4ee61217dbfae0266feb5345aab311cf -4b1644100e7aea8a79bf8404381b8654 -89697cec3795e0df248044ce53e74756 -28d998536cc67795eb0812a1e4c5a6ed -7389cc51b77b11b297ccce79048a1c7f -9b70d8debaa8065353104c699e328325 -c6e27842c8603e8d0679cdcef7cb6504 -810dab21a178dd4bd8acbf6c0741d2cd -bb1be9c660e554a43686915f1d7f021f -6888fcb054283b54a92755d30b41e5da -9d3d0f55c282fc3544043027b119cf37 -445b34b4ac5dbd8cbdbb2d8d52656cab -4b35eb7636936f48c6d40353135af307 -752f4b5e92e81b70cae0ddc1be19e468 -3de564ee11be8e8c77599abd1e3f3b40 -3f75ac05a676ab5c90483bcea3b7a6e1 -81707b9c0d2bcc9c4494fe861b4fb962 -bf803d2d0ea860bbc5e35c4b6decc800 -bfd0bf42e6473229d91e07d0b3f9baf7 -19e9a1da7c2e79b9b4d18cb4224bf018 -47b54d44fec79b69f1cc151a1b2a9a43 -c48848adc73b20b6a2e52888c8a7f9f9 -e3c2928ed3fdb5baff03efc59a6d35ab -d41d8cd98f00b204e9800998ecf8427e -6d76981b87d6b8f482aa5b3950f172bb -2e0eb0e3d978cfc35b462a199aeded78 -7d389b04b1d62e932d0e2696c7e68e9d -05681d69a9d1601e222762698c9e95d7 -e7e6b8d7a9b989619beabe01cdff3bb2 -d5f4a934ec62542d5273a41e8fbcfe24 -9e36c55b53a1b080066d9947a92d2ce3 -7921881e4e473d7284ea741addbe8810 -bf5474e7c85243d85f6ce742204bb692 -35ea0b6559911c678cf7e7e6fca69baf -4d444d41aee1b2c9d54942654da1d042 -8376d641f582ea7fbf4334fe8ee54403 -03ffa8f7c09dcea59dd5c89f136c7da6 -e1d238ddd4e573b085cc34b028b24883 -115c4806f36aeb531699b370720312c4 -a671cca2c79d9135464aa9f41e78b026 -aba33e5e98071280db0d34c42349f1bf -5a8af818e8fb9bedeb55d5cf3427e2ce -826b0a139421500b614b3302c87738d0 -619c0c5385acb19c1fc066b3ca4ea883 -287ac7dbd72c235345b20a09e93f4df4 -c5e70aa4ca496434dce0517017aa787e -c0bd3c7c4e7d1c006b2301eab5ecd948 -1c1dfcfd97b07cefb27d60e989f82427 -6151a7c4134040854886bc5006a0f7c9 -c5a1b32584b43642dcd623f195e146ca -136042c53e8cdcd5c877a55278b800a8 -1c081e65c1f4d55f0874c8b3e21e874c -d3dffe4a4ad4030e443985fa8ae1a91b -d2e1f32fdfd8eed8580f1b72973330d9 -e5f6f03a4edf8b78cb561640dd021ef9 -fde64db4462dcd2dd78d40ac1e490286 -a03c8d2492d0ca2404593ec71b479eaf -85d404bac8dce61b4c6aaa8023b3a56d -b57af4b9947810d411c878d3e9caa276 -d5f4a934ec62542d5273a41e8fbcfe24 -d9e0bc0764b65a6d2a0515c80c52314c -55418df59f5b95c989be04f945a0002a -767c14923c466cadc2b4d21941ea8f59 -a665caf39101bdf12f66bdbaea3c1e74 -e8673277dd7383120e5f9028d0caccb6 -b3ef3d72a6836a5291a0487307b5d8f6 -a6212b5e4fec967f17c519c9c6ce0171 -60805f7fdcc0a187defb87f4ecfd9bb3 -a6879b7e59ccb7926635047f0c736b05 -16f911dcd53ddf0a2c59fe6173f892f8 -4454d66db639f71ab544b163923181fa -41d59efa00cc27e8df1b147decc0ee2a -80bcf9c563ad0391642045dbff06d419 -7fd720194f42e7c1ae62927d6adfc046 -105926bd2146d9d2f96c2f5650591a1a -0bc1e68b3aef15b66b82bc1f4fec9a02 -8038e4775316d36b154b2d20f8eca0ae -8707c43fc89f7fefe22678f3a25fd20c -4b31ec814f6c455fb7d72f4d32589b3c -cc9d3aa2b9dd98d94377e40b25935c24 -739a60ba606586c88e8626e558f16807 -679c3a5f9bbbdd055430363726db4664 -2fce4bf86219c914595c178c2d7e13f3 - - -64ddd81ea2b2522ab666edb41a4e5863 - - -7a5f2ac8e3524c67e9a6c30a72d06fa1 -d41d8cd98f00b204e9800998ecf8427e - - -d41d8cd98f00b204e9800998ecf8427e - - -fca0ccbd4ab10bf1a16f9856eaaf88a2 -d41d8cd98f00b204e9800998ecf8427e - - -ed715e949601b59d8aa1cae4915e53d5 -d41d8cd98f00b204e9800998ecf8427e - - -3316c57c8a935bed1ce95c87f13ac8a9 -e7bf791432a8d6cd23307b92a1c8bb2e -584cd14f26ccd4871edceb116f00d826 - - -18e86d815977d05210bde25bdbe95f99 -e046eef32f98374dabcc7bcf93e1c458 -80ea34522ffdde39df621f74f8536706 -96e5cc8034742e399eaf6d29a5bbff44 -3c87509df71fb8c41cf31fce258bdf11 -700b5e229fc3df9a79ac5e32184ae560 -5bdaea0c03a407c6cd9f0976674451c8 -6ca183f901d31980b285e187778a82c1 -44bc863e69f5199f55a3d5b8ab76d1b8 -817f1c669dc80ec3b88418d9a1de1faa -5646544e739cf70d2a716b8eaaac088a -04720837e9a79ca6ca6af767d954231b -e605e982c1935f82b08f81c61fa61b3c -1f01f59979764124448840d8e3664e99 -80fac46f6e4995ccc5d57172d19da940 -f1d99169e9f6f6e4880a4f2859b53858 -8343464f7cebeb9f11dc710e123929eb -a7b15b8c036eac534611baa3c3812fc8 -dd5dba0413ea60a3ed433fcfde0e067f -74aa63906a70c296b099a83a54d050aa -209c606e619e5d9bfde03b7964b2e58c -5c23baf9f9eaa8a5220d5e44e68a9e79 -b9e84e2be4a774fce11c19190e399892 -b0ef50657bdf39b274b8001cf04f56d3 -3539d020cf07e76dbb34c2b2f806a318 -c71eb22739f1c20f5e01d9e6b8a19125 -2fc34147737d9a0216f49ea04c64d883 -5c23baf9f9eaa8a5220d5e44e68a9e79 -26ce8e4aa288aa38bb10865675d08cd3 -bfd7c7727b1f434510cf197d27d75895 -c2f816d0775e41583bab8dd232c4543e -aefe79f17f49fc74ddc7af2f78c2eed6 -395243ebd988a0f3c8397d4263322197 -656d0d3d0affb188761b87b55c1d4d4f -77199a3c1980e839a1e6fb305c691f67 -249cca2afef9ab5b10500d3f183acddc -e9a5a0da7f023261dac8a651c3180d27 -9f88899802a65e6b0eedc1e73fe4c9af -d7fdd00204235a28376c74e5c147c416 -7178d620bb970d5b1c9b337ec3fd4ee7 -33c4116fccc3ff06e1c82060d90c1aac -e5488e9dca86b7ab4b9262bd8d902412 -1da8850516d4dc2b70f12a878d6fd4d6 -8e9817e29da34d82aa0ed0a22bf25c20 -184892aa2d028c58087c6b1a3dfb4176 -045a50f182b7174af42c3d67492abb35 -46c16b40aa8611932a4cf9d2a5cdecf2 -7714b390ff497c388fbdcfe8c0563790 -06ad1905f6c0eb21fc7e5d9f2ea85897 -58f730f9515282ae9c2f193720b06c1a -5632b97f8db47b036a61cfc515dd685a -dc4a551bab5b102e1ae5dae1765e5ebd -88028c932d3ec0eedf2bbf060859b832 -402676b50ec901254f7c559fa14952a6 -dd1e24b1fb6cca8441671b624b5785dd -fbbdeff35bd42e8a5451af28bdfb7f85 -c0bd3c7c4e7d1c006b2301eab5ecd948 -7ead8fd89e3d36df39f57e85d8608aa9 -5089f53c8644f49a4aaacca03657aede -6f140c1e8e4f1da9fc3dac7cc60d6d0e -10feed256eef9b9ba87cf7fa3ac0ef36 -b5bb7147b7b10e98381c5d852fc9bc09 -adcea0d1b3addc074d69f56f89874220 -24b6cf2901fc39dbb560d3a7285df809 -46c16b40aa8611932a4cf9d2a5cdecf2 -a25cf5c9d33530d9f64a87fd6158f808 -eb13cd08105de7c114006ebdfee345cf -39316cba629dcc3ab2c1358f99bdc441 -9728bf99f96b44c2f09c2e03a8169033 -184892aa2d028c58087c6b1a3dfb4176 -211ae17d31849410f76fbb9a61958272 -21b6ec907d91d1b24f05fc12e4ba544a -0138cd67a5d8f6c45c91a89965af4517 -c15c695089d04360c277f3388c347964 -dfd7216140b53214e05b7afbcea2019e -5f45af7387a1f950e81bec69ccc6b122 -68fc31e3d3c0cb616be0cbe585a4fc95 -9f4702649068d30fc9ebf5d93d915b25 -069211010dbdf6973a5a635636c77e04 -5cbf1c11abbc61f829480909d7ca3304 -3d64316fad587349e5d9dd0792249162 -31264269b629589160d5c159e9301c6f -81b0e16377b3fb74b9b8ac5a6529a94b -eaf4e2f7a47bc0667929e7d0f1a3abdf -24b6cf2901fc39dbb560d3a7285df809 -63e15270fc3b12cdcdfdb21e5bf3c1d8 -cb4bb3bec53b441960a91ffcae8cfc94 -7389cc51b77b11b297ccce79048a1c7f -f72b01ec596197be77bad01ac6af6a2d -9b70d8debaa8065353104c699e328325 -c6e27842c8603e8d0679cdcef7cb6504 -6ca183f901d31980b285e187778a82c1 -1434a3f561a240f1f6e4d9da60b175f4 -e24c4e4dda0f2aab887b7623013d9d89 -b52f00b91b90fbb38d6fadda3aa156fa -d9698294981e058cce77824d8566be23 -ebedcfd1affa6c99dc1ee3056da59481 -61c9cc60ef9341b6d9b7df4396cc3e87 -3de564ee11be8e8c77599abd1e3f3b40 -b141c3d2a3e93cd1db0ea22618e5e22f -f87050f67c6a99dbde1f724a756ee533 -f7a3152e8f470a2c450b0f90d02c2d52 -79fd6aac5f40e3655d449e602def2745 -bfcf1bc67c5a000230501dec6f83bf1a -6e92e55632a8e9fbc63934919120ee79 -ec187dda16f6e893dba5752cb5859dc4 -74983831a6b03a0e45b2337ebc4e405a -d41d8cd98f00b204e9800998ecf8427e -231c3e883b6a69af4bacecfbed2880b8 -f5afc9b3751ba3156414a2e246de4d1a -f6230a6dad952d01c3ff0dde61abd51c -b4fdc3bfa6f873107eb0cc5123dcc103 -d5f4a934ec62542d5273a41e8fbcfe24 -2fc34147737d9a0216f49ea04c64d883 -38e31a8fe2f855915ddf43831fd69956 -70b64d3e4c4df1c3fc3ce1ccdec84c8b -402676b50ec901254f7c559fa14952a6 -8376d641f582ea7fbf4334fe8ee54403 -7801b4dc9a77a0f381b38e75ebb17555 -eee919753151d6e7bc3e602f1b33caab -3e15daa8fbf0d26ea41f0f77a8210d04 -b3a249e8c5ca01d1fa6abf52799734fd -b3a249e8c5ca01d1fa6abf52799734fd -64d94d9b591ba74fe34acdc43f4f0cd8 -e708e33599499c67f77dae22e8059291 -7801b4dc9a77a0f381b38e75ebb17555 -b826e95415e3bab01b7842bc774e04cd -c0bd3c7c4e7d1c006b2301eab5ecd948 -1c1dfcfd97b07cefb27d60e989f82427 -bbaaaad3a969fdf2ff5a3c9c56bc7a97 -cf14e73ccf77ab5a87729348fe5f0817 -eb13cd08105de7c114006ebdfee345cf -1d6f5a7130f379edee3d05617954bfde -a67ffa2ce31670c0084995a33ffe69ea -be1afaebdbd273f8e7b3513e55062d3f -e4801ed3c2784c90b72daf7ac3f7c199 -6f92cd4deb7f23310cf1937b8a707c88 -af408a99d18343fe39335a64aebaa721 -cb1832b4f5fad4d0d1b7d4a8f002b489 -bddf314e6c49d62975e7ce1a98016f27 -a7321a0a32895a3b6a04b458da311c83 -fa603d107cf8753b24f4d14c0f87fa26 -656d0d3d0affb188761b87b55c1d4d4f -f4f33b11ea2cb226c62e1bef772cb8b8 -dc30723e9a013e4fd691ff5e3455526e -a6212b5e4fec967f17c519c9c6ce0171 -0ccb504a5d257aa989789f6df3c51fed -0ccb504a5d257aa989789f6df3c51fed -bbc9e0eea1564653fd34112a84a9d11d -b54bca6771c1ca6677e21ac8f439c3e2 -8596a359d59ce8d05e9e1ff6cb9bf766 -68fc31e3d3c0cb616be0cbe585a4fc95 -74801fd5fd2292223cfb6fe7a2cbe33c -8707c43fc89f7fefe22678f3a25fd20c -46c16b40aa8611932a4cf9d2a5cdecf2 -1477f60fa99995d7c42c47777c01cec0 -fdbd41ee38f65a067194317042dc60d6 -323e98d0535d615c49de20b9e4f5b0ce -2fce4bf86219c914595c178c2d7e13f3 - - -afc1b063010bbdfd5bbb77f32b9bab8d - - -5b0f6e75581aad8e74d8439706c4f20e -d41d8cd98f00b204e9800998ecf8427e - - -d41d8cd98f00b204e9800998ecf8427e - - -fca0ccbd4ab10bf1a16f9856eaaf88a2 -d41d8cd98f00b204e9800998ecf8427e - - -09ce82fd4e818461e7f6b47501ef80ca -3ff399136d04561cc27c3d9b839a9099 - - -3d50647505ab32beccc6587fb06f32e8 -340665046924f127d014eaa81f3ab9ff -e4dbdf1c44828848bf3fd792bdc6b71d - - -2da102ab12fb56c79783cd6b776ce9d2 -cd26e28d19227f52dbb7af6285f49684 -5e83bbea91f6deaa37b247ac013ef556 -c533e3d3e66811df956313981c8fdbac -ba1629cc343a821009875fcc3d23afb0 -d5f4a934ec62542d5273a41e8fbcfe24 -034863b5c8459093e35c529af988e293 -3f9fd57c66f10d599f154a0910fec47c -f4e4c9fdfa66cac3028c2db1680b46cd -6ca183f901d31980b285e187778a82c1 -34a3ff119b0f6f13a3cefab63a8b7cc3 -7791ec67383f276b58e5f8f3c32409bb -c8a144d7c8add753a44e8e8d55595570 -98cf56f3f039afe645291a4f8d232d5f -e605e982c1935f82b08f81c61fa61b3c -913a37ec8bb5444e2aebc3e37ac32f01 -30f79c75465c3f1e855a3130c1abb350 -c86760866ffe32b359549745a00f78e5 -6959d7207e6206827d65ddd355ba7506 -bafaa6d8e8c91f79ee22242ef6fd5dc6 -c7701209d9f6520754d641090de4ae63 -765e3ee60bd9940d57172336fb3ef5aa -90eb802715ce63e5e3ca4a55a42b8397 -8bb0f71417f315eb04c44bf1b07dd157 -8e9667450cc2157e1157e8785b367225 -0f35131bd73ad43c77503abbc9b8219d - - -f734bdacbce7337ea1b52b95b295c49a -e186597ccbb2c1eb388198d8d2a199cd -b22186030a04c7a208dd219acfe203c7 -37e28b4e4e22b80c1d39d038599e2dff -5e4cee9e9a747519c7ac8d53b72a1e15 -e0074fa750edf8fadaabd21713776fe6 -83063c2136d912f6cf89a173cf71e7d8 -0ff637bde43375a809e583841634f760 -ae9923bf8191d4cce6f6aff23d7a92c7 -6d28eea8d332c17dda186d63f9ae2206 -acc3f08c46b50f9b3b66ea831aadf3ab -9e95e8dc5850c73b8ced6dd0bca3919d -b6ca1dfb745e85d611fbe81cccd4da33 -22a1d48babdead60060ea6eb841464c3 -adbd23ce0f80d78b794b1bf265c21e5e -66657486b605040d066d0dbf6271e14c -dc22d6ec2bda0707404afaa8259ee219 -b9c630a949e08d2aad90b54cd97276b5 -b6342a142293dc8e125d11ea43972d05 -d41d8cd98f00b204e9800998ecf8427e -b2fc85cace867cd419febae19227a5b7 -ee172f657651ace5f45374cc6a5c3639 -c71ac960b798f1acac68b17b7fa6c803 -ea0cd1165069b2c5d4bd5916fe10741d -85a06666e72e0c9522deb1041e2bed91 -570463ed73e7c93d0989adca95a0d440 -97a2ce5955231c1b3891e8eee2445c62 -35df8b42457569b02c19be41abc87f45 -6e4ad58de75dcbd3fe83e4680d5a94d3 - - -cab0ab4445e82168d2cac70036925a88 -5d3b6699db4bdb0b80adcb87bca2cbda -cd4aafbf96f9ca00ec1ea45ce445273f -53752275e001831a1aa1af926cbdfcbd -9e36c55b53a1b080066d9947a92d2ce3 -8799fab2b7f97df4126c466511f7f88b -8a7351ef099da26bbaa63ade1ada8be9 -f69743db39fe49a61499e443879ce394 -82e4a2225d7ef9eb5a0c875f08b76ca9 -f061264590a29149c75e58a2430e118d -a4991dfd1bcc9681bd2dd5688f2e86d3 -0ce654c1f24e1190c6c3022435e09ea7 -77bde3efa7443489764569752b420eb1 -35376294d8fe982540141abbb4d1714b -f6c51890eb3d84defb470c9101e0e1fa -7df3d6c0f7590453f08e362b6ce20940 -f4e4c9fdfa66cac3028c2db1680b46cd -1ba2c9d892264fe1db8eefb1ecd3bb8a -3f933eec8c50faea176b3e58b18a3510 -a346bdb285fe8580f4b5b8dd5f5451ef -8c851baa2cdfee2a5db7142700b8653c -33c4116fccc3ff06e1c82060d90c1aac -9b143135252fb96d644dbc11c8bb1978 -ad8a6bd03901efe7f6d958396fbd5ad1 -109a2b54b09935f5a79b887d621533d6 -618d61f6e80aaea18e3257b4d6cc2728 -25c9d80f42b34d9dcbfdefdf50cec661 -f48adb959a22f1724228581645cd9e67 -7714b390ff497c388fbdcfe8c0563790 -8ace5113760f987144f54425afffd195 -10feed256eef9b9ba87cf7fa3ac0ef36 -deb4efac7c2229e79dfac38516e78fb2 -acf42861a59faad7e9c5fd30cd9cfd70 -1b474f0760ef6d41e1ab690197d6c3b4 -2a2a087b71d3730e58954da48d65b1e0 -e9cfe12959cf2221fca30764b9e335bc -a65c4d66168635b87ecbc720e2a50703 -dd1e24b1fb6cca8441671b624b5785dd -351226b86bf32c35da86bc84d37710ac -c0bd3c7c4e7d1c006b2301eab5ecd948 -2d042b078ffb9cf4e0321fe8a09cfa88 -64d3e67ba4a87e02faa08fcb6d92d628 -b28a87c8e679b0340ca2bb5e6bf5f6df -3f995da98d36a1ccea1ed8fec6b9f4ca -9e95e8dc5850c73b8ced6dd0bca3919d -275999a532356c158f19fd8a2b06d399 -fb0e617a4e54b963f7c2139efa874d10 -8786aa827e5b8b29badd2db51d893349 -e945c933045b11d928443a45decf52ad -7f073b1e3162a90d38273edab7adac23 -4af4f260359b0ce9c42f77ab47caa6bb -2862f528c2d606a7c780b75613b90761 -43926a83973951e9b41d8c0aab0e2cd3 -f2930d262bbe944d1a7850e4a18a2e50 -067a4741fa4798555fa9f528c95d6a18 -9fe6aca4313338fe6dfb496ee6a37745 -5a582fdea5dff2f52a79aaa101278172 -4f37eab95abbe47905271558dfe2582f -549e5f42a9f20bab9fc991b9c74bbb7e -85e75bec7eff5d20e41a993927acb5f7 -26b7b52cf3e0d7132dd00290a55a3192 -a9c1b094e5f90641184b3cedc1b2b372 -c6a9a7d9cc31a6f650c60a8012a0d0d3 -c5f9a0849fc60d9d903496e6752a8961 -3f4c833d31becf6c023f35d3a8140ca8 -4a436addc8ecc176da90d6f8e7ca0a8a -ec291d015307e2d4798886aaf95677ae -e2c4129a196854d4e004313b67cabbb1 -ae88fbbfc2db402d402b4a1644a06e5d -946e88d5612bd35d2f9297a1419ba62c -1c5563470e1e0a9a6d693d8b00133b81 -d737ad1c6acf2b8e9cf45c76fa750f4c -3d64316fad587349e5d9dd0792249162 -7c26f8ac117a0a43f236900481e8781e -adbd23ce0f80d78b794b1bf265c21e5e -d66f70a41b18322cfa60371361925573 -79a72d08df258b0ca33c240c1d7746c5 -5dffe1f2fb151b5ae395df7c0a8e7b15 -e6757cb7e9e8dac57b24af8395a27fdf -7f073b1e3162a90d38273edab7adac23 -1c1ba7274a1d26029bf89103ca8dd5f2 -7cce79ebd74e8f71ce17f811dee41f34 -28d998536cc67795eb0812a1e4c5a6ed -7389cc51b77b11b297ccce79048a1c7f -9b70d8debaa8065353104c699e328325 -c6e27842c8603e8d0679cdcef7cb6504 -7e68bc36bc8c30dd2d6574ff81f00a64 -810dab21a178dd4bd8acbf6c0741d2cd -f82a70bbaf24434aff018e689e86221b -6888fcb054283b54a92755d30b41e5da -2ebaedcb9d2d969084625077785cc38d -b15fcefe9e55b29cb20d1b1de229edec -ea3351e19d493e039b9cf39dc96eedb2 -752f4b5e92e81b70cae0ddc1be19e468 -de2022b0af088c7f59b35e323fd6a662 -3de564ee11be8e8c77599abd1e3f3b40 -80a22ab091f09fbc6bc59839c61ea516 -de73834d2af73aa83a4f38ff19761f16 -c39899fd27e0b323e6b1c026e9a9359f -6d457a2c2911dd34f7786ddebec78a4e -19e9a1da7c2e79b9b4d18cb4224bf018 -7d46d18692c2c3210ae658b71d6d95c2 -24b51f9de5784485dad0951515dfeb6c -e3c2928ed3fdb5baff03efc59a6d35ab -c17a32a624ef386aacdbc3a683f32048 -d41d8cd98f00b204e9800998ecf8427e -0fc42aae027e045136cedefbffb61058 -5fdd9b86b6f8470c71db5a04bcb9e11b -3a30e6c5fd016911b03b23ad8ddb7600 -5a582fdea5dff2f52a79aaa101278172 -5ff452c2f13647b0f60f9dad9ca3ba21 -00ff70d955ff73a44e75034c2d58204e -d5f4a934ec62542d5273a41e8fbcfe24 -5f7594cc680f9f8e39152b67ee04d492 -9e36c55b53a1b080066d9947a92d2ce3 -16f15b5dcb1b133a53de211c024611e2 -9f011bbff1b13ec5fd8307610210a91e -670fcc17fec05077d89269efc0ca2a0e -8376d641f582ea7fbf4334fe8ee54403 -1ac87d92900f2a381db91de8cdf0dd46 -e1d238ddd4e573b085cc34b028b24883 -115c4806f36aeb531699b370720312c4 -a671cca2c79d9135464aa9f41e78b026 -f7a04f85dd2d738d83f066800862de7d -aba33e5e98071280db0d34c42349f1bf -76b75be7fb2191b64616144f1bb6f324 -f17b1318317516348f82385cc233ff0b -441617b20516fd76a40c7ff1b11690cf -96964e9e7e85840bc46249a5203eaf38 -6ce084d8135a4489f80310f900ffd620 -798ed84c7b3f98e34a5aa55074cd2616 -43d6877df934dd2b5a134e63980008a8 -b11a03507e5b25abc28f38627259e6c2 - - -6964848f5af43d68c6b7218d3d3804f2 -ba1534f65c09d9e2f771405acc34e47d -d41d8cd98f00b204e9800998ecf8427e - - -448c864dda6bfcbb4d6344f5c61a3331 -c0bd3c7c4e7d1c006b2301eab5ecd948 -1c1dfcfd97b07cefb27d60e989f82427 -b61cf71e2798c651c607f48940a4e09f -e2e7935ab2ca6ec4318baf7d9e4db6c1 -b3f7fd8c8d2d111960bc1ce63edd8d70 -136042c53e8cdcd5c877a55278b800a8 -5e5a5a366e1296a73953a5a52885a6a5 -d19b64d5c33563f03415fb80e3d390a3 -1c081e65c1f4d55f0874c8b3e21e874c -d3dffe4a4ad4030e443985fa8ae1a91b -db95c9c78a2b762361c7c2c9c1195145 -e9bd2b6f96af06b419608a137f3ffc16 -fde64db4462dcd2dd78d40ac1e490286 -bbe819e048ea168b6c16444dba907c40 -a03c8d2492d0ca2404593ec71b479eaf -85d404bac8dce61b4c6aaa8023b3a56d -dad81862c0f72751d6a69a7baf0c851f -222b20d8427161e4a655b346014e0408 -d3064fa8b7429f42e62da1f2887161d4 -ecad6bd4ba98051aa8d375b71b0e116e -55418df59f5b95c989be04f945a0002a -767c14923c466cadc2b4d21941ea8f59 -d84ba5e3a285ad25f96eaf0348e96010 -67f93528ad1ccf9b8b72651e16c2b83f -9fe6cd608e8c0099e0aa0c2524b7d8ee -a6212b5e4fec967f17c519c9c6ce0171 -6959d7207e6206827d65ddd355ba7506 -f46842235b8299668e3c493ea36de3d8 -0c4097fb424dfb257639732a19e5c2ed -5f8d5884338de38e204a4064409de3c6 -7048b07a1e0e0fde5c6a1b4d756d10b6 -1059848b00093780cd84ab5e45d47c17 -b48838edc93500f2bc9d4fe8afe1d6be -e2c4129a196854d4e004313b67cabbb1 -b5f3d69294c4e3ab14009488fbd8f438 -0bc1e68b3aef15b66b82bc1f4fec9a02 -47efc87b5dd14b2464b2403e038d03f9 -8707c43fc89f7fefe22678f3a25fd20c -4b31ec814f6c455fb7d72f4d32589b3c -ac11d37f3fe11993406e0b1b97f70263 -6b4556404cf9104d5f44a0b9a072eb7d -86ff89b103a31b41474b61e5a506c2b5 -deb4efac7c2229e79dfac38516e78fb2 -2fce4bf86219c914595c178c2d7e13f3 - - -fed79fc64fc305b829316f782bcc63d9 - - -97ff898d2a2fbac0152ab6936046e55f -d41d8cd98f00b204e9800998ecf8427e - - -d41d8cd98f00b204e9800998ecf8427e - - -fca0ccbd4ab10bf1a16f9856eaaf88a2 -d41d8cd98f00b204e9800998ecf8427e - - -5af41905db38ca047ab34b6316372680 - - -11827393335516b52bd9a8644ec0314e -d41d8cd98f00b204e9800998ecf8427e - - -006da78b11f7babb89e930b835695263 -d41d8cd98f00b204e9800998ecf8427e - - -d41d8cd98f00b204e9800998ecf8427e -f0f8a0a6fb32f39b9b9f40199670371f - - -d41d8cd98f00b204e9800998ecf8427e - - -be24a0530d2ce043c5f6df3e85e309b1 - - -0e96616ba6ef78c2874b6c9fb9c10c7a - - -6f4f37b594496fb6a0e40bdfd7154fd4 -fdfddced5e3d8e437fa4e4d48aa074f5 - - -4c38c10c18344da63251b3b214164888 -378ac78ad2e35a429ad44a7130a36624 -fecde88139efaf496dba0ea4f1104302 -4a3747f8978a90ab4ed41be95c2f5695 -a3ebea92be25056a1bf7da4aceccaa02 - - -44d04d7af2e9c42a0b66cf3f1c35e493 - - -4180c5b53ea510f5bcd1175cbce671d9 - - - - -d41d8cd98f00b204e9800998ecf8427e -6d2a2cb1bf0797384a9af130558d82ee - - -c5e2d73c3d91fee77e5c8358060478d0 -d41d8cd98f00b204e9800998ecf8427e - - -46585b9b2118933add2b0efcac54d055 -d1069dd7e0dac50ed09d7b65009b43d3 -d41d8cd98f00b204e9800998ecf8427e -34bc13e73d4cd8217daf337a13593963 - - -08194ccdf2c8801e9ce4acd3fc6a8829 - - -d41d8cd98f00b204e9800998ecf8427e -5d68acdb6ae4bf3482f00202007ceb6a - - -68f0a32904f0ff877cb2c2820b38dc9b -083d2c1c63007a5a3487ec43bdd926d1 - - -0e4f03114e8298dfc23bb94d0df5d390 -a20a84fb09238e216ab80d91674426b1 -5e1aea18f899b4a763a0291dcf1f2b90 - - -4b94e9ad89c520b4cc4ab986a1cfb5f8 -348ac1d0cc575dcee2a8bd3fe3da6096 -d41d8cd98f00b204e9800998ecf8427e - - -11689e5722e4204b9d01e5e4483b92ef -db802ba04a77501799a7073600802c80 -c6798747955c37d2da47a6753d831cf4 -96a92bc03a6ca67f39d363c36031dee7 - - -4a244e830bbda49fc725254448cdbec5 - - -d57577fa1eb8b48491a41f481966456e -eed35a94809263558ac663233eaa2f38 -cc97395704f8c817d0c92e81b4626429 - - -d41d8cd98f00b204e9800998ecf8427e -a903b1b3590aafa28b8e23f72428a2b4 - - -91885edae345ea489237442ebe3c8304 -d41d8cd98f00b204e9800998ecf8427e - - -02efb4c46ded7ea01801b8b6419e204c -d41d8cd98f00b204e9800998ecf8427e - - -0edc7dc4e4eca0cf7e2a016ea4fc38a4 -1faa9edc4b6caae44e72683642199927 -83168a773a55c95c061c4f8e0acfd1a0 -cec7bbbcd81cb1fe36e5b49ee36b7dea -8fa68d2c3cdb23a8cd4e5b43fc1d9dcb -c0be7fe422ce8bfec720d2e0dba045b5 -af84e26d495c27b0132cf3b565c756a7 -c6274cd0dfefaab01570605b5175d36e -757aa607cbcd1616ced5a336e56b0e6c -d41d8cd98f00b204e9800998ecf8427e -765552dbd7152ea2877eec94be358555 -c3da79f5f54f904a89becbfdd77d0dd0 -c27047f9fee70ff22fd43c59f4b9a612 -6877820eee61e7159f1b50d17b63c2df -441a6eda734c5b5275784b0feddd4f4a -6d57fc3e3529573832640f2d8f5431fa -8aab867ba0d3ae540ed3ba143a9ac209 - - -e96ac27ffffd6c056faada99f2238a59 - - -dacb01d46e370bb3bcc9574cd082f464 -4f72962320b42bab18deef783febd12b -6fe0eb8de0e5c45c09845bb8242fcb1c -706b9f915c400211b1c85c6ca6c11060 - - -46f56dc7dfff82250816df2bd2db313c -f2dec5bab910432d81d0314c916dfc66 - - -94822b20c6bafece49439fa57f655e66 -d41d8cd98f00b204e9800998ecf8427e - - -67798229e915f5841274ee70487feec4 -8d61cfa815ca3bb981582bcc7db0a6bd -380f6dea14e777f43fe4d2a5603f8e99 - - -c5bcfe66377f125e7df564f43a4055a2 -d41d8cd98f00b204e9800998ecf8427e - - -c9a74da7df941b7d85b1968474de78b5 -c0e267dab2806e8f261cae12cdd8f866 - - -d9cb53a9d7329a35ccba6560d05ca39c - - -7343a246539a3f13f93a24622939ade1 -741c8a56a45fa02756325f02fc953520 -83f0b70577a573ac052b0cb561b1f3c1 -fa7542a63fa8d175b25c6db3d460d8a2 -1a47a847fe417086b3f0b8d467d35d1b -5bc8eb800ce4fc2a91d07149b97b139a -600e39cecc179fc8dffab41c2e519862 -6ce7b2cb223fead83bb4294741e580e2 -fb2010dcef48409111bc5d619e48cefb -53e129589b3c6fca1362a2268dd4e875 -94fe6931043ded72f939cf23e5ee0a52 - - -24480f30f59fdd7d62df01ab54dc710c -d41d8cd98f00b204e9800998ecf8427e - - -c60b4506b0fec9df17d2435b1b13b202 -311aab84570c363ed4ff7e5069f5d949 -a744148611c48eaed25b7af38004b26d -d92251a50ab286a466dda724e2417454 -4b2da0bb47483e5761d539ce4828ff1f -b69b43bab30c28687680635f91a53017 -45b8f5755cf2ce4102dcc58f53fee8f0 -2690905832c581954b227ffe9e416040 - - -8326aa93734dd8035a04c12062e68ce4 -4f6660f6709655f539d4e56721fc702f - - -a6eb7d29b6a4649096f384711efdf232 -d41d8cd98f00b204e9800998ecf8427e - - -bdd80120aa3357c1ac276e8b2ffb81a6 - - -3a9bf22080b7d3c4d3a154affe9d6095 -1ba9555290fac6190106a623ece3376f -d41d8cd98f00b204e9800998ecf8427e - - -8f3173346d4f0fdc7d6fce0702d49f75 -099f9b1f56cae48a1b679ed282e3766d -d41d8cd98f00b204e9800998ecf8427e -7c588d92e0178284a33300bcd72fc3c5 -7cb5f8fa9f76dae5e107abfbc0e35d82 - - -d41d8cd98f00b204e9800998ecf8427e -073dd6df9978eb506bdc3ec8a1895f02 - - -5df9691e6d6caf7defc193311b0b526f -d41d8cd98f00b204e9800998ecf8427e - - -1d09e4bcc7c8b15b8870ee521b50f1f6 -3cf2e98145b2f736130d75ebce1998f2 -d41d8cd98f00b204e9800998ecf8427e - - -9b8c51efa27bc12af0a4dea533970b92 -592985ed8be81a2b5b4d1649c4100423 -f94fa580d25989d4f7a0729699c794f4 -a7f47e13476c054174040b29f993c271 -dcd7588470066bf274c070ea79bf0b3c -4bf5bff008c0b32a9b1cd7f78a4c617e -c37a0bfdec6d6c5a787dbf10d2f1b25f - - -2395be35cede1fb715ef9a4e497300a0 -4c457d8c88e79b1bab6c830a9162e718 -f658c9802e28504bec736bbb5815e550 -1877fb02fc4332fdc3e3699df586c157 -f88b0bd9aa40d1267c48c44d44ed2288 - - -d41d8cd98f00b204e9800998ecf8427e -e181a5e12c03159b707abbfa3e94cbce - - -b3697e5532dc20737589c4aee62b3163 -50267e189f3160521671ddf819a1fe20 -d41d8cd98f00b204e9800998ecf8427e -c5b4ae74b2b2e938d18d6f91ae094157 - - -1ef827a6d68e23ded862c53c32d3f788 -d41d8cd98f00b204e9800998ecf8427e - - -d41d8cd98f00b204e9800998ecf8427e -66c525f1c24e58832662ea2ba2a21cbf - - -83d57cbbde26de78fe831891f6f8dd7e -b795793e8742698587af059a275581b4 -d41d8cd98f00b204e9800998ecf8427e -47e8ba9252c70ef0d0bce623d680ac3c - - -a267dd6d9a787dbaa95ee81e9812a81a - - -b3586b44a75323dbf02f85aea44e25db -e4d79c5376e95d08abe328aefaee064f -d41d8cd98f00b204e9800998ecf8427e -90bc49dfe52d6be339781906352ddbdb - - -4d460db883bd693a816b29931a993917 -202fffca61e528efe134dd32a3a44c64 -1699071ff4bb09210ac267d430c05352 -9db7bfe5fec55a085d9f0dec8717479c - - -7d040a1858a6f1e8b3d8e7fc68b1b008 -c39db402b4563497e9c7270ef5db4cc9 - - -2d1bc07a8c28954534f37204c02c33f5 - - -d41d8cd98f00b204e9800998ecf8427e -e8e8195fe6a3dceb0cec4fd92061b213 - - -7770e9e8e3fb4b98bc149059c5bc9633 -966129fc8b4d82883741779cf87ea57a - - -7aece8343f1f3c70f617733955c2bce6 - - -a1838ba6f718aeec0172bc6e9d90f4b6 - - -74d19c16439bec3b2eeabde4bb8b6b1d -d41d8cd98f00b204e9800998ecf8427e -15faab5d58a32bd40d3f163cfaf951b6 - - -3c77ad60389c5eaaa410ac4a176b3ab6 -bdb99f4a1594eaf4923129f21035a88d -9c258004b01196601cc918cc09857b0a -7b7cde9c324feeed6e94f50e1655ba40 -eb474eb2e1039037169aaacb91443c3e - - -d41d8cd98f00b204e9800998ecf8427e -0dbb6e95d1684f606189958df4f54162 - - -76a34fc34fe2844982e0e7c8a639aea5 -7b2ad6fb7dc44d8a84517cd164a3883d -73e54239e073c5e776f0c9b0318ba330 -5a997d9395e71eda78b87efd73564cc0 -313274ccfbc6586080382c481cd00264 -4aed9d2cb22a7353d72fc8355de5342d -6471ec07cf574132fbdbde8d506b71b2 -f994d768919712c348a9f4018c6d4ee5 -e7a0c91845d001672e8238f4f4b608c7 -6c5b043b72d32408f4002090e802d6e8 -78f3bac5801105879cebaeb0bdcbb03b -a7288deb697b6946baff286db59b738d -6151a7c4134040854886bc5006a0f7c9 - - -3326f270289840f7f0b365e3fc10b871 -a9a9ff765b1d8f6e41ecbb367e119f44 - - -37bb963c5dadc996a1a96c433fc281d8 -c1a018a8f295fbacb60540da04196931 -d41d8cd98f00b204e9800998ecf8427e -cbc57b074b50625844cfa53e0a5793c0 - - -5c64a4b4685177a38b565bad7b9b687d -d41d8cd98f00b204e9800998ecf8427e -0f5edd10e423f8ad19ff6ccb3e0f0d5e - - -11b557c4e0466d9d6c91fe1fcbb7aa2c -d41d8cd98f00b204e9800998ecf8427e -254087754eaf5d3a5a5e54474d911ddb - - -957b9030b18c319e7c1529a4ffc72b85 -ceaeaad44575b3b3f84c6785cb0d2f27 -47b61de6de8e6ba33297c340f849928c - - -d6662baeac15aea3f1c80d09dec20995 -62b787e74da5d6c50c1bd97b356ab764 -1f21cfd913214a20cfa2f7ae3ada25ff -5c1835dec2225168f2b28b4e8153da09 -ef26c4f25fa2beb7d37143476b866754 -a5b8ce85067c27e4ba0d40f305f84f8d -78316df6af32ee9da5ced78338216bc8 -0a3bd48209e8dc9cba8cbde6a8acbdb5 -1d41db13a55daee5b2fb5cc28528c32c -0d9c006af2fa9a68a117520b8fb0244d -2162a76e15dc4342e7fe861bfbec64b1 -7118a3ccd0d4403f808b65d776e8855c -d41d8cd98f00b204e9800998ecf8427e -97283e3a351b02ab30f1d6b9174a6ca7 -d992798ae83fe2da2d0501997a8bc9ca -a211091c4c91768c4fd48b81a261be92 -6ffc1d90d72e3ed0f20b128231e61593 - - - - -fe8c6f4acebea37d34b626a537db0e29 -80f54c48fa46d0aaa977e404035aadf5 -90ffdb58422df4e942a1a90cf5225c11 -4e6602a9b00bab8fd936f4800a1014ec -f1a8c3f9d6af74c305810725f125691f -d41d8cd98f00b204e9800998ecf8427e -53418757a3514b38f9e744fdec744a37 -febda7bf2f326668d1f627ea9f2230b1 - - -8c209ae5445bf45531c133034a243439 -7a69303716cb7dff3ae011d2202de8f8 -d41d8cd98f00b204e9800998ecf8427e -b4987de205c69745a11bb3ca910cf99f -6534c21938d98c00bad6449081c65979 -42a382d9a7146ddbf4c31c3aa55d6623 - - -f4820e420cd985de91ae87493a9c6653 -d41d8cd98f00b204e9800998ecf8427e - - -afee7ccb55d1420cc8e36da4657825d1 -327de623b6318783a31bf2402764855e -f2a510daf661ef087cc47bd3f01cc830 -7097ba988bc2e9100b8857863e276932 -84b8be2d20c1d6d6811f0298d2234ca8 -7e770b91ced138a55a264566b158c1a8 -26dd7f4612223f374bdb1e5b26dd41a5 -6ec0274bf7948e86e48122bf968085e1 -70c6fc7d08f3c562322c9f53273f1393 -6d73868eae09dc15710f4c71ea25d7a0 -169ca68feb5fcbd02ec9c2a8024b6495 -9bfcd5451fd684e35ed69b3912791a6c -98ca2d412c720690b46b8bf566cf4fb5 -1653a3d486b7113e331b01813407091a -b416db3eacff1ad448692d14aadff327 -e1ed3c24b7fa01be0254d5e6393237e5 -66b21a3ea2de0ae271e470c339c40d07 -60c540c4dfb653ef65e67a628645f590 -ce24eb153015acfdeca2e5559cc41583 -4d7e3a9cca8144dca5f184f23e63953a -b37a46d1de1e9b957b33881225da36dd -86de5b75db8a14dd92fda6ceafdb985e -e4a93615651fab4af7d9288cdcecc86e -07e043e1c42a0fe90d2226eaacb013e2 -c4cf4079ad9a3a1e53b9abee7fa004d0 -b3c941e7ae9574a1330c98ce07aade9f -3cfbb9ef9c493bf739d501114cbe798c -1040bc90a4146aba3e12b547710fd290 -38da2f7fcc1f2fe80b87db53e8767282 -59519c8b2bd240bdfc50476ea344cf8a -51e003dd68580f4f37558726f8452b53 -123e12474f60c1bb22564b4fad2249e0 -e61afe98cecfc359ec57f32be4ef7748 -d41d8cd98f00b204e9800998ecf8427e -503104f81619bf8296bdd1893079765f -811dbf5341b537fccdf98ff790cda72c -b0bd3479b483ba56d613a91242e0efdb -9596a02e5898fe117ac4d2f080a1b3bf -0d3a43a7afc190f34f52855f28a34e4f -7beb5257355c0e3688bcabe98a6e2321 -d2b5ecf5e328a75e984f342ec80a60e2 -748938e5e5aadef1aef9a8b79362b1bc -a969dd13ed2ab6f921564ecd22121515 -73de16117807e3f161b91ccfa5701f79 -a9d45ffd6281800146fcfb2e3ab90ab6 -d868ca6c92ed42be6d193a71b5ae5a7d -0e5a8ff24a2f4bb98d5c6c732e57619a -3e30f76aaabd46ad9759658b706af3f8 -4cd01a2e1b1d02f7bfaff7792fb45da9 -6b58f5c0cad8d233b94b0874a41e4c7d -6caf87260cfa1e46a3a9145ee88b89be -aa7ebaddf8d815b3dfd1b3281f26de84 -0bbc469b628cbc940ebdd59f2e218b6c -c2ced639d9b476d69e952e110169346b -dc056bd161ceeab388b54c28790ad27f -48f9b2c134655de1b0f5f7d50f01b765 -f12d4e2a7b8866e08c4635b6776c1b02 - - -ecbe321be296c93f5263424e7cdb266a - - -b2fd155ecfcbdd44d054daf678b0a834 -a14866ebe77e5755d7b9772210696e42 -e7df06c253dee16873fac26b32670722 -bd966e5b800b4d63bc3884eb6c4dc944 -98b51504f52bc57c9d900d0fc1bdb4ab -6a42f85c4852916c71548c179234aeef -daff44759e4f9c193a667ed427ba5444 -da8f6ee03ae35e1d6cfd412d7c6330c9 -4b15299e9a1c837d8e32aafe9abb00d7 -9cd800459fee7c66968424ad7ad27668 -ea8f7edcca4e35f95a3f2b7eed940d90 -2c4b8a901ebd2581714ea5b7db8ffd1b -f4d35924864fb87b787ab9a9925fb091 -6cbfa567b0f4153bbc7f74adfe6bb4d2 -73aae48b832026e3d24c305f58743806 -3c36fca38f15327101e2cc37493e60fa -16598bc771454bbc6c4c7e0313b36542 -10d80a81dab8b4b36bc477b7d06b2c89 -d4ce19166b58327ea8fe72de57a8dd85 -84fca517a57320901e6f4d09aee570e5 -4dd69e598e667405299c866a9277af26 -1b0a44d142ae00530558bf5a6562492d -2cb5c8f2cf03c6df6d3b70394b454d1e -e07da2dad2151513bd8dcbfe29d43e3c -639d7ee6567e210b36ecae473c5ce5fd -b28954162df69981caec0998d15b77cc -d67feaff91ea41dbdb614dce38ba542f -ed773b5b64093d6017aecdf1ca79fef5 -59b3b68fad9af75f017f642e1e2e073d -c2b5636da94367d2e46433138f5c36e9 -c3d1e1b3f31c8bc2c6ac7582205a85ab -cc20fa269d0799ec512aed3ad36d9d85 -c65c84d23e2a8ad950ca58a1a2ca90db -4b85147a9ebfcb923038a17487822286 -f0e5ef9a4d74a8c802f1b67415f319a1 -40c7f2451849dabdf32b1e9ac2b40b0b -327f71b5cae1764ff48e1ae305fdeb18 -d9cec536a8d7dfcb03825a8da8f60e4d -7b53b4073832d6097d69bdf50ccf5ba2 -9dda41331d1d8cf800cc6de90f24dd29 -f01a62497c9a085386bdc7c1defae763 -0d103e95f845dab6fb699223cf9119ec -6648383dfcecce0fa8010ee26e19c029 -3338b73e47bcad98695e11e3b32ebcfa -2cf0c82aa4ed8fa0e22c393b7f5ecee4 -8733185af5f2ee9956742aff5cd5df21 -080cdf15218f357672308e9feb1d354d -d41d8cd98f00b204e9800998ecf8427e -88379d7c5cf4379d141f0e277fc2d499 -16f583734d76081ef1a4b44d1e0657a6 -a239faf6b54526481abaffe15d1f594d -0db78f95e23062feab46593d28704532 -74c5cf7fa700914ec560b8ce0fa75b15 -4b9010ae3ecbf6e792d3bfb687ea2ab7 -507d7fd927984729187a4891f616f37c -2de8820df5ad2c53044c62ff4ad718b9 -e639d0ea5fc52734d43abbba8262dbb0 -fe33e132e503f32398fb9809fe51da85 -a5d718e3f3c0f67ff94a8694645d04ee -b418b86d6c9003364c5a060946082ccb - - -3beda9cd6565bab822fd85e21efcf733 -047d83a18be4a37f3a6228f658c80efd - - -968f225a3439949e0adf7a0840f8d273 -aaa73e4fd80976e78fec2ae8ea9c3d07 -6b607a5c4f185e8ec7d7aa1bbeab2f6b -6d3e6d6ff9114516a80456e5a6834337 -f4938bd6e57a721cf8a7334599513831 -1c5229194acda10b85b7851bc12675a4 -17fd378a48e2e9575eec057d9881cbcf -2998fd68587f5c2aeede9b647712b212 -a971555d0186562ea2adbe990508764b -7e24728bb80f7be5ff656fb47737baad -d41d8cd98f00b204e9800998ecf8427e -61615b827c5713d34655cdc8d227b294 - - -3b86113a34125dc6f8a1a2f1cd30af9e - - -ed6fd0cc2d0a6e17f6a1b258572fa54a -ef340739e50f5c3f03ee33bf7ddb2d6b -1be28ef0c48511a574aaec4e85b82042 -ea1fc88b5959bf491d98ef06a82efdc8 -ee214e8c71603d61080656642677e373 -5142e675c05915758d5da85ebc75eda9 -d41d8cd98f00b204e9800998ecf8427e -1c931f370710033fe8a387b1c13a4c8a - - -8ce29863483ab28b83dda0eb041678e3 -69ec52d7086d886c9e10717090161904 -bd19a5a87ac1f504a5355e88ba8cb8d5 -23d61ece0d5dc54bf7289f5089cafc6f -71e37258f5fc427f154f008866b0e812 -1c86cc615e0a0bbc32becad92c67ab69 -bad676eea7524bc274e069c4bad959ee -d7de3698a298dbc77285df67b6d32b23 -458f753fd4c0a29c0bef1b4d29b61f3e -dfd0467353ed7c44352117a243179a8d -215e0b3b70724e3a165799f71c1f24f2 -32042dcd19771c7e6284bd7647218438 -59f6ba257eca6b5a93e882c9efc300ec -2616ba6e3e277acabedbe7b36114d851 -867e9e9c421ce864213eebdab0ad34be -8e086092fcd51d0896cb0e34026e6a84 -f89b2c8f43687cbc0597dcab6c7775c1 -d09f346786a0d3f499c82632efdc513a -0035f9b29bda926156cd36c0a8d1203d -0bb3659e089d54ce36b617409b3e3d15 -1b49f055ace5372b0a921984a22feca4 -b0641e3c641ece4a63e97f7ee39df1f1 -d41d8cd98f00b204e9800998ecf8427e -ace4ca8e5de14f5b9d9f359a355c0396 -593ce46bc15dab5c4603a5b9c41cd0a6 -5a9175096415541a53745f90e42679e1 -2cca267db384bceb4be4c9117ec8f5d6 -1f97fed8fe9c50318bb57340d202de6d -5bffeecac1842d72c52b88dfa38a0d45 -f759f3e6ce0d743fb9a50cfb1d7bdb55 -da4407057f3825372d0244bb03d4de0b -5532170a1aca71f4b90b5d61538275a3 -f719e9ea435c0ebe73ddccc0e45faf76 - - -2ae8b7de36d0e4c3630977569bf93bd6 -b35b044b70ee968efd00883995e46d85 -6b30f5dbc6bf06787542ec9414975f15 -6bb3fb472a3ff31f31945a68bb806cde -27a3ec09d0f38ab550bb61c8ca106959 -357ec41bc1a5c1b9e798e094ac40b613 -4b351c64c714586873ccc475ac8ccbcd - - -47cdd134f11d6167cba1dd440c90bfb4 -eb8f1b14a2a6774981d04a6fee92d566 -ffa6c6d30b6f1e9b7140014d35abe01b -d41d8cd98f00b204e9800998ecf8427e - - -36473125e09319a9870285bf7302b83e -db3734d67e45bf4a5140fbb38effa947 -d41d8cd98f00b204e9800998ecf8427e - - -51ed433cea7eb3e229fdae24b8061b72 -2e641a6f3d3eca6cf4a71cd88fd59469 -05afeb97327056d436d21d891b041057 -e2c3c57abca7c86cf8dd772334b5fbfe -3ebcd2dae31ed7c1154f4b54197d8336 - - -855cd63f09025cc1222ad554a4bb0604 -f45ffefb2e7b1c22ebdb17158c1500ea -94e9f6ce17a4651ac325bfee0ac16c64 -d41d8cd98f00b204e9800998ecf8427e -6d5804ecb535cfac0b49152764e90e5c -f565e3ddf9bc9395ac47dcea255b1cd9 -50f84816b4f7e220491599eb5299fc90 - - -0918b8607cb8267fa8c5938d3f70444a -742cae1d17ee4f74bd696aaa67fe2e12 - - -d41d8cd98f00b204e9800998ecf8427e -c2e6938fa9b2a133282c0df7cd8abf72 - - -fdc9f14617e70aba304986ff7e32811e - - -7a6ae85d3a8c4c614ab2419ede67abba -d41d8cd98f00b204e9800998ecf8427e - - -86a595136563ba16d9b4fbb1cb97415c -d41d8cd98f00b204e9800998ecf8427e -f0e4f84ac2849eef8c8da252f2a875fd -4553664f3a8bd058468c8fe3a6622db9 - - -5ba605e1b76e515803012ab67abe2e4a -0276bf6040d05e80ab5f6c6910f6ddfc -d41d8cd98f00b204e9800998ecf8427e - - -d41d8cd98f00b204e9800998ecf8427e -6a04d0a55d694688b7a8e43c72f63891 - - -641809cdd14d1a4d72cfd92cb37c2c33 - - -82d4e6806c62f2f1043726ac0f81f05a -f8a82c0ae674bd5d378298f8afbd05e6 -292a4ef91ad7630763f90cdf34d221fa - - -a5fa4ae23dc2e8283a63024a88016ea1 -97a9f29c0dc31ca7bfe79f69f3425c76 -d41d8cd98f00b204e9800998ecf8427e -d2c1bd5e8beeedc21de40eddc875e0f9 - - -59a2ab6daccf5baf807445992c38bf25 -711f25ae86a9b0767bd4b50e40280c08 -e1efd5d8bc348da70c325a08fc8c37a8 -f2a1930d9be82084b365ccc8819d8484 -bd2bc7e196f60efcbd3a834e9862b333 -1de24508893015db0757ec63e74a8086 -35063f32bb86ee8cd1460cc9b50460ba -5b8b315d71651d84acc735b761c5e73d -79292a368c82c64c1725f3e89f0f74a1 - - -25d79a0a47b2f7f08a7519050fefe7c4 -d41d8cd98f00b204e9800998ecf8427e - - -c8c72a1a816e54366773a6fe813a99cc -d41d8cd98f00b204e9800998ecf8427e - - -9ca94c51aaaa1824e97fccc235e82151 - - -c9522a638b833a2b9497bbe0568cf474 - - -9ba3e882e8e4ec25fce5020a74efeada -cc44ae6151419f24f801a399a8da8e9a -19a8cd1e9e3b2b3cbec0990c2645c17a - - -74251e93022032170749d9c63f620aac -0a846aab804b6db6c1e9fb50a5081fb6 -f63628897fdb4a183081fe4fd0010d7a -64eb1354ac6c51821c0980ff8edc544a -d41d8cd98f00b204e9800998ecf8427e -2412c043ecec8cd25ea9a03e460f052a - - -d41d8cd98f00b204e9800998ecf8427e - - -3bfd2ce4fa4073f4522c912c372a418d -5b059b385fd740f1ba9a8a5628158ef9 -f941a92cb10e7ade5038ce94de4a9dcd - - -d41d8cd98f00b204e9800998ecf8427e -5605c9cfe399c7d6d560149dccac361e - - -350354ebcb6bff1f46b76adf9d1abd36 -065e6c85b9a555fc7280e14a0f686b22 -17242ff8d23e1746e7bfd4e60735aa22 -9ca2223ffbaaeca2bc607504b6c61ba1 -163fbccd6282da53d655c73e2a4b8675 - - -5cba7b9316b591829c756097ae0485cb -d07b23771a6639fd5f6216da796ff343 -290e1eed5e28283e741bea66c30ec042 -d41d8cd98f00b204e9800998ecf8427e - - -e0f8fab55511d45e68aa419245bfc9c6 -1f669f066fd46b6c9ca05177e177ed23 -d41d8cd98f00b204e9800998ecf8427e -bef21989e641a45d0f362fcb97281341 - - -ca96fc96ed612e73229b17a153fa4dec -aaf48588ea6e8869af087e971013d334 -7df36d5f3e3e77b96ed75c4b7b49e051 -8a527c66631be349deaf8cd3c8c65ee2 - - -f3e9f624e0d30fa9a2e8da2f239f2c90 -38979eb74f1b95e4238a1d46a426be2f -ed05055331fe2881ac1da80a5d9e108c -66041e698cef9296e9c48aa6a80953cf -d41d8cd98f00b204e9800998ecf8427e -1118144eead2f41708d6d51c25bdafb4 - - -27f3aeddababdd2cba655e311acbeff9 - - -67aacfba9a773fd702d1cbdb527c2389 -c5cea88b5dcd2165e6463342a083333b - - -a6d0b151c8a54996ae180aa38f639394 - - -4763ae206f354ad791ccff7ee53ca907 -d41d8cd98f00b204e9800998ecf8427e - - -d41d8cd98f00b204e9800998ecf8427e -dd6a5fb7d43469dbd615a20d87f3d3a7 -8d9da26640fc68bb5b410b1e2b045146 - - -b5537ee018da868c569acc68b18f400b -b2a6f62ece363c1bd536bef4ae190d40 -d41d8cd98f00b204e9800998ecf8427e - - -d41d8cd98f00b204e9800998ecf8427e -479a15c5d54330ed02283720b48ba8d0 - - -51cfafc65228242a2b2e5b40b0660b16 -d41d8cd98f00b204e9800998ecf8427e - - -d41d8cd98f00b204e9800998ecf8427e -f8bfc1daca01458dceb9aebc7ffb5ddf - - -bea23817aaf13e638fc0e6d274b0a63f -c304ed5cba54aec736b4550b472a1337 - - -9450b4d4b4006bf67e6bafaef58f3d57 -d41d8cd98f00b204e9800998ecf8427e - - -d41d8cd98f00b204e9800998ecf8427e -2f133b07231a558b4551cfe813b6dd92 - - -0ab8fe506db31d3e1a2a40b8d0eec509 -d41d8cd98f00b204e9800998ecf8427e -3ad492843d4202c70fa835fa26e35690 -b58aebf1a81b0a34e8e66e39e0e9ead1 - - -642212fe30e6f0fefed6c31c83c71a72 - - -9b301131818ad7072d10624d9fce65b8 -215929b6545fc8cfacbb7386e4cbedca -d41d8cd98f00b204e9800998ecf8427e -347df504c0b23da0ae91c9b5a344c1a2 - - -cdcb97001ea2cbedc6261727dff64e0d -c65eeac4d7c36b3af73c2408ce38fa09 -d41d8cd98f00b204e9800998ecf8427e - - -2573e46733c7208e2235284e4e09179e -5bfaa9c43513c24bcf96a7535a5e1dac - - -f1dcf0ecfd2eead2b4615deb2593668f -b5b8aca26aec574d1ab401fe8411e144 -60d1a2024e5d8c9d6cdc0c295a243652 -d41d8cd98f00b204e9800998ecf8427e - - -d41d8cd98f00b204e9800998ecf8427e -bd77bec5b425c9fbc1a4830a3ccccaa6 - - -ecac44490fa4b478e2c7936418e99d6b - - -7af26733aec623cb978ec9e8c3a6f324 - - -d41d8cd98f00b204e9800998ecf8427e -e3bb45091c943bb3a72cb00422e0fc65 - - -0610f57a709679458e9057a07ba101b1 -d41d8cd98f00b204e9800998ecf8427e - - -d41d8cd98f00b204e9800998ecf8427e -9ee40eca1f3111186855090e11978198 -4dfcdf4d3cb3af826834c1fbb852f513 - - -fc2cd8f1b832bcd093d8f65cf48d6be1 -d41d8cd98f00b204e9800998ecf8427e -d787be1614e93a5b0dff651c2d1962b8 -94d4a670a65a20356db9e332884b5b3e - - -04876764536d2c0ff37e0f1c9035c639 - - -d41d8cd98f00b204e9800998ecf8427e -70b0380559e50123f150a6f30a4d6699 - - -b3f46a3f7cc553bcda255db88fd2309a -d41d8cd98f00b204e9800998ecf8427e -3621a212806836a2b3ca23f601c1b670 - - -126f99a723184153f4b5b9e9c65cbaa5 -b6897110ae9267fb7f01d49aeec0c801 - - -d41d8cd98f00b204e9800998ecf8427e - - -07bd495dc9dfba8e2600e88be590e561 -d9448e87c67953d80696f8cbaf6c1175 -d41d8cd98f00b204e9800998ecf8427e - - -ee19a99da183183338ea6ad5362ccd13 -2b19c3592fbed5e4bd96730f87af438c -4a30845ea4285d39090de7254b835d23 - - -61328dd1c13f9e73414ea8e64a85405d -2c06092e1620c0a27cf264e1fb56ea02 - - -6b8b8ce50599e40cb74603a883f5d49b -d41d8cd98f00b204e9800998ecf8427e -b6e05cae93872a350f3ca2352f15f6ea - - -c34bf02ed40bcb9f4b41f3d1e5e5ad60 -d41d8cd98f00b204e9800998ecf8427e -d7df1b72b8a4b0a354b9d5b0f9d26344 - - -10e2b90883ac49fc2e326e92b8a3499d - - -eec05c0523cb9769a07d04f955e1c72a -bca9f4a42560311c45d5131a198b0d92 -4dc904185fe2b76d5bc130f22528d699 -80af429597316aca3852de474a686ff4 -5e7d0358103080630683733080afb87b -68fbcc4c093129ed668beca7cbd761d7 -184c417ca2d9d734f73867da2c1287f3 -b71bf029976479ae4f80ea641304f6d3 -419e09696f74abcf339c3eddc67a029f -7e4900564ecc92158821a13fd6f3b635 -ed2811af4208ad49754d4e8d2fda62c4 -ae0fb580a2fe5b03172568950e5d5a48 -6c3926050e8c2c9a6cff10b8059e88df -d41d8cd98f00b204e9800998ecf8427e -cfd429ee3e4c1e7bb537019d7122ced8 - - -3c517199cf6861972f237921744cd0ed -0db9ca7613d81d5ec9f2f5ecb9ad9dbb - - -b6f2276063e5873825b5928ca09a0196 -de943e7a2b8a603c3ebc34507309a46d -b94a53475b0b7b72de16ab96550afa6c -d41d8cd98f00b204e9800998ecf8427e - - -db4b88a7cb7f2e983e9349a0564aa877 -637487fcf15c0eee4150965305c5ee67 - - -d41d8cd98f00b204e9800998ecf8427e -4b0639469c047f10c9c546331f6bba63 - - -ad04ee1d74848b23ca5b45191b38b2ea -98696a105fcdecc8f00a2849ed36aed8 -a9263ae175750c4655ce37217107d029 -4e99f17050caf177332e013fe7fe9e0c -7bc409d442508ec7f8638e4d710c6508 -d41d8cd98f00b204e9800998ecf8427e -d4cf80342896bf019bc4d3e8b961fa37 - - -731dacfec2893b6ad3718c53b6b3c29d -b9fa1ee89ea983e5cca8148467eb637a - - -36602e78494c46c4704cc578d4fb90cd -1390ded165db331385a1a0b5873c2da5 -bcff6120a04c2644c3139ab28b982506 -d0889baa672fc0c803bf11ba7f57f6b1 -f71705be8958fd18f828eb64eb254202 -e1e875671e566acb90ca03d16b7e63ed -d41d8cd98f00b204e9800998ecf8427e -254b5f623a4ebd0f52af25fa0851d62e -a24a4e8582b19a3d805e6cbf21a6a1a2 -be1a34c1c77c5431dfcee9caaabcfd88 -cf774530ccfde3af1a4dadb6c4a5de30 - - -a1bd66b209ee6f52c176d5d0f1c62da1 -d41d8cd98f00b204e9800998ecf8427e -f4306fe54c33047d10182d177f39b89f - - -6523d9f84dcf60da8fca2097f2147dd9 -1fce4641b42b1c6680093428f2ccada5 -0a3152cd7649e57b9318603c240cab0a -c25b358c8b92592afe06a9c4d62a37a8 -7db229fdbab069ce531ee6db615115f7 -d41d8cd98f00b204e9800998ecf8427e -a820218b80b8490482654be08093cfca -77c8cd8ae6a8fc95809d1ba5d56e6fb8 - - -d41d8cd98f00b204e9800998ecf8427e - - - - -d41d8cd98f00b204e9800998ecf8427e - - -36dd4822197fbbdf19200117a1764eac -2f057ac3d6bd562b5652a688b6e64bfc -87ab0c3914a8aed4dacab87430458bb6 -fee68244e60227c904bac3a3b6eee43f - - -08c5276ccec1e43cc5f3c6d0be5d2b8b -d41d8cd98f00b204e9800998ecf8427e -191d2a2463a0166ac3be558bea018c72 - - -1f38190b8213c46f62edaf39ee4638af -99113f9e888936076f1bfab0f118d75e -1e66ff16162d27c4f62f5f50321c27c5 -f810fc612aceaf61d59bdfb6070481c5 -b8d07a4c4a294348b97c9bcfe2f85590 -84ad28425e6a6a24d92ebd0e072bacff -1411e223b68d5b52ffe1af867f60c4a4 -72517dbfdffeee4aa7d31fd4bc08989a -1411e223b68d5b52ffe1af867f60c4a4 -5518e2e6b0fae1d10afcff0855ac54d4 -c2ed5baccc767f4fdb09ac901f1b92e5 -a8e7f6279b672b819e3587e82be2ecaa -5c405b8797567aa10a74ba78e0a45779 -c05109777e57c2553f01444a13c901c5 -bfa40282d9494b2a4d2999f1b0cc3fb9 -bee1a71bee296f6d1c70585fe47c6ef1 -1e66ff16162d27c4f62f5f50321c27c5 -e015c12d2f9b5ecbe7d3dc4d40a3d403 -a313226470463b1cef10c0a9e9ef810c -1a5c6b584ccd998c0612fede27015d07 -95c88179a187f4e5b646bc9ca87fe969 -3e8e56cfacb8c2bbf56f9d5535e531b6 -f70aeb96f2b1e6b321b8a0b33a0ec388 -d41d8cd98f00b204e9800998ecf8427e -805d1cab1ef9a9a4fb9d5f6bc19599fc -08302bad21f1fa6c63e2676d8997c4c5 -c05109777e57c2553f01444a13c901c5 - - -a9b8b3dd2ca801db31096657f9feb223 -2a6d089c130c02e956bfd09b24e471d8 -33a84dfb653999b51a2e7bf4ad9d61c4 -0b3ad9eaedd22ca346e7413749cf65d3 -edcd1c8ee9024895b5a4583722babe78 -bbda4f35647bcd95d0c8ee59784c171c -23ba1414b6b41244e36280f806264949 -ebe5075d5d7f38954bdac5dc09ac7959 -23ba1414b6b41244e36280f806264949 -5d2a464ef783e9ec70d12cbd0219b093 -07acabf847fef0e89e2bce0503630da3 -e6b53f1b56eb92e0f6c7956389846860 -9c8237cfe69b78933a90446291cb4ae7 -582e2c081262467afb34b75cb2209cd4 -98ecba6c3121fab9e9bd8a0d231291da -bcf30b9314c6e22f433cf63e070d5e2a -4c5e0f1f033e3c5bf6262396bf67fa18 -d4fc315c5e2ead83751e8840a12f0bd5 -ca7af6adbe7fc6713eef7aedeaff6d68 -d557ad90a880a8c4239afe23dfa338bb -4f78f926e05049ba39465f6e6468161b -ba4926ea53023adefd4e45924855b2a2 -f0e74b60a4bd86a7e3c72703ae35bdbd -d41d8cd98f00b204e9800998ecf8427e -9fd4dc6b29261e27a3510bb978a03e6f -6384cb5f1f2ee9d373aa7daa642aa37e -d2f15a52c9b7cde60094357aee158f9a -401bf37973a5828e589dc42d51a9ce41 - - -0a2d3ee44e20f13736fad04e7894b6df - - -f6ceacf21d75d76838d8d0eb07b59b91 - - -13c230e30f07c174594e9aa17fadabdb -be71fd70d4c569441bba4290a5f45ae9 -d41d8cd98f00b204e9800998ecf8427e - - -520e529510d541e2f6d55d4835d37676 -d41d8cd98f00b204e9800998ecf8427e -325472601571f31e1bf00674c368d335 -bc3efe4654dfa1f79154f2544af4b884 - - -d41d8cd98f00b204e9800998ecf8427e - - -8c78f30a301fd7c5092ed59d95f2f688 -6b6851714ab5e4f9491c2500a26c8ceb - - -4aeaafb21fcc66d532de0612676423e5 -0ec1a402340bb4671bc107148c121101 -190087a51700f34c1b861261d838a6cf - - -9e8c8078e241f955763c476a9cab59c2 -5ef3117292cb272cb72190d67bda189d -d41d8cd98f00b204e9800998ecf8427e - - -080945adaf8304688ce778f8acc821fe -d02f3b80bd620e44b248b763a745c555 -a2546e7613e0c76e1c26692507f66836 -b7c3b27785924f5b023754855bbe3177 -1e1d68cabdaa8e946ad786f083a114a1 -6cea8bdd89a385b695dda1279e3021fa -9e2d3bb695cfcdfebe705c171aa299ec -e48ba3cc3d7d8641f31fb4d1e1cce67a -d7f98378b22bf02d1e96caa8c354a518 -888c88f6a832fea8fcb1dbc12ce2ab99 -6dee88d0cf667f9b940d2696690f6744 -ff890ffae74d79a90ade34016ffd241d -526b1578733967a53e9c7ea0d3687334 -8cc4b11d20b0e01eb7e7b7401c2f12c8 -fbe31176a2ece8671e34270b56ed9224 -d41d8cd98f00b204e9800998ecf8427e -25d6c35728da1df381db408e61137d98 -60d139c55b1533b31a8fcd4150ac35ed -080945adaf8304688ce778f8acc821fe -300cd9f93948ef984fcea8e1867901f1 - - -a5df2e5c187890614848ce174bbf31a0 -d41d8cd98f00b204e9800998ecf8427e -9f492656ae023edc0395cb700c6199b4 - - -34afc4d66edcdb3d11f43f8b647b194c - - -e9369438fb098c129be060ac6e705a9f -5e8c8b93e0e977b883243c3ff3d9a571 - - -653834503958f258dacebb5f928149bb -ed2e19f478a4fd1376089ec4b653f027 -d41d8cd98f00b204e9800998ecf8427e - - -4fc187f0910aaaa9980dbed3071f6294 -625d53776232369101dad5f6318f40c7 -185e9b25e8090c806e1164d18c3ab7ff -39fc42939724eeed99fc0f9554e2a6d7 -b508411bb915ecf32b1a995644f67fd1 -628381f4ef8ee6d35665e002ffa61bb0 -ccf52560d23a20c3c23a90d2e6449d8e -2a2f8d993d977c68987f52998c625257 -d41d8cd98f00b204e9800998ecf8427e -609462d6bedb898fcd2efa9085432ccd -22f4d2b640778fc1e28f2b846679b1bb -a320ce39b96e92f089f639ef14a6ac6d - - -d41d8cd98f00b204e9800998ecf8427e -9f037fae52533208dacbb7ad16655081 - - -d968592147e2da6690da8161b4c8478b -a407ef881b83bf2bacc9edeea1511248 -e14ed0babce46edd7d84dc9aa271d058 -70cc57adde39239a54f1800b4d4ce40c - - -9dc0be5de3a337cca64ef3e9cc0a49aa -d41d8cd98f00b204e9800998ecf8427e - - -7dc0092414e8a0160f715413907ef350 -7b22629626fc5f780cced1f6d817d57b -ca0ca45f3c28138dde2f4e26effd15a8 -d41d8cd98f00b204e9800998ecf8427e - - -8b208d9d73aea61ac49a9b462aabc445 -8fd4a88aed32234ba887c20fd976d507 - - -92609e87c5826db05f43b6470047253d -51465ea4c96dcec00fe6f060b378ac02 -d41d8cd98f00b204e9800998ecf8427e - - -2e8a39a9624e070465fd1ef2cfd0e34f -a6a80c02f188fa39b135ce4f07fe1a99 -7661f4793122de3be8b166f3bebde98e -3c90c8031f1c099642b27d392fe480e9 - - -4ea138773b73a5ae105dd1fc61a493ef -1b331e41775794399092b13709a36a3b -427bbed1f2e5be429d011aee8c4dfb0e -16e32befe7245bb0f920aff7430fa64b -745adf0a86c9402ae8d08ad2f198d366 -ea919d13e77370c2542e7c20defe5a46 -d41d8cd98f00b204e9800998ecf8427e - - -7a30afe2b7f7e02b189e6fbc521c1cd9 - - -d41d8cd98f00b204e9800998ecf8427e -51b4e94e74766a82470e5ff6c5753cea - - -d41d8cd98f00b204e9800998ecf8427e -87a15a164f064663c4d567a67b877a14 - - -d41d8cd98f00b204e9800998ecf8427e -917a8778ebdc3580c03a29025a0cd12c - - - - -afc475d07b299875118b55d7811e76cb -d6a0e0fc84f08a62d144e63ccd0f798d -b3c7a210b2be2599c7fe2af126eeb062 -994337d7c14c76b4537aa2e748b48729 -d41d8cd98f00b204e9800998ecf8427e -88268a503e62dffa883ea5c31fbd7d22 - - -09e73babbd467f0a02e6cd799bf04974 -82c81d64fd67aa3de6e67fd588729f3f -007b8d828ec11856ef22bad7fde0dfd3 -0dac5348ea6d6e03298409b873de2e24 - - -e2605c19e2029efa999dc98306e5a834 -fe62c00b682dd677dbca4764d5f0fe97 -98b0d3cc2035770083a37dbfbb7ba640 - - -c8506bcf84839f36e61a555912e7c31c -221d0b581479c434f039e58da4718a8d -5e10336fe2624aa0921ef3c1373182ad -ea1a3bd45013d291cafdce135ebbd13c -76698169fea8c817165cec07292a4d60 -9423e6de63cf281df2bcda0892da0a88 -9730a68336c10f32cae7cda82a9107fd -a6f5b10b14e766e788351b506b6f6024 -f3ed4581ecea74911529efc87fb1ace4 - - -d41d8cd98f00b204e9800998ecf8427e -5e5c108e72c655d02259b64195f74a75 - - -bfe225a7a6f3dd1d398994dead8172eb - - -fde1dac27ff95323136138883a8cb086 -d41d8cd98f00b204e9800998ecf8427e -8be23d776c1495d2c25270d31f043b15 - - -020e671dfeaf92176c35766720c2b8ec - - -95559609c47c88b112952073fb77410e -ee9a71add932db04def7fb3a6d8af20f -21055e6d625cd5dc3e805ededd1f350a -d77e4af5d17f15fdfd920ec8fda7fc45 -375c1191868677d9d32910ecceef8248 -b79674bb1410c34f6428a0e392318740 -2accac2e7486bca7a2d57f646974d54e -d41d8cd98f00b204e9800998ecf8427e -098b5e975cfd5e0d0600dae97f55281b - - -d41d8cd98f00b204e9800998ecf8427e -307e28d0231a9721828afbab06739222 - - -d80628560310197b51451941990f41a5 -d41d8cd98f00b204e9800998ecf8427e - - - - -c189a2f2ccb19c0e0dd0aebb2f1b5bcf -55e86eae4b7fbef8587a5253bbce78db -d41d8cd98f00b204e9800998ecf8427e - - -9526e47774ea9c97832d4bb5fe000376 -a6cb8bb24917bffd0f35616699e30bc7 -483f308232887be35deb15f53edf9bdc -7620d3c593e0756c6a52a14be719fa4a -9f008f58c3338ecfd47392eaa38db8d9 -de36a72317540bb861c69aa3aa246a29 - - -09889ea5df64284a0e7753cbdf134a53 -d41d8cd98f00b204e9800998ecf8427e - - -bc640abf203b20a3e9d3e3d456b44f3b - - -318ba51c0457714cf1b5861400a96e22 - - -68dc3ea2cd9c6508a925df50fa011221 -ffcd5053589c705062adeade31ce92f6 -43681ad608774f61647ec0434bd85c64 -9415a071a1be518bfc801462984551d4 - - -40c6a164893bb4a6899924c2558d9b6d -7fa9d59225434bed8ab7ef3b0029196f -d77310df72aecda03de0c4d699e625af -0a7b8a890ee9b9e9bab0cab59c3b1277 -d41d8cd98f00b204e9800998ecf8427e - - -1aaa761fff1db6880a873b2f7aba4769 - - -3b3a6cb8fed3de208bc9a97209fed209 -3229eae002e5525f9b545644256aede8 -c4b52ea2075814429b8a00a486f74baf -583594a72118966d0ce436acbf5ab344 - - -5d5efc37b691550abec45b0f303a8133 -866c20b40a82e12f5dfc6167586cdf5c - - -cca240d50ec70f59404618dff59c354a -d41d8cd98f00b204e9800998ecf8427e - - -884f200f728cff6292071327f3333432 -62577ca41ec0a0923ac3a9b49cad36da -deac83a4c0eda829eedb0f9136a1fae5 - - -3dc697d1a8e9f73211e05cdbef38aa7a -69dcd2d08e96bfa3e71b39599c8754ed -8f950f0c02a403cf239f8e47bafdbbcf - - -95444b95d6bfbb4cc05bddb1fd2d430b -836fcb1eded545bbd9a2baeec41a4f62 -73b7987dbc53760d356ad398d8f31a6b -d6fce7ac59cc15dc63656cdaaf69c1ec - - -8065b49ccd1472dffa312f300db8f9ed -d41d8cd98f00b204e9800998ecf8427e - - -289d9a2960e260c7d015dd62c7d4cba7 - - -0b343f1d661d5fa75128c811b7bd4459 -d53398a9064775d5bf1ad2da53a497b7 -202aaf44cfdb9de3f06ecbb91eefa350 -d41d8cd98f00b204e9800998ecf8427e - - -cd5fd550b699c17d943e9f7758936537 - - -4f59d852e2d338fce7d751555bd28575 -d41d8cd98f00b204e9800998ecf8427e - - -d41d8cd98f00b204e9800998ecf8427e -cfdf29629eeab4fda683f7ce2db6e68a - - -fa82bbcd66e5d31ac2f43c52caaa4acc - - -296b5b4000a78d2b6641d6f87b54b1d5 -f3759ed275b1a7bc355abf219ddfc20a -d41d8cd98f00b204e9800998ecf8427e - - -b3557974ee09698bf75f5908dce5ede1 -d41d8cd98f00b204e9800998ecf8427e - - -d41d8cd98f00b204e9800998ecf8427e -766631fe2113061598cf2b70c4367da1 - - -d41d8cd98f00b204e9800998ecf8427e - - -638b941ae4b6d882194e84b826fe80d5 -d41d8cd98f00b204e9800998ecf8427e - - -6281217d898f4f4b066633b4de211374 -d41d8cd98f00b204e9800998ecf8427e - - -066af2db95d9a1cfc73bfc347f68d154 - - -a4596770c270b224727cd33f4704c7b5 -a42439ac674abe10958f58d747f7cde0 -78a3befa9a3a9bdb40420e432352250b -7966fd3f84f7f71721764ead89db7eef - - -1bb0e498c548574f97f4a9b34a0029cc -0f24a63c207b78287d7ca008cde2db97 -d41d8cd98f00b204e9800998ecf8427e - - -16e1a29a5b79d4a3668b3a71ca3d86df -f2a9ae7cf26359de1759e68bd733c67f -6ca06b02bff35d86be76ffce63c771a3 - - -0e3fff0ddbce47ecce252c82a6e02fa7 -8b9453a22ca4ec5cd5f504b0f3338238 -d41d8cd98f00b204e9800998ecf8427e - - -7cb2ad4d3c377ac9ad46e3e80c4b2c75 -ebf04ef741c57a95bd3dea65a55704e9 -f47f735ec8627b7b3e9ce6a5e1643d4c -7ab5486f4cec78b1c4d93a1df0d83b51 -fff5ddf9542281c2d2568153781b4c73 -289e4369c386d5273f7242d6dfb4547c - - -d00dcd6a42cd0d91cbd5639c56a4b6a7 -008656d6620cb1ef43935edc30fd2994 -bef639ba5d15fbe93aa7df26bf6c3a70 -32160cab79f75fc38ed26bb590037169 - - -89de9fce3150d048f17e6048b90875de - - -72617d60821288133a367f70bf39ad93 -d41d8cd98f00b204e9800998ecf8427e -e278575c8544f67c101af5147fa6a36e - - -3afe82801f5cd602354186397efe9210 -79b8c989d344fdd08b832d875fb1e161 -bbc809a90f76f56cf3846553635a49cf - - -8705dd72341375d93961d8fe65ac8a95 -d41d8cd98f00b204e9800998ecf8427e - - -84c13b91d89d2ca2851e10c25a0cd166 -506ea9d1421de557c9e480881cf331b8 -b515c78b50581e29acaa9da0fc28b7cf - - -59d8e23aebde2396d3440271828f4e20 -b123826d90b2ffa257bd9880c090a6ac -f454a5cbdd36bfd22d6240b85e503e3d -d41d8cd98f00b204e9800998ecf8427e -86b05756ec73691d2b88e25bbce1e86a - - -fda753e7d9cb23ff2436f21728bf5cfb - - -83f35bccbd9a8b11c8d657930bb11011 -10dc086caaade3a8a827e2c5076ddac6 -d41d8cd98f00b204e9800998ecf8427e - - -a2c3436e9e188ba9bb2653ce58bffc0e - - -5cdd42491af381a414bea885fb5c234a -a90e349b1dfda275772af8b109e8be6f -8df084360e41bb5dcce4719ba16c4804 - - -1921a40ef2e203a9c7e33e33d8481630 -e952176e5510b8da19ce706487cd8495 - - -7d95b5c206c23603add3ad81c635d45e -8d9a81ba49cafdb00db9cb3651672497 -366995b763c1aead04b0b2f0a125038f -ce7529788448438a60e5cece5e33bae5 -5d5f2fc381b89e2b3b7e0f865eb830ec -13b800220276edeaac3b1434aabdc185 - - -6a4676f26cc4774608c53cd47ae76efa -d41d8cd98f00b204e9800998ecf8427e - - -d5998ec8a509d53767669451eb713f50 - - -9b21272e9b7dcd0da322787ee5e84beb -d41d8cd98f00b204e9800998ecf8427e - - -beab4c4161bdaa1a850e545aace54e1d -e46cfd196ab75f7cd15326e58f2b9de7 -d41d8cd98f00b204e9800998ecf8427e -42a55a23a1f1b8f9a16e0c2f67af1101 - - - - -ad397de49ec0d9551c8e6a3b82eba821 -d41d8cd98f00b204e9800998ecf8427e - - -48f7678b5664784c7eaf3f295b395d1e -264405e8b501b39458cd09ef5a196807 -d41d8cd98f00b204e9800998ecf8427e -6adde0c9301533292f1581a8712e56fc - - -1d3a243056d8d6b4c511306f32b8520f -d41d8cd98f00b204e9800998ecf8427e - - - diff --git a/htdocs/core/menus/init_menu_auguria.sql b/htdocs/core/menus/init_menu_auguria.sql index 417e02738b3..236669273a1 100644 --- a/htdocs/core/menus/init_menu_auguria.sql +++ b/htdocs/core/menus/init_menu_auguria.sql @@ -39,10 +39,11 @@ insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, left insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$leftmenu=="admintools"', __HANDLER__, 'left', 201__+MAX_llx_menu__, 'home', '', 300__+MAX_llx_menu__, '/admin/system/dolibarr.php?leftmenu=admintools', 'InfoDolibarr', 1, 'admin', '', '', 2, 0, __ENTITY__); insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$leftmenu=="admintools"', __HANDLER__, 'left', 202__+MAX_llx_menu__, 'home', '', 201__+MAX_llx_menu__, '/admin/system/modules.php?leftmenu=admintools', 'Modules', 2, 'admin', '', '', 2, 2, __ENTITY__); insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$leftmenu=="admintools"', __HANDLER__, 'left', 203__+MAX_llx_menu__, 'home', '', 201__+MAX_llx_menu__, '/admin/triggers.php?leftmenu=admintools', 'Triggers', 2, 'admin', '', '', 2, 3, __ENTITY__); -insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$leftmenu=="admintools"', __HANDLER__, 'left', 204__+MAX_llx_menu__, 'home', '', 300__+MAX_llx_menu__, '/admin/system/browser.php?leftmenu=admintools', 'InfoBrowser', 1, 'admin', '', '', 2, 1, __ENTITY__); -insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$leftmenu=="admintools"', __HANDLER__, 'left', 205__+MAX_llx_menu__, 'home', '', 300__+MAX_llx_menu__, '/admin/system/os.php?leftmenu=admintools', 'InfoOS', 1, 'admin', '', '', 2, 2, __ENTITY__); -insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$leftmenu=="admintools"', __HANDLER__, 'left', 206__+MAX_llx_menu__, 'home', '', 300__+MAX_llx_menu__, '/admin/system/web.php?leftmenu=admintools', 'InfoWebServer', 1, 'admin', '', '', 2, 3, __ENTITY__); -insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$leftmenu=="admintools"', __HANDLER__, 'left', 207__+MAX_llx_menu__, 'home', '', 300__+MAX_llx_menu__, '/admin/system/phpinfo.php?leftmenu=admintools', 'InfoPHP', 1, 'admin', '', '', 2, 4, __ENTITY__); +insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$leftmenu=="admintools"', __HANDLER__, 'left', 204__+MAX_llx_menu__, 'home', '', 201__+MAX_llx_menu__, '/admin/system/filecheck.php?leftmenu=admintools', 'FileCheck', 2, 'admin', '', '', 2, 4, __ENTITY__); +insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$leftmenu=="admintools"', __HANDLER__, 'left', 205__+MAX_llx_menu__, 'home', '', 300__+MAX_llx_menu__, '/admin/system/browser.php?leftmenu=admintools', 'InfoBrowser', 1, 'admin', '', '', 2, 1, __ENTITY__); +insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$leftmenu=="admintools"', __HANDLER__, 'left', 206__+MAX_llx_menu__, 'home', '', 300__+MAX_llx_menu__, '/admin/system/os.php?leftmenu=admintools', 'InfoOS', 1, 'admin', '', '', 2, 2, __ENTITY__); +insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$leftmenu=="admintools"', __HANDLER__, 'left', 207__+MAX_llx_menu__, 'home', '', 300__+MAX_llx_menu__, '/admin/system/web.php?leftmenu=admintools', 'InfoWebServer', 1, 'admin', '', '', 2, 3, __ENTITY__); +insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$leftmenu=="admintools"', __HANDLER__, 'left', 208__+MAX_llx_menu__, 'home', '', 300__+MAX_llx_menu__, '/admin/system/phpinfo.php?leftmenu=admintools', 'InfoPHP', 1, 'admin', '', '', 2, 4, __ENTITY__); insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$leftmenu=="admintools"', __HANDLER__, 'left', 210__+MAX_llx_menu__, 'home', '', 300__+MAX_llx_menu__, '/admin/system/database.php?leftmenu=admintools', 'InfoDatabase', 1, 'admin', '', '', 2, 5, __ENTITY__); insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$leftmenu=="admintools"', __HANDLER__, 'left', 301__+MAX_llx_menu__, 'home', '', 300__+MAX_llx_menu__, '/admin/tools/dolibarr_export.php?leftmenu=admintools', 'Backup', 1, 'admin', '', '', 2, 6, __ENTITY__); insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$leftmenu=="admintools"', __HANDLER__, 'left', 302__+MAX_llx_menu__, 'home', '', 300__+MAX_llx_menu__, '/admin/tools/dolibarr_import.php?leftmenu=admintools', 'Restore', 1, 'admin', '', '', 2, 7, __ENTITY__); From 30a5111c683800123df486fee8adab8b4b681569 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 21 Feb 2015 15:18:05 +0100 Subject: [PATCH 105/287] Work on expense report module --- htdocs/compta/deplacement/card.php | 2 +- htdocs/core/class/html.formprojet.class.php | 20 ++-- .../core/modules/modExpenseReport.class.php | 39 +++++-- htdocs/expensereport/card.php | 82 +++++++------- .../class/expensereport.class.php | 103 ++++++++++-------- .../class/expensereportstats.class.php | 20 ++-- htdocs/expensereport/synchro_compta.php | 6 +- .../install/mysql/migration/3.7.0-3.8.0.sql | 24 ++-- .../mysql/tables/llx_expensereport.sql | 21 ++-- htdocs/langs/en_US/trips.lang | 5 + htdocs/projet/class/project.class.php | 4 +- htdocs/projet/element.php | 87 ++++++++++----- 12 files changed, 243 insertions(+), 170 deletions(-) diff --git a/htdocs/compta/deplacement/card.php b/htdocs/compta/deplacement/card.php index bdde060f448..bd4a4555fb7 100644 --- a/htdocs/compta/deplacement/card.php +++ b/htdocs/compta/deplacement/card.php @@ -128,7 +128,7 @@ else if ($action == 'add' && $user->rights->deplacement->creer) setEventMessage($langs->trans("ErrorFieldRequired",$langs->transnoentitiesnoconv("Date")), 'errors'); $error++; } - if ($object->type == '-1') // Otherwise it is TF_LUNCH,... + if ($object->type == '-1') { setEventMessage($langs->trans("ErrorFieldRequired",$langs->transnoentitiesnoconv("Type")), 'errors'); $error++; diff --git a/htdocs/core/class/html.formprojet.class.php b/htdocs/core/class/html.formprojet.class.php index 86d46f3b9b5..85c9ffbb241 100644 --- a/htdocs/core/class/html.formprojet.class.php +++ b/htdocs/core/class/html.formprojet.class.php @@ -87,7 +87,7 @@ class FormProjets if ($resql) { $minmax=''; - + // Use select2 selector $nodatarole=''; if (! empty($conf->use_javascript_ajax)) @@ -219,6 +219,11 @@ class FormProjets $sql = "SELECT id as rowid, label as ref"; $projectkey="fk_project"; break; + case "expensereport_det": + return ''; + /*$sql = "SELECT rowid, '' as ref"; // table is llx_expensereport_det + $projectkey="fk_projet"; + break;*/ default: $sql = "SELECT rowid, ref"; break; @@ -226,10 +231,8 @@ class FormProjets $sql.= " FROM ".MAIN_DB_PREFIX.$table_element; $sql.= " WHERE ".$projectkey." is null"; - if (!empty($socid)) { - $sql.= " AND fk_soc=".$socid; - } - $sql.= ' AND entity='.getEntity('project'); + if (!empty($socid)) $sql.= " AND fk_soc=".$socid; + if (! in_array($table_element, array('expensereport_det'))) $sql.= ' AND entity='.getEntity('project'); $sql.= " ORDER BY ref DESC"; dol_syslog(get_class($this).'::select_element', LOG_DEBUG); @@ -260,9 +263,12 @@ class FormProjets }*/ $this->db->free($resql); - return $sellist ; - }else { + return $sellist; + } + else + { $this->error=$this->db->lasterror(); + $this->errors[]=$this->db->lasterror(); dol_syslog(get_class($this) . "::select_element " . $this->error, LOG_ERR); return -1; } diff --git a/htdocs/core/modules/modExpenseReport.class.php b/htdocs/core/modules/modExpenseReport.class.php index edee0952b00..b5b45ea23f8 100755 --- a/htdocs/core/modules/modExpenseReport.class.php +++ b/htdocs/core/modules/modExpenseReport.class.php @@ -224,8 +224,8 @@ class modExpenseReport extends DolibarrModules 'url'=>'/expensereport/index.php', 'langs'=>'trips', // Lang file to use (without .lang) by module. File must be in langs/code_CODE/ directory. 'position'=>100, - 'enabled'=>'1', // Define condition to show or hide menu entry. Use '$conf->mymodule->enabled' if entry must be visible if module is enabled. - 'perms'=>'1', // Use 'perms'=>'$user->rights->mymodule->level1->level2' if you want your menu with a permission rules + 'enabled'=>'$conf->expensereport->enabled', // Define condition to show or hide menu entry. Use '$conf->mymodule->enabled' if entry must be visible if module is enabled. + 'perms'=>'$user->rights->expensereport->lire', // Use 'perms'=>'$user->rights->mymodule->level1->level2' if you want your menu with a permission rules 'target'=>'', 'user'=>2); // 0=Menu for internal users, 1=external users, 2=both $r++; @@ -234,12 +234,12 @@ class modExpenseReport extends DolibarrModules 'type'=>'left', // This is a Left menu entry 'titre'=>'New', 'mainmenu'=>'accountancy', - 'leftmenu'=>'expensereport_detail', + 'leftmenu'=>'expensereport_detailnew', 'url'=>'/expensereport/card.php?action=create', 'langs'=>'trips', // Lang file to use (without .lang) by module. File must be in langs/code_CODE/ directory. 'position'=>100, - 'enabled'=>'1', // Define condition to show or hide menu entry. Use '$conf->mymodule->enabled' if entry must be visible if module is enabled. - 'perms'=>'1', // Use 'perms'=>'$user->rights->mymodule->level1->level2' if you want your menu with a permission rules + 'enabled'=>'$conf->expensereport->enabled', // Define condition to show or hide menu entry. Use '$conf->mymodule->enabled' if entry must be visible if module is enabled. + 'perms'=>'$user->rights->expensereport->creer', // Use 'perms'=>'$user->rights->mymodule->level1->level2' if you want your menu with a permission rules 'target'=>'', 'user'=>2); // 0=Menu for internal users, 1=external users, 2=both $r++; @@ -248,12 +248,26 @@ class modExpenseReport extends DolibarrModules 'type'=>'left', // This is a Left menu entry 'titre'=>'List', 'mainmenu'=>'accountancy', - 'leftmenu'=>'expensereport_detail', + 'leftmenu'=>'expensereport_detaillist', 'url'=>'/expensereport/list.php', 'langs'=>'trips', // Lang file to use (without .lang) by module. File must be in langs/code_CODE/ directory. 'position'=>100, - 'enabled'=>'1', // Define condition to show or hide menu entry. Use '$conf->mymodule->enabled' if entry must be visible if module is enabled. - 'perms'=>'1', // Use 'perms'=>'$user->rights->mymodule->level1->level2' if you want your menu with a permission rules + 'enabled'=>'$conf->expensereport->enabled', // Define condition to show or hide menu entry. Use '$conf->mymodule->enabled' if entry must be visible if module is enabled. + 'perms'=>'$user->rights->expensereport->lire', // Use 'perms'=>'$user->rights->mymodule->level1->level2' if you want your menu with a permission rules + 'target'=>'', + 'user'=>2); // 0=Menu for internal users, 1=external users, 2=both + $r++; + + $this->menu[$r]=array( 'fk_menu'=>'fk_mainmenu=accountancy,fk_leftmenu=expensereport_detaillist', // Use r=value where r is index key used for the parent menu entry (higher parent must be a top menu entry) + 'type'=>'left', // This is a Left menu entry + 'titre'=>'ListToApprove', + 'mainmenu'=>'accountancy', + 'leftmenu'=>'expensereport_detaillist_approve', + 'url'=>'/expensereport/list.php?search_state=2', + 'langs'=>'trips', // Lang file to use (without .lang) by module. File must be in langs/code_CODE/ directory. + 'position'=>100, + 'enabled'=>'$conf->expensereport->enabled', // Define condition to show or hide menu entry. Use '$conf->mymodule->enabled' if entry must be visible if module is enabled. + 'perms'=>'$user->rights->expensereport->lire', // Use 'perms'=>'$user->rights->mymodule->level1->level2' if you want your menu with a permission rules 'target'=>'', 'user'=>2); // 0=Menu for internal users, 1=external users, 2=both $r++; @@ -266,13 +280,14 @@ class modExpenseReport extends DolibarrModules 'url'=>'/expensereport/stats/index.php', 'langs'=>'trips', // Lang file to use (without .lang) by module. File must be in langs/code_CODE/ directory. 'position'=>100, - 'enabled'=>'1', // Define condition to show or hide menu entry. Use '$conf->mymodule->enabled' if entry must be visible if module is enabled. - 'perms'=>'1', // Use 'perms'=>'$user->rights->mymodule->level1->level2' if you want your menu with a permission rules + 'enabled'=>'$conf->expensereport->enabled', // Define condition to show or hide menu entry. Use '$conf->mymodule->enabled' if entry must be visible if module is enabled. + 'perms'=>'$user->rights->expensereport->lire', // Use 'perms'=>'$user->rights->mymodule->level1->level2' if you want your menu with a permission rules 'target'=>'', 'user'=>2); // 0=Menu for internal users, 1=external users, 2=both $r++; + // Disabled, not yet stable $this->menu[$r]=array( 'fk_menu'=>'fk_mainmenu=accountancy,fk_leftmenu=expensereport', // Use r=value where r is index key used for the parent menu entry (higher parent must be a top menu entry) 'type'=>'left', // This is a Left menu entry 'titre'=>'ExportTripCSV', @@ -282,7 +297,7 @@ class modExpenseReport extends DolibarrModules 'langs'=>'expensereport', // Lang file to use (without .lang) by module. File must be in langs/code_CODE/ directory. 'position'=>100, 'enabled'=>'$conf->global->DEPLACEMENT_TO_CLEAN', // Define condition to show or hide menu entry. Use '$conf->mymodule->enabled' if entry must be visible if module is enabled. - 'perms'=>'1', // Use 'perms'=>'$user->rights->mymodule->level1->level2' if you want your menu with a permission rules + 'perms'=>'$user->rights->expensereport->lire', // Use 'perms'=>'$user->rights->mymodule->level1->level2' if you want your menu with a permission rules 'target'=>'', 'user'=>2); // 0=Menu for internal users, 1=external users, 2=both $r++; @@ -296,7 +311,7 @@ class modExpenseReport extends DolibarrModules 'langs'=>'expensereport', // Lang file to use (without .lang) by module. File must be in langs/code_CODE/ directory. 'position'=>100, 'enabled'=>'$conf->global->DEPLACEMENT_TO_CLEAN', // Define condition to show or hide menu entry. Use '$conf->mymodule->enabled' if entry must be visible if module is enabled. - 'perms'=>'1', // Use 'perms'=>'$user->rights->mymodule->level1->level2' if you want your menu with a permission rules + 'perms'=>'$user->rights->expensereport->lire', // Use 'perms'=>'$user->rights->mymodule->level1->level2' if you want your menu with a permission rules 'target'=>'', 'user'=>2); // 0=Menu for internal users, 1=external users, 2=both $r++; diff --git a/htdocs/expensereport/card.php b/htdocs/expensereport/card.php index 871cbe22990..cfe3c86058b 100755 --- a/htdocs/expensereport/card.php +++ b/htdocs/expensereport/card.php @@ -105,7 +105,7 @@ if ($action == 'add' && $user->rights->expensereport->creer) $object->fk_user_validator = GETPOST('fk_user_validator','int'); $object->note = GETPOST('note'); - if ($object->periode_existe($user,dol_print_date($object->date_debut, 'dayrfc'),dol_print_date($object->date_fin, 'dayrfc'))) + if ($object->periode_existe($user,$object->date_debut,$object->date_fin)) { $error++; setEventMessage($langs->trans("ErrorDoubleDeclaration"),'errors'); @@ -398,8 +398,8 @@ if ($action == "confirm_refuse" && GETPOST('confirm')=="yes" && $id > 0 && $user { $object = new ExpenseReport($db); $object->fetch($id); - - $result = $object->set_refuse($user,GETPOST('detail_refuse')); + + $result = $object->setDeny($user,GETPOST('detail_refuse')); if ($result > 0) { if (! empty($conf->global->DEPLACEMENT_TO_CLEAN)) @@ -456,34 +456,34 @@ if ($action == "confirm_refuse" && GETPOST('confirm')=="yes" && $id > 0 && $user } //var_dump($user->id == $object->fk_user_validator);exit; -if ($action == "confirm_cancel" && GETPOST('confirm')=="yes" && !empty($_POST['detail_cancel']) && $id > 0 && $user->rights->expensereport->creer) +if ($action == "confirm_cancel" && GETPOST('confirm')=="yes" && GETPOST('detail_cancel') && $id > 0 && $user->rights->expensereport->creer) { $object = new ExpenseReport($db); $object->fetch($id); - + if ($user->id == $object->fk_user_valid || $user->id == $object->fk_user_author) { - $result = $object->set_cancel($user,$_POST['detail_cancel']); - + $result = $object->set_cancel($user,GETPOST('detail_cancel')); + if ($result > 0) { if (! empty($conf->global->DEPLACEMENT_TO_CLEAN)) { // Send mail - + // TO $destinataire = new User($db); $destinataire->fetch($object->fk_user_author); $emailTo = $destinataire->email; - + // FROM $expediteur = new User($db); $expediteur->fetch($object->fk_user_cancel); $emailFrom = $expediteur->email; - + // SUBJECT $subject = "' ERP - Note de frais annulée"; - + // CONTENT $message = "Bonjour {$destinataire->firstname},\n\n"; $message.= "Votre note de frais \"{$object->ref}\" vient d'être annulée.\n"; @@ -491,10 +491,10 @@ if ($action == "confirm_cancel" && GETPOST('confirm')=="yes" && !empty($_POST['d $message.= "- Motif d'annulation : {$_POST['detail_cancel']}\n"; $message.= "- Lien : {$dolibarr_main_url_root}/expensereport/card.php?id={$object->id}\n\n"; $message.= "Bien cordialement,\n' SI"; - + // PREPARE SEND $mailfile = new CMailFile($subject,$emailTo,$emailFrom,$message); - + if(!$mailfile->error) { // SEND @@ -523,10 +523,10 @@ if ($action == "confirm_cancel" && GETPOST('confirm')=="yes" && !empty($_POST['d } } -if ($action == "confirm_paid" && $_GET['confirm']=="yes" && $id > 0 && $user->rights->expensereport->to_paid) +if ($action == "confirm_paid" && GETPOST('confirm')=="yes" && $id > 0 && $user->rights->expensereport->to_paid) { $object = new ExpenseReport($db); - $object->fetch($id,$user); + $object->fetch($id); $result = $object->setPaid($user); if ($result > 0) @@ -665,7 +665,7 @@ if ($action == "addline") $vatrate=GETPOST('vatrate'); $object_ligne->fk_c_tva = $vatrate; $object_ligne->vatrate = $vatrate; - + $object_ligne->fk_projet = $fk_projet; if (! GETPOST('fk_c_type_fees') > 0) @@ -1129,22 +1129,24 @@ else if ($ret == 'html') print '
'; endif; - if ($action == 'cancel'): - $array_input = array(array('type'=>"text",'label'=>$langs->trans("Comment"),'name'=>"detail_cancel",'size'=>"50",'value'=>"")); - $ret=$form->form_confirm($_SEVER["PHP_SELF"]."?id=".$id,$langs->trans("ConfirmCancelTrip"),"","confirm_cancel",$array_input,"",0); - if ($ret == 'html') print '
'; - endif; + if ($action == 'cancel') + { + $array_input = array('text'=>$langs->trans("ConfirmCancelTrip"), array('type'=>"text",'label'=>$langs->trans("Comment"),'name'=>"detail_cancel",'size'=>"50",'value'=>"")); + $ret=$form->form_confirm($_SEVER["PHP_SELF"]."?id=".$id,$langs->trans("Cancel"),"","confirm_cancel",$array_input,"",1); + if ($ret == 'html') print '
'; + } if ($action == 'brouillonner'): $ret=$form->form_confirm($_SEVER["PHP_SELF"]."?id=".$id,$langs->trans("BrouillonnerTrip"),$langs->trans("ConfirmBrouillonnerTrip"),"confirm_brouillonner","","",1); if ($ret == 'html') print '
'; endif; - if ($action == 'refuse'): - $array_input = array('text'=>$langs->trans("ConfirmRefuseTrip"), array('type'=>"text",'label'=>$langs->trans("Comment"),'name'=>"detail_refuse",'size'=>"50",'value'=>"")); - $ret=$form->form_confirm($_SEVER["PHP_SELF"]."?id=".$id,$langs->trans("Deny"),'',"confirm_refuse",$array_input,"yes",1); - if ($ret == 'html') print '
'; - endif; + if ($action == 'refuse') // Deny + { + $array_input = array('text'=>$langs->trans("ConfirmRefuseTrip"), array('type'=>"text",'label'=>$langs->trans("Comment"),'name'=>"detail_refuse",'size'=>"50",'value'=>"")); + $ret=$form->form_confirm($_SEVER["PHP_SELF"]."?id=".$id,$langs->trans("Deny"),'',"confirm_refuse",$array_input,"yes",1); + if ($ret == 'html') print '
'; + } if ($action == 'delete_line') { @@ -1211,7 +1213,7 @@ else print '
'; print ''; - print ''; + print ''; print ''; if($object->fk_c_expensereport_statuts==6) { @@ -1227,8 +1229,8 @@ else print ''; print ''; } - - if($object->fk_c_expensereport_statuts<3) + + if($object->fk_c_expensereport_statuts<3) // informed { print ''; print ''; @@ -1259,24 +1261,24 @@ else print ''; print ''; print ''; - print ''; + print ''; print ''; } else { print ''; - print ''; + print ''; print ''; print ''; - print ''; - print ''; + print ''; + print ''; print ''; } @@ -1291,7 +1293,7 @@ else print ''; print ''; print ''; - print ''; print ''; @@ -1398,7 +1400,7 @@ else } print ''; } - + if ($action == 'editline' && $objp->rowid == GETPOST('rowid')) { //modif ligne!!!!! @@ -1681,7 +1683,7 @@ if ($action != 'create' && $action != 'edit') { print ''.$langs->trans('Cancel').''; } - + if($user->rights->expensereport->supprimer) { // Supprimer diff --git a/htdocs/expensereport/class/expensereport.class.php b/htdocs/expensereport/class/expensereport.class.php index 76534e94c2a..40be7298a1c 100755 --- a/htdocs/expensereport/class/expensereport.class.php +++ b/htdocs/expensereport/class/expensereport.class.php @@ -54,10 +54,14 @@ class ExpenseReport extends CommonObject var $fk_user_cancel; // Validation - var $date_valide; + var $date_valid; var $fk_user_valid; var $user_valid_infos; + // Approve + var $date_approve; + var $fk_user_approve; + // Paiement var $date_paiement; var $fk_user_paid; @@ -257,9 +261,9 @@ class ExpenseReport extends CommonObject $sql.= " d.detail_refuse, d.detail_cancel, d.fk_user_refuse, d.fk_user_cancel,"; // ACTIONS $sql.= " d.date_refuse, d.date_cancel,"; // ACTIONS $sql.= " d.total_ht, d.total_ttc, d.total_tva,"; // TOTAUX (int) - $sql.= " d.date_debut, d.date_fin, d.date_create, d.date_valide, d.date_paiement,"; // DATES (datetime) + $sql.= " d.date_debut, d.date_fin, d.date_create, d.date_valid, d.date_approve, d.date_paiement,"; // DATES (datetime) $sql.= " d.fk_user_author, d.fk_user_validator, d.fk_c_expensereport_statuts as status, d.fk_c_paiement,"; - $sql.= " d.fk_user_valid, d.fk_user_paid,"; // FOREING KEY 2 (int) + $sql.= " d.fk_user_valid, d.fk_user_approve, d.fk_user_paid,"; $sql.= " dp.libelle as libelle_paiement, dp.code as code_paiement"; // INNER JOIN paiement $sql.= " FROM ".MAIN_DB_PREFIX.$this->table_element." d LEFT JOIN ".MAIN_DB_PREFIX."c_paiement dp ON d.fk_c_paiement = dp.id"; if ($ref) $sql.= " WHERE d.ref = '".$this->db->escape($ref)."'"; @@ -282,20 +286,22 @@ class ExpenseReport extends CommonObject $this->detail_refuse = $obj->detail_refuse; $this->detail_cancel = $obj->detail_cancel; - $this->date_debut = $obj->date_debut; - $this->date_fin = $obj->date_fin; - $this->date_paiement = $obj->date_paiement; - $this->date_valide = $obj->date_valide; - $this->date_create = $obj->date_create; - $this->date_refuse = $obj->date_refuse; - $this->date_cancel = $obj->date_cancel; + $this->date_debut = $this->db->jdate($obj->date_debut); + $this->date_fin = $this->db->jdate($obj->date_fin); + $this->date_paiement = $this->db->jdate($obj->date_paiement); + $this->date_valid = $this->db->jdate($obj->date_valid); + $this->date_approve = $this->db->jdate($obj->date_approve); + $this->date_create = $this->db->jdate($obj->date_create); + $this->date_refuse = $this->db->jdate($obj->date_refuse); + $this->date_cancel = $this->db->jdate($obj->date_cancel); $this->fk_user_author = $obj->fk_user_author; $this->fk_user_validator = $obj->fk_user_validator; $this->fk_user_valid = $obj->fk_user_valid; - $this->fk_user_paid = $obj->fk_user_paid; $this->fk_user_refuse = $obj->fk_user_refuse; $this->fk_user_cancel = $obj->fk_user_cancel; + $this->fk_user_approve = $obj->fk_user_approve; + $this->fk_user_paid = $obj->fk_user_paid; $user_author = new User($this->db); if ($this->fk_user_author > 0) $user_author->fetch($this->fk_user_author); @@ -404,10 +410,12 @@ class ExpenseReport extends CommonObject $sql = "SELECT f.rowid,"; $sql.= " f.date_create as datec,"; $sql.= " f.tms as date_modification,"; - $sql.= " f.date_valide as datev,"; - $sql.= " f.fk_user_author,"; + $sql.= " f.date_valid as datev,"; + $sql.= " f.date_approve as datea,"; + $sql.= " f.fk_user_author as fk_user_creation,"; $sql.= " f.fk_user_modif as fk_user_modification,"; - $sql.= " f.fk_user_validator"; + $sql.= " f.fk_user_valid,"; + $sql.= " f.fk_user_approve"; $sql.= " FROM ".MAIN_DB_PREFIX."expensereport as f"; $sql.= " WHERE f.rowid = ".$id; $sql.= " AND f.entity = ".$conf->entity; @@ -424,11 +432,18 @@ class ExpenseReport extends CommonObject $this->date_creation = $this->db->jdate($obj->datec); $this->date_modification = $this->db->jdate($obj->date_modification); $this->date_validation = $this->db->jdate($obj->datev); + $this->date_approbation = $this->db->jdate($obj->datea); $cuser = new User($this->db); $cuser->fetch($obj->fk_user_author); $this->user_creation = $cuser; + if ($obj->fk_user_creation) + { + $cuser = new User($this->db); + $cuser->fetch($obj->fk_user_creation); + $this->user_creation = $cuser; + } if ($obj->fk_user_valid) { $vuser = new User($this->db); @@ -739,14 +754,14 @@ class ExpenseReport extends CommonObject $sql.= ' WHERE rowid = '.$this->id; $result = $this->db->query($sql); $objp = $this->db->fetch_object($result); - $this->date_debut = $objp->date_debut; - $expld_date_debut = explode("-",$this->date_debut); - $this->date_debut = $expld_date_debut[0].$expld_date_debut[1].$expld_date_debut[2]; + $this->date_debut = $this->db->jdate($objp->date_debut); // Création du ref_number suivant if($ref_next) { - $this->ref = strtoupper($user->login).$expld_car."NDF".$this->ref.$expld_car.$this->date_debut; + $prefix="ER"; + if (! empty($conf->global->EXPENSE_REPORT_PREFIX)) $prefix=$conf->global->EXPENSE_REPORT_PREFIX; + $this->ref = strtoupper($user->login).$expld_car.$prefix.$this->ref.$expld_car.dol_print_date($this->date_debut,'%y%m%d'); } if ($this->fk_c_expensereport_statuts != 2) @@ -793,9 +808,7 @@ class ExpenseReport extends CommonObject $objp = $this->db->fetch_object($result); - $this->date_debut = $objp->date_debut; - $expld_date_debut = explode("-",$this->date_debut); - $this->date_debut = $expld_date_debut[0].$expld_date_debut[1].$expld_date_debut[2]; + $this->date_debut = $this->db->jdate($objp->date_debut); if ($this->fk_c_expensereport_statuts != 2) { @@ -829,13 +842,15 @@ class ExpenseReport extends CommonObject */ function setApproved($user) { - // date de validation - $this->date_valide = $this->db->idate(gmmktime()); + $now=dol_now(); + + // date approval + $this->date_approve = $this->db->idate($now); if ($this->fk_c_expensereport_statuts != 5) { $sql = 'UPDATE '.MAIN_DB_PREFIX.$this->table_element; $sql.= " SET ref = '".$this->ref."', fk_c_expensereport_statuts = 5, fk_user_approve = ".$user->id.","; - $sql.= " date_valide='".$this->date_valide."'"; + $sql.= " date_approve='".$this->date_approve."'"; $sql.= ' WHERE rowid = '.$this->id; if ($this->db->query($sql)) { @@ -854,15 +869,15 @@ class ExpenseReport extends CommonObject } /** - * set_refuse + * setDeny * * @param User $user User * @param Details $details Details */ - function set_refuse($user,$details) + function setDeny($user,$details) { $now = dol_now(); - + // date de refus if ($this->fk_c_expensereport_statuts != 99) { @@ -870,6 +885,7 @@ class ExpenseReport extends CommonObject $sql.= " SET ref = '".$this->ref."', fk_c_expensereport_statuts = 99, fk_user_refuse = ".$user->id.","; $sql.= " date_refuse='".$this->db->idate($now)."',"; $sql.= " detail_refuse='".$this->db->escape($details)."'"; + $sql.= " fk_user_approve=NULL,"; $sql.= ' WHERE rowid = '.$this->id; if ($this->db->query($sql)) { @@ -887,7 +903,7 @@ class ExpenseReport extends CommonObject } else { - dol_syslog(get_class($this)."::set_refuse expensereport already with refuse status", LOG_WARNING); + dol_syslog(get_class($this)."::setDeny expensereport already with refuse status", LOG_WARNING); } } @@ -899,16 +915,17 @@ class ExpenseReport extends CommonObject */ function setPaid($user) { - $this->date_paiement = $this->db->idate(gmmktime()); + $now= dol_now(); + + $this->date_paiement = $this->db->idate($now); if ($this->fk_c_expensereport_statuts != 6) { $sql = 'UPDATE '.MAIN_DB_PREFIX.$this->table_element; $sql.= " SET fk_c_expensereport_statuts = 6, fk_user_paid = ".$user->id.","; - $sql.= " date_paiement='".$this->date_paiement."'"; + $sql.= " date_paiement='".$this->db->idate($this->date_paiement)."'"; $sql.= ' WHERE rowid = '.$this->id; dol_syslog(get_class($this)."::setPaid sql=".$sql, LOG_DEBUG); - if ($this->db->query($sql)) { return 1; @@ -1236,9 +1253,9 @@ class ExpenseReport extends CommonObject * @param Date $date_fin End date * @return int <0 if KO, >0 if OK */ - function periode_existe($user,$date_debut,$date_fin) + function periode_existe($user, $date_debut, $date_fin) { - $sql = "SELECT rowid,date_debut,date_fin"; + $sql = "SELECT rowid, date_debut, date_fin"; $sql.= " FROM ".MAIN_DB_PREFIX.$this->table_element; $sql.= " WHERE fk_user_author = '{$user->id}'"; @@ -1250,10 +1267,8 @@ class ExpenseReport extends CommonObject if ($num_lignes>0) { - $date_d_form = explode("-",$date_debut); // 1 - $date_f_form = explode("-",$date_fin); // 2 - $date_d_form = mktime(12,0,0,$date_d_form[1],$date_d_form[2],$date_d_form[0]); - $date_f_form = mktime(12,0,0,$date_f_form[1],$date_f_form[2],$date_f_form[0]); + $date_d_form = $date_debut; + $date_f_form = $date_fin; $existe = false; @@ -1261,12 +1276,10 @@ class ExpenseReport extends CommonObject { $objp = $this->db->fetch_object($result); - $date_d_req = explode("-",$objp->date_debut); // 3 - $date_f_req = explode("-",$objp->date_fin); // 4 - $date_d_req = mktime(12,0,0,$date_d_req[1],$date_d_req[2],$date_d_req[0]); - $date_f_req = mktime(12,0,0,$date_f_req[1],$date_f_req[2],$date_f_req[0]); + $date_d_req = $this->db->jdate($objp->date_debut); // 3 + $date_f_req = $this->db->jdate($objp->date_fin); // 4 - if(!($date_f_form < $date_d_req OR $date_d_form > $date_f_req)) $existe = true; + if (!($date_f_form < $date_d_req || $date_d_form > $date_f_req)) $existe = true; $i++; } @@ -1374,14 +1387,12 @@ class ExpenseReportLine function fetch($rowid) { $sql = 'SELECT fde.rowid, fde.fk_expensereport, fde.fk_c_type_fees, fde.fk_projet, fde.date,'; - $sql.= ' fde.fk_c_tva, fde.comments, fde.qty, fde.value_unit, fde.total_ht, fde.total_tva, fde.total_ttc,'; + $sql.= ' fde.fk_c_tva as tva_taux, fde.comments, fde.qty, fde.value_unit, fde.total_ht, fde.total_tva, fde.total_ttc,'; $sql.= ' ctf.code as type_fees_code, ctf.label as type_fees_libelle,'; - $sql.= ' pjt.rowid as projet_id, pjt.title as projet_title, pjt.ref as projet_ref,'; - $sql.= ' tva.rowid as tva_id, tva.taux as tva_taux'; + $sql.= ' pjt.rowid as projet_id, pjt.title as projet_title, pjt.ref as projet_ref'; $sql.= ' FROM '.MAIN_DB_PREFIX.'expensereport_det fde'; $sql.= ' INNER JOIN '.MAIN_DB_PREFIX.'c_type_fees ctf ON fde.fk_c_type_fees=ctf.id'; $sql.= ' LEFT JOIN '.MAIN_DB_PREFIX.'projet pjt ON fde.fk_projet=pjt.rowid'; - $sql.= ' INNER JOIN '.MAIN_DB_PREFIX.'c_tva tva ON fde.fk_c_tva=tva.rowid'; $sql.= ' WHERE fde.rowid = '.$rowid; $result = $this->db->query($sql); diff --git a/htdocs/expensereport/class/expensereportstats.class.php b/htdocs/expensereport/class/expensereportstats.class.php index 64d0aaf01ed..e12b4ed2a79 100644 --- a/htdocs/expensereport/class/expensereportstats.class.php +++ b/htdocs/expensereport/class/expensereportstats.class.php @@ -59,7 +59,7 @@ class ExpenseReportStats extends Stats $this->from = MAIN_DB_PREFIX.$object->table_element; $this->field='total_ht'; - $this->where = " fk_c_expensereport_statuts > 0 and date_valide > '2000-01-01'"; + $this->where = " fk_c_expensereport_statuts > 0 and date_valid > '2000-01-01'"; //$this->where.= " AND entity = ".$conf->entity; if ($this->socid) { @@ -70,13 +70,13 @@ class ExpenseReportStats extends Stats /** - * Renvoie le nombre de facture par annee + * Return nb of expense report per year * * @return array Array of values */ function getNbByYear() { - $sql = "SELECT YEAR(date_valide) as dm, count(*)"; + $sql = "SELECT YEAR(date_valid) as dm, count(*)"; $sql.= " FROM ".$this->from; $sql.= " GROUP BY dm DESC"; $sql.= " WHERE ".$this->where; @@ -93,9 +93,9 @@ class ExpenseReportStats extends Stats */ function getNbByMonth($year) { - $sql = "SELECT MONTH(date_valide) as dm, count(*)"; + $sql = "SELECT MONTH(date_valid) as dm, count(*)"; $sql.= " FROM ".$this->from; - $sql.= " WHERE YEAR(date_valide) = ".$year; + $sql.= " WHERE YEAR(date_valid) = ".$year; $sql.= " AND ".$this->where; $sql.= " GROUP BY dm"; $sql.= $this->db->order('dm','DESC'); @@ -114,9 +114,9 @@ class ExpenseReportStats extends Stats */ function getAmountByMonth($year) { - $sql = "SELECT date_format(date_valide,'%m') as dm, sum(".$this->field.")"; + $sql = "SELECT date_format(date_valid,'%m') as dm, sum(".$this->field.")"; $sql.= " FROM ".$this->from; - $sql.= " WHERE date_format(date_valide,'%Y') = '".$year."'"; + $sql.= " WHERE date_format(date_valid,'%Y') = '".$year."'"; $sql.= " AND ".$this->where; $sql.= " GROUP BY dm"; $sql.= $this->db->order('dm','DESC'); @@ -134,9 +134,9 @@ class ExpenseReportStats extends Stats */ function getAverageByMonth($year) { - $sql = "SELECT date_format(date_valide,'%m') as dm, avg(".$this->field.")"; + $sql = "SELECT date_format(date_valid,'%m') as dm, avg(".$this->field.")"; $sql.= " FROM ".$this->from; - $sql.= " WHERE date_format(date_valide,'%Y') = '".$year."'"; + $sql.= " WHERE date_format(date_valid,'%Y') = '".$year."'"; $sql.= " AND ".$this->where; $sql.= " GROUP BY dm"; $sql.= $this->db->order('dm','DESC'); @@ -151,7 +151,7 @@ class ExpenseReportStats extends Stats */ function getAllByYear() { - $sql = "SELECT date_format(date_valide,'%Y') as year, count(*) as nb, sum(".$this->field.") as total, avg(".$this->field.") as avg"; + $sql = "SELECT date_format(date_valid,'%Y') as year, count(*) as nb, sum(".$this->field.") as total, avg(".$this->field.") as avg"; $sql.= " FROM ".$this->from; $sql.= " WHERE ".$this->where; $sql.= " GROUP BY year"; diff --git a/htdocs/expensereport/synchro_compta.php b/htdocs/expensereport/synchro_compta.php index 211f5c4cc0a..11c91d314fb 100755 --- a/htdocs/expensereport/synchro_compta.php +++ b/htdocs/expensereport/synchro_compta.php @@ -137,12 +137,12 @@ else: print ' '; print ""; - $sql = "SELECT d.fk_bank_account, d.ref, d.rowid, d.date_valide, d.fk_user_author, d.total_ttc, d.integration_compta, d.fk_c_expensereport_statuts"; + $sql = "SELECT d.fk_bank_account, d.ref, d.rowid, d.date_valid, d.fk_user_author, d.total_ttc, d.integration_compta, d.fk_c_expensereport_statuts"; $sql.= " ,CONCAT(u.firstname,' ',u.lastname) as declarant_NDF"; $sql.= " FROM ".MAIN_DB_PREFIX."expensereport d"; $sql.= " INNER JOIN ".MAIN_DB_PREFIX."user u ON d.fk_user_author = u.rowid"; $sql.= " WHERE d.fk_c_expensereport_statuts = 6"; - $sql.= " ORDER BY d.date_valide DESC"; + $sql.= " ORDER BY d.date_valid DESC"; $resql=$db->query($sql); if ($resql): @@ -170,7 +170,7 @@ else: $var=!$var; print ""; print ''; - print ''; + print ''; print ''; print ''; diff --git a/htdocs/install/mysql/migration/3.7.0-3.8.0.sql b/htdocs/install/mysql/migration/3.7.0-3.8.0.sql index a697096874a..13c948bea56 100755 --- a/htdocs/install/mysql/migration/3.7.0-3.8.0.sql +++ b/htdocs/install/mysql/migration/3.7.0-3.8.0.sql @@ -118,10 +118,9 @@ ALTER TABLE llx_stock_mouvement ADD COLUMN sellby date DEFAULT NULL; - CREATE TABLE llx_expensereport ( rowid integer NOT NULL AUTO_INCREMENT PRIMARY KEY, - ref varchar(50) NOT NULL, + ref varchar(50) NOT NULL, entity integer DEFAULT 1 NOT NULL, -- multi company id ref_number_int integer DEFAULT NULL, ref_ext integer, @@ -132,30 +131,33 @@ CREATE TABLE llx_expensereport ( total_ttc double(24,8) DEFAULT 0, date_debut date NOT NULL, date_fin date NOT NULL, - date_paiement datetime, - date_valide datetime, date_create datetime NOT NULL, + date_valid datetime, + date_approve datetime, + date_refuse datetime, + date_cancel datetime, + date_paiement datetime, tms timestamp, fk_user_author integer NOT NULL, fk_user_modif integer DEFAULT NULL, + fk_user_valid integer DEFAULT NULL, fk_user_validator integer DEFAULT NULL, + fk_user_approve integer DEFAULT NULL, + fk_user_refuse integer DEFAULT NULL, + fk_user_cancel integer DEFAULT NULL, + fk_user_paid integer DEFAULT NULL, fk_c_expensereport_statuts integer NOT NULL, -- 1=brouillon, 2=validé (attente approb), 4=annulé, 5=approuvé, 6=payed, 99=refusé fk_c_paiement integer DEFAULT NULL, note text, note_private text, - fk_user_valid integer DEFAULT NULL, - fk_user_paid integer DEFAULT NULL, detail_refuse varchar(255) DEFAULT NULL, - date_cancel datetime, - date_refuse datetime, detail_cancel varchar(255) DEFAULT NULL, - fk_user_cancel integer DEFAULT NULL, - fk_user_refuse integer DEFAULT NULL, - integration_compta integer DEFAULT NULL, + integration_compta integer DEFAULT NULL, -- not used fk_bank_account integer DEFAULT NULL, model_pdf varchar(50) DEFAULT NULL ) ENGINE=innodb; + CREATE TABLE llx_expensereport_det ( rowid integer NOT NULL AUTO_INCREMENT PRIMARY KEY, diff --git a/htdocs/install/mysql/tables/llx_expensereport.sql b/htdocs/install/mysql/tables/llx_expensereport.sql index 5fd3d2a3998..7224ec38b61 100755 --- a/htdocs/install/mysql/tables/llx_expensereport.sql +++ b/htdocs/install/mysql/tables/llx_expensereport.sql @@ -29,27 +29,28 @@ CREATE TABLE llx_expensereport ( total_ttc double(24,8) DEFAULT 0, date_debut date NOT NULL, date_fin date NOT NULL, - date_paiement datetime, - date_valide datetime, date_create datetime NOT NULL, + date_valid datetime, + date_approve datetime, + date_refuse datetime, + date_cancel datetime, + date_paiement datetime, tms timestamp, fk_user_author integer NOT NULL, fk_user_modif integer DEFAULT NULL, + fk_user_valid integer DEFAULT NULL, fk_user_validator integer DEFAULT NULL, + fk_user_approve integer DEFAULT NULL, + fk_user_refuse integer DEFAULT NULL, + fk_user_cancel integer DEFAULT NULL, + fk_user_paid integer DEFAULT NULL, fk_c_expensereport_statuts integer NOT NULL, -- 1=brouillon, 2=validé (attente approb), 4=annulé, 5=approuvé, 6=payed, 99=refusé fk_c_paiement integer DEFAULT NULL, note text, note_private text, - fk_user_valid integer DEFAULT NULL, - fk_user_approve integer DEFAULT NULL, - fk_user_paid integer DEFAULT NULL, detail_refuse varchar(255) DEFAULT NULL, - date_cancel datetime, - date_refuse datetime, detail_cancel varchar(255) DEFAULT NULL, - fk_user_cancel integer DEFAULT NULL, - fk_user_refuse integer DEFAULT NULL, - integration_compta integer DEFAULT NULL, + integration_compta integer DEFAULT NULL, -- not used fk_bank_account integer DEFAULT NULL, model_pdf varchar(50) DEFAULT NULL ) ENGINE=innodb; diff --git a/htdocs/langs/en_US/trips.lang b/htdocs/langs/en_US/trips.lang index b5e950b6a0c..c31b902805e 100644 --- a/htdocs/langs/en_US/trips.lang +++ b/htdocs/langs/en_US/trips.lang @@ -1,4 +1,6 @@ # Dolibarr language file - Source file is en_US - trips +ExpenseReport=Expense report +ExpenseReports=Expense reports Trip=Expense report Trips=Expense reports TripsAndExpenses=Expenses reports @@ -14,6 +16,7 @@ FeesKilometersOrAmout=Amount or kilometers DeleteTrip=Delete expense report ConfirmDeleteTrip=Are you sure you want to delete this expense report ? ListTripsAndExpenses=List of expense reports +ListToApprove=Waiting for approval ExpensesArea=Expense reports area SearchATripAndExpense=Search an expense report ClassifyRefunded=Classify 'Refunded' @@ -28,10 +31,12 @@ DeleteLine=Delete a ligne of the expense report ConfirmDeleteLine=Are you sure you want to delete this line ? TF_OTHER=Other +TF_TRANSPORTATION=Transportation TF_LUNCH=Lunch TF_METRO=Metro TF_TRAIN=Train TF_BUS=Bus +TF_CAR=Car TF_PEAGE=Toll TF_ESSENCE=Fuel TF_HOTEL=Hostel diff --git a/htdocs/projet/class/project.class.php b/htdocs/projet/class/project.class.php index 0b80c7b9cd7..d73187ce822 100644 --- a/htdocs/projet/class/project.class.php +++ b/htdocs/projet/class/project.class.php @@ -421,7 +421,7 @@ class Project extends CommonObject } if ($type == 'expensereport') { - $sql = "SELECT e.rowid FROM " . MAIN_DB_PREFIX . "expensereport as e, " . MAIN_DB_PREFIX . "expensereport_det as ed WHERE e.rowid = ed.fk_expensereport AND ed.fk_projet=" . $this->id; + $sql = "SELECT ed.rowid FROM " . MAIN_DB_PREFIX . "expensereport as e, " . MAIN_DB_PREFIX . "expensereport_det as ed WHERE e.rowid = ed.fk_expensereport AND ed.fk_projet=" . $this->id; } if ($dates > 0) { @@ -511,7 +511,7 @@ class Project extends CommonObject break; } } - + // Delete tasks if (! $error) { diff --git a/htdocs/projet/element.php b/htdocs/projet/element.php index 226f4afb573..68978cc671f 100644 --- a/htdocs/projet/element.php +++ b/htdocs/projet/element.php @@ -44,11 +44,12 @@ if (! empty($conf->agenda->enabled)) require_once DOL_DOCUMENT_ROOT.'/comm/ $langs->load("projects"); $langs->load("companies"); $langs->load("suppliers"); -if (! empty($conf->facture->enabled)) $langs->load("bills"); -if (! empty($conf->commande->enabled)) $langs->load("orders"); -if (! empty($conf->propal->enabled)) $langs->load("propal"); -if (! empty($conf->ficheinter->enabled)) $langs->load("interventions"); -if (! empty($conf->deplacement->enabled)) $langs->load("trips"); +if (! empty($conf->facture->enabled)) $langs->load("bills"); +if (! empty($conf->commande->enabled)) $langs->load("orders"); +if (! empty($conf->propal->enabled)) $langs->load("propal"); +if (! empty($conf->ficheinter->enabled)) $langs->load("interventions"); +if (! empty($conf->deplacement->enabled)) $langs->load("trips"); +if (! empty($conf->expensereport->enabled)) $langs->load("trips"); $projectid=GETPOST('id','int'); $ref=GETPOST('ref','alpha'); @@ -237,10 +238,10 @@ $listofreferent=array( 'name'=>"ExpenseReports", 'title'=>"ListExpenseReportsAssociatedProject", 'class'=>'ExpenseReportLine', - 'table'=>'expensereport', + 'table'=>'expensereport_det', 'datefieldname'=>'date', 'margin'=>'minus', - 'disableamount'=>1, + 'disableamount'=>0, 'test'=>$conf->expensereport->enabled && $user->rights->expensereport->lire), 'agenda'=>array( 'name'=>"Agenda", @@ -311,10 +312,12 @@ foreach ($listofreferent as $key => $value) print_titre($langs->trans($title)); $selectList=$formproject->select_element($tablename,$project->thirdparty->id); - - if (!$selectList || ($selectList<0)) { - setEventMessage($formproject->error,'errors'); - } else { + if (! $selectList || ($selectList<0)) + { + setEventMessages($formproject->error,$formproject->errors,'errors'); + } + else + { print ''; print ''; print ''; @@ -329,9 +332,14 @@ foreach ($listofreferent as $key => $value) print '
'.$langs->trans("Ref").''; diff --git a/htdocs/install/mysql/tables/llx_expensereport.sql b/htdocs/install/mysql/tables/llx_expensereport.sql index e998343e6db..5fd3d2a3998 100755 --- a/htdocs/install/mysql/tables/llx_expensereport.sql +++ b/htdocs/install/mysql/tables/llx_expensereport.sql @@ -41,6 +41,7 @@ CREATE TABLE llx_expensereport ( note text, note_private text, fk_user_valid integer DEFAULT NULL, + fk_user_approve integer DEFAULT NULL, fk_user_paid integer DEFAULT NULL, detail_refuse varchar(255) DEFAULT NULL, date_cancel datetime, diff --git a/htdocs/install/mysql/tables/llx_expensereport_det.sql b/htdocs/install/mysql/tables/llx_expensereport_det.sql index 98e7c33265e..418f1ce6cc5 100644 --- a/htdocs/install/mysql/tables/llx_expensereport_det.sql +++ b/htdocs/install/mysql/tables/llx_expensereport_det.sql @@ -21,7 +21,7 @@ CREATE TABLE llx_expensereport_det rowid integer NOT NULL AUTO_INCREMENT PRIMARY KEY, fk_expensereport integer NOT NULL, fk_c_type_fees integer NOT NULL, - fk_projet integer NOT NULL, + fk_projet integer, fk_c_tva integer NOT NULL, comments text NOT NULL, product_type integer DEFAULT -1, diff --git a/htdocs/langs/en_US/suppliers.lang b/htdocs/langs/en_US/suppliers.lang index 5919ffea61e..fb7dbd26032 100644 --- a/htdocs/langs/en_US/suppliers.lang +++ b/htdocs/langs/en_US/suppliers.lang @@ -30,7 +30,7 @@ ExportDataset_fournisseur_2=Supplier invoices and payments ExportDataset_fournisseur_3=Supplier orders and order lines ApproveThisOrder=Approve this order ConfirmApproveThisOrder=Are you sure you want to approve order %s ? -DenyingThisOrder=Denying this order +DenyingThisOrder=Deny this order ConfirmDenyingThisOrder=Are you sure you want to deny this order %s ? ConfirmCancelThisOrder=Are you sure you want to cancel this order %s ? AddCustomerOrder=Create customer order diff --git a/htdocs/langs/en_US/trips.lang b/htdocs/langs/en_US/trips.lang index e34f58715d8..b5e950b6a0c 100644 --- a/htdocs/langs/en_US/trips.lang +++ b/htdocs/langs/en_US/trips.lang @@ -37,71 +37,63 @@ TF_ESSENCE=Fuel TF_HOTEL=Hostel TF_TAXI=Taxi -ErrorDoubleDeclaration=ERREUR : Vous avez déclaré au moins une note de frais dans le même intervalle. -ListTripsAndExpenses=Liste des notes de frais -AucuneNDF=Il n'y a aucune note de frais déclarée correspondante à votre recherche! -AucuneLigne=Il n'y a aucune ligne de déclarée dans cette note de frais! -AddLine=Ajouter une ligne -AddLineMini=Ajouter -TotalHT=Montant HT -TotalTTC=Montant TTC -TotalTVA=Total TVA +ErrorDoubleDeclaration=You have declared another expense report into a similar date range. +ListTripsAndExpenses=List of expense reports +AucuneNDF=No expense reports found for this criteria +AucuneLigne=There is no expense report declared yet +AddLine=Add a line +AddLineMini=Add -Date_DEBUT=Date de début période -Date_FIN=Date de fin période -ModePaiement=Mode de paiement +Date_DEBUT=Period date start +Date_FIN=Period date end +ModePaiement=Payment mode Note=Note -Project=Projet +Project=Project -VALIDATOR=Utilisateur informé pour validation -VALIDOR=Validée par -AUTHOR=Enregistrée par -AUTHORPAIEMENT=Payée par -REFUSEUR=Refusée par -CANCEL_USER=Annulée par +VALIDATOR=User to inform for approbation +VALIDOR=Approved by +AUTHOR=Recorded by +AUTHORPAIEMENT=Paied by +REFUSEUR=Denied by +CANCEL_USER=Canceled by -MOTIF_REFUS=Motif de refus -MOTIF_CANCEL=Motif d'annulation +MOTIF_REFUS=Reason +MOTIF_CANCEL=Reason -DATE_REFUS=Date du refus -DATE_CANCEL=Date annulation -DATE_VALIDE=Date de validation -DATE_PAIEMENT=Date de paiement -DATE_SAVE=Date d'enregistrement +DATE_REFUS=Deny date +DATE_CANCEL=Cancelation date +DATE_VALIDE=Validation date +DATE_PAIEMENT=Payment date +DATE_SAVE=Recording date -REFUSE=Refuse +Deny=Deny TO_PAID=Pay BROUILLONNER=Reopen SendToValid=Sent to approve ModifyInfoGen=Edit +ValidateAndSubmit=Validate and submit for approval -NOT_VALIDATOR=Vous n'êtes pas la personne habilitée à valider cette note de frais! -NOT_AUTHOR=Vous n'êtes pas l'auteur de cette note de frais, impossible de réaliser l'opération voulue! -NOT_VALIDOR=Vous n'êtes pas le valideur de cette note de frais, vous ne pouvez donc pas réaliser cette opération! -NotUserRightToView=Vous n'avez pas le droit d'afficher cette note de frais. +NOT_VALIDATOR=You are not allowed to approve this expense report +NOT_AUTHOR=You are not the author of this expense report. Operation cancelled. -RefuseTrip=Refuser une note de frais -ConfirmRefuseTrip=Êtes vous sûr de vouloir refuser cette note de frais ? +RefuseTrip=Deny an expense report +ConfirmRefuseTrip=Are you sure you want to deny this expense report ? -ValideTrip=Valider une note de frais -ConfirmValideTrip=Êtes vous sûr de vouloir valider cette note de frais ? +ValideTrip=Approve expense report +ConfirmValideTrip=Are you sure you want to approve this expense report ? -PaidTrip=Payer une note de frais -ConfirmPaidTrip=Êtes vous sûr de vouloir payer cette note de frais ? +PaidTrip=Pay an expense report +ConfirmPaidTrip=Are you sure you want to change status of this expense report to "Paid" ? -CancelTrip=Annuler une note de frais -ConfirmCancelTrip=Êtes vous sûr de vouloir annuler cette note de frais ? +CancelTrip=Cancel an expense report +ConfirmCancelTrip=Are you sure you want to cancel this expense report ? -BrouillonnerTrip=Remettre une note de frais en brouillon -ConfirmBrouillonnerTrip=Êtes vous sûr de vouloir remettre cette note de frais en brouillon ? +BrouillonnerTrip=Move back expense report to status "Draft"n +ConfirmBrouillonnerTrip=Are you sure you want to move this expense report to status "Draft" ? -SaveTrip=Enregistrement de votre note de frais -ConfirmSaveTrip=Êtes vous sûr de vouloir enregistrer cette note de frais? (elle sera transmise par mail pour validation) +SaveTrip=Validate expense report +ConfirmSaveTrip=Are you sure you want to validate this expense report ? -INFOS_DATES=Infos Workflow -INFOS_NDF=Infos générales note de frais - -StatsTrip=Statistiques Synchro_Compta=NDF <-> Compte TripSynch=Synchronisation : Notes de frais <-> Compte courant diff --git a/htdocs/langs/fr_FR/expensereport.lang b/htdocs/langs/fr_FR/expensereport.lang deleted file mode 100755 index 6af74164f2d..00000000000 --- a/htdocs/langs/fr_FR/expensereport.lang +++ /dev/null @@ -1,137 +0,0 @@ -# Dolibarr language file - fr_FR - trips -CHARSET=UTF-8 -Trip=Note de frais -Trips=Notes de frais -TripsAndExpenses=Notes de frais -TripId=Id note de frais -TripCard=Fiche note de frais -AddTrip=Ajouter note de frais -ListOfTrips=Liste des notes de frais -ListOfFees=Liste des notes de frais -NewTrip=Nouvelle note de frais -CancelAddTrip=Annuler -ExportTripCSV=Exporter en CSV -AnyOtherInThisListCanValidate=Toute personne dans la liste pourra valider. Le choix détermine qui sera informé. -TripSociete=Informations société -TripSalarie=Informations salarié -TripNDF=Informations note de frais - -DeleteTrip=Supprimer note de frais -ConfirmDeleteTrip=Êtes vous sûr de vouloir supprimer cette note de frais ? - -DeleteLine=Supprimer une ligne de la note de frais -ConfirmDeleteLine=Êtes vous sûr de vouloir supprimer cette ligne ? - -TF_OTHER=Autre -TF_LUNCH=Repas -TF_METRO=Métro -TF_TRAIN=Train -TF_RATP=Ratp -TF_BUS=Bus -TF_PEAGE=Péage -TF_ESSENCE=Essence -TF_SNCF=SNCF (Autre) -TF_HOTEL=Hôtel -TF_TRANSPORT=SNCF (Train) -TF_TAXI=Taxi - -ErrorDoubleDeclaration=ERREUR : Vous avez déclaré au moins une note de frais dans le même intervalle. -ListTripsAndExpenses=Liste des notes de frais -AucuneNDF=Il n'y a aucune note de frais déclarée correspondante à votre recherche! -AucuneLigne=Il n'y a aucune ligne de déclarée dans cette note de frais! -AddLine=Ajouter une ligne -AddLineMini=Ajouter -TotalHT=Montant HT -TotalTTC=Montant TTC -TotalTVA=Total TVA - -Date_DEBUT=Date de début période -Date_FIN=Date de fin période -ModePaiement=Mode de paiement -Note=Note -Project=Projet - -VALIDATOR=Utilisateur informé pour validation -VALIDOR=Validée par -AUTHOR=Enregistrée par -AUTHORPAIEMENT=Payée par -REFUSEUR=Refusée par -CANCEL_USER=Annulée par - -MOTIF_REFUS=Motif de refus -MOTIF_CANCEL=Motif d'annulation - -DATE_REFUS=Date du refus -DATE_CANCEL=Date annulation -DATE_VALIDE=Date de validation -DATE_PAIEMENT=Date de paiement -DATE_SAVE=Date d'enregistrement - -VALIDATE=Valider -REFUSE=Refuser -CANCEL=Annuler -TO_PAID=Payer -BROUILLONNER=Remettre en brouillon -SendToValid=Envoyer en validation -ModifyInfoGen=Modifier les infos générales - -Module20130304Name=Notes de frais -Module20130304Desc=Gestion des notes de frais et déplacement (par ') - -NOT_VALIDATOR=Vous n'êtes pas la personne habilitée à valider cette note de frais! -NOT_AUTHOR=Vous n'êtes pas l'auteur de cette note de frais, impossible de réaliser l'opération voulue! -NOT_VALIDOR=Vous n'êtes pas le valideur de cette note de frais, vous ne pouvez donc pas réaliser cette opération! -NotUserRightToView=Vous n'avez pas le droit d'afficher cette note de frais. - -RefuseTrip=Refuser une note de frais -ConfirmRefuseTrip=Êtes vous sûr de vouloir refuser cette note de frais ? - -ValideTrip=Valider une note de frais -ConfirmValideTrip=Êtes vous sûr de vouloir valider cette note de frais ? - -PaidTrip=Payer une note de frais -ConfirmPaidTrip=Êtes vous sûr de vouloir payer cette note de frais ? - -CancelTrip=Annuler une note de frais -ConfirmCancelTrip=Êtes vous sûr de vouloir annuler cette note de frais ? - -BrouillonnerTrip=Remettre une note de frais en brouillon -ConfirmBrouillonnerTrip=Êtes vous sûr de vouloir remettre cette note de frais en brouillon ? - -SaveTrip=Enregistrement de votre note de frais -ConfirmSaveTrip=Êtes vous sûr de vouloir enregistrer cette note de frais? (elle sera transmise par mail pour validation) - -INFOS_DATES=Infos Workflow -INFOS_NDF=Infos générales note de frais - -EURO=€ -PriceUNITAIRE=Prix U. (TTC) - -StatsTrip=Statistiques -Synchro_Compta=NDF <-> Compte - -TripSynch=Synchronisation : Notes de frais <-> Compte courant -TripToSynch=Notes de frais à intégrer dans la compta -AucuneTripToSynch=Aucune note de frais n'est en statut "Payée". -ViewAccountSynch=Voir le compte - -ConfirmNdfToAccount=Êtes-vous sûr de vouloir intégrer cette note de frais dans le compte courant? -ndfToAccount=Note de frais - Intégration - -ConfirmAccountToNdf=Êtes-vous sûr de vouloir retirer cette note de frais du compte courant? -AccountToNdf=Note de frais - Retrait - -USER_AUTHOR=Auteur -PU=P.U. -Q=Q - -LINE_NOT_ADDED=Ligne non ajoutée : -NO_PROJECT=Aucun projet sélectionné. -NO_DATE=Aucune date sélectionnée. -NO_PRICE=Aucun prix indiqué. - -TripForValid=à Valider -TripForPaid=à Payer -TripPaid=Payée - -NoTripsToExportCSV=Il n'y a pas de notes de frais à exporter pour cette période. \ No newline at end of file diff --git a/htdocs/projet/card.php b/htdocs/projet/card.php index 1103396658f..0f6a74f1a48 100644 --- a/htdocs/projet/card.php +++ b/htdocs/projet/card.php @@ -466,7 +466,7 @@ if ($action == 'create' && $user->rights->projet->creer) // Budget print '
'.$langs->trans("Budget").'
'.$langs->trans("DATE_SAVE").''.$object->date_create.'
'.dol_print_date($object->date_create,'dayhour').'
'.$object->date_paiement.'
'.$langs->trans("VALIDATOR").'
'.$langs->trans("DATE_CANCEL").''.$object->date_cancel.'
'.dol_print_date($object->date_cancel,'dayhour').'
'.$langs->trans("VALIDOR").''.$langs->trans("Approbator").''; - if ($object->fk_user_valid > 0) + if ($object->fk_user_approve > 0) { - $userfee=new User($db); - $userfee->fetch($object->fk_user_valid); - print $userfee->getNomUrl(1); + $userapp=new User($db); + $userapp->fetch($object->fk_user_approve); + print $userapp->getNomUrl(1); } print '
'.$langs->trans("DATE_VALIDE").''.$object->date_valide.'
'.$langs->trans("DateApprove").''.dol_print_date($object->date_approve,'dayhour').'
'.$langs->trans("DATE_REFUS").''.$object->date_refuse; + print ''.dol_print_date($object->date_refuse,'dayhour'); if ($object->detail_refuse) print ' - '.$object->detail_refuse; print '
'.$objp->ref.''.dol_print_date($db->jdate($objp->date_valide),'day').''.dol_print_date($db->jdate($objp->date_valid),'day').''.img_object($langs->trans("ShowUser"),"user").' '.$objp->declarant_NDF.''.$objp->total_ttc.' '.$langs->trans("EURO").'
'; print ''; - print ''; + print ''; + print ''; print ''; - print ''; + // Thirdparty or user + print ''; if (empty($value['disableamount'])) print ''; else print ''; if (empty($value['disableamount'])) print ''; @@ -360,7 +368,17 @@ foreach ($listofreferent as $key => $value) for ($i = 0; $i < $num; $i++) { $element->fetch($elementarray[$i]); - $element->fetch_thirdparty(); + + if ($tablename != 'expensereport_det') + { + $element->fetch_thirdparty(); + } + else + { + $expensereport=new ExpenseReport($db); + $expensereport->fetch($element->fk_expensereport); + } + //print $classname; if ($breakline && $saved_third_id != $element->thirdparty->id) @@ -384,12 +402,17 @@ foreach ($listofreferent as $key => $value) $var=!$var; print ""; - print '\n"; // Ref print '\n"; // Date @@ -403,9 +426,15 @@ foreach ($listofreferent as $key => $value) } print ''; - // Third party + // Third party or user print ''; // Amount without tax @@ -431,7 +460,10 @@ foreach ($listofreferent as $key => $value) else print ''; // Status - print ''; + print ''; print ''; @@ -520,13 +552,15 @@ foreach ($listofreferent as $key => $value) } } -// Profit for all project + +// Show profit summary for whole project + $langs->load("suppliers"); $langs->load("bills"); $langs->load("orders"); $langs->load("proposals"); $langs->load("margins"); -print_fiche_titre($langs->trans("Profit"),'',''); +print_fiche_titre($langs->trans("Profit"),''); print '
'.$langs->trans("Ref").''.$langs->trans("Ref").''.$langs->trans("Date").''.$langs->trans("ThirdParty").''; + if ($tablename == 'expensereport_det') print $langs->trans("User"); + else print $langs->trans("ThirdParty"); + print ''.$langs->trans("AmountHT").''.$langs->trans("AmountTTC").'
'; + print ''; print '' . img_picto($langs->trans('Unlink'), 'editdelete') . ''; print "'; - print $element->getNomUrl(1); + + if ($tablename == 'expensereport_det') + { + print $expensereport->getNomUrl(1); + } + else print $element->getNomUrl(1); print "'.dol_print_date($date,'day').''; if (is_object($element->thirdparty)) print $element->thirdparty->getNomUrl(1,'',48); + else if ($tablename == 'expensereport_det') + { + $tmpuser=new User($db); + $tmpuser->fetch($expensereport->fk_user_author); + print $tmpuser->getNomUrl(1,'',48); + } print ''.$element->getLibStatut(5).''; + if ($tablename == 'expensereport_det') print $expensereport->getLibStatut(5); + else print $element->getLibStatut(5); + print '
'; print ''; print ''; @@ -543,7 +577,7 @@ foreach ($listofreferent as $key => $value) $tablename=$value['table']; $qualified=$value['test']; $margin = $value['margin']; - if (isset($margin)) + if ($qualified && isset($margin)) // If this element must be included into profit calculation ($margin is 'minus' or 'plus') { $element = new $classname($db); @@ -557,13 +591,10 @@ foreach ($listofreferent as $key => $value) for ($i = 0; $i < $num; $i++) { $element->fetch($elementarray[$i]); - $element->fetch_thirdparty(); - //print $classname; - if ($qualified) - { - $total_ht = $total_ht + $element->total_ht; - $total_ttc = $total_ttc + $element->total_ttc; - } + if ($tablename != 'expensereport_det') $element->fetch_thirdparty(); + + $total_ht = $total_ht + $element->total_ht; + $total_ttc = $total_ttc + $element->total_ttc; } print ''; From 6d1324b46330712566923a51ca609e90166c4e4c Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 21 Feb 2015 16:15:54 +0100 Subject: [PATCH 106/287] Work on expense report module --- htdocs/core/actions_sendmails.inc.php | 8 +- htdocs/core/lib/functions.lib.php | 6 +- .../core/modules/modExpenseReport.class.php | 4 +- htdocs/expensereport/card.php | 140 ++++++++++-------- .../class/expensereport.class.php | 36 +---- .../class/expensereportstats.class.php | 13 +- htdocs/expensereport/index.php | 8 +- htdocs/expensereport/list.php | 15 +- htdocs/expensereport/stats/index.php | 4 +- htdocs/langs/en_US/trips.lang | 3 +- htdocs/user/class/user.class.php | 4 +- 11 files changed, 120 insertions(+), 121 deletions(-) diff --git a/htdocs/core/actions_sendmails.inc.php b/htdocs/core/actions_sendmails.inc.php index 80385d34735..cc898d02c85 100644 --- a/htdocs/core/actions_sendmails.inc.php +++ b/htdocs/core/actions_sendmails.inc.php @@ -210,19 +210,17 @@ if (($action == 'send' || $action == 'relance') && ! $_POST['addfile'] && ! $_PO else { $langs->load("other"); - $mesg='
'; if ($mailfile->error) { + $mesg=''; $mesg.=$langs->trans('ErrorFailedToSendMail',$from,$sendto); $mesg.='
'.$mailfile->error; + setEventMessage($mesg,'errors'); } else { - $mesg.='No mail sent. Feature is disabled by option MAIN_DISABLE_ALL_MAILS'; + setEventMessage('No mail sent. Feature is disabled by option MAIN_DISABLE_ALL_MAILS', 'warnings'); } - $mesg.='
'; - - setEventMessage($mesg,'warnings'); $action = 'presend'; } } diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php index 6355a871e8e..537cf68986b 100644 --- a/htdocs/core/lib/functions.lib.php +++ b/htdocs/core/lib/functions.lib.php @@ -4189,15 +4189,15 @@ function get_date_range($date_start,$date_end,$format = '',$outputlangs='', $wit if ($date_start && $date_end) { - $out.= ($withparenthesis?' (':'').$outputlangs->trans('DateFromTo',dol_print_date($date_start, $format, false, $outputlangs),dol_print_date($date_end, $format, false, $outputlangs)).($withparenthesis?')':''); + $out.= ($withparenthesis?' (':'').$outputlangs->transnoentitiesnoconv('DateFromTo',dol_print_date($date_start, $format, false, $outputlangs),dol_print_date($date_end, $format, false, $outputlangs)).($withparenthesis?')':''); } if ($date_start && ! $date_end) { - $out.= ($withparenthesis?' (':'').$outputlangs->trans('DateFrom',dol_print_date($date_start, $format, false, $outputlangs)).($withparenthesis?')':''); + $out.= ($withparenthesis?' (':'').$outputlangs->transnoentitiesnoconv('DateFrom',dol_print_date($date_start, $format, false, $outputlangs)).($withparenthesis?')':''); } if (! $date_start && $date_end) { - $out.= ($withparenthesis?' (':'').$outputlangs->trans('DateUntil',dol_print_date($date_end, $format, false, $outputlangs)).($withparenthesis?')':''); + $out.= ($withparenthesis?' (':'').$outputlangs->transnoentitiesnoconv('DateUntil',dol_print_date($date_end, $format, false, $outputlangs)).($withparenthesis?')':''); } return $out; diff --git a/htdocs/core/modules/modExpenseReport.class.php b/htdocs/core/modules/modExpenseReport.class.php index b5b45ea23f8..1bf00f86f31 100755 --- a/htdocs/core/modules/modExpenseReport.class.php +++ b/htdocs/core/modules/modExpenseReport.class.php @@ -162,7 +162,7 @@ class modExpenseReport extends DolibarrModules $this->rights[6][1] = 'Approve expense reports'; $this->rights[6][2] = 'w'; $this->rights[6][3] = 0; - $this->rights[6][4] = 'to_validate'; + $this->rights[6][4] = 'approve'; $this->rights[7][0] = 776; $this->rights[7][1] = 'Pay expense reports'; @@ -267,7 +267,7 @@ class modExpenseReport extends DolibarrModules 'langs'=>'trips', // Lang file to use (without .lang) by module. File must be in langs/code_CODE/ directory. 'position'=>100, 'enabled'=>'$conf->expensereport->enabled', // Define condition to show or hide menu entry. Use '$conf->mymodule->enabled' if entry must be visible if module is enabled. - 'perms'=>'$user->rights->expensereport->lire', // Use 'perms'=>'$user->rights->mymodule->level1->level2' if you want your menu with a permission rules + 'perms'=>'$user->rights->expensereport->approve', // Use 'perms'=>'$user->rights->mymodule->level1->level2' if you want your menu with a permission rules 'target'=>'', 'user'=>2); // 0=Menu for internal users, 1=external users, 2=both $r++; diff --git a/htdocs/expensereport/card.php b/htdocs/expensereport/card.php index cfe3c86058b..75ab8b7cb45 100755 --- a/htdocs/expensereport/card.php +++ b/htdocs/expensereport/card.php @@ -70,6 +70,11 @@ if (! empty($conf->multicompany->enabled) && ! empty($conf->entity) && $conf->en $conf->expensereport->dir_output = $rootfordata.'/expensereport'; $conf->expensereport->dir_output = $rootfordata.'/expensereport'; +// Define $urlwithroot +$urlwithouturlroot=preg_replace('/'.preg_quote(DOL_URL_ROOT,'/').'$/i','',trim($dolibarr_main_url_root)); +$urlwithroot=$urlwithouturlroot.DOL_URL_ROOT; // This is to use external domain name found into config file +//$urlwithroot=DOL_MAIN_URL_ROOT; // This is to use same domain name than current + /* @@ -166,67 +171,74 @@ if ($action == "confirm_save" && GETPOST("confirm") == "yes" && $id > 0 && $user $object = new ExpenseReport($db); $object->fetch($id); $result = $object->setValidate($user); - if ($result > 0) + if ($result > 0 && $object->fk_user_validator > 0) { - // Send mail - if (! empty($conf->global->DEPLACEMENT_TO_CLEAN)) + $langs->load("mails"); + + // TO + $destinataire = new User($db); + $destinataire->fetch($object->fk_user_validator); + $emailTo = $destinataire->email; + + // FROM + $expediteur = new User($db); + $expediteur->fetch($object->fk_user_author); + $emailFrom = $expediteur->email; + + // SUBJECT + $subject = $langs->trans("ExpenseReportWaitingForApproval"); + + // CONTENT + $link = $urlwithroot.'/expenserecord/card.php?id='.$object->id; + $message = $langs->trans("ExpenseReportWaitingForApprovalMessage", $expediteur->getFullName($langs), get_date_range($object->date_debut,$object->date_fin,'',$langs), $link); + + // Rebuild pdf + /* + $object->setDocModel($user,""); + $resultPDF = expensereport_pdf_create($db,$id,'',"",$langs); + + if($resultPDF): + // ATTACHMENT + $filename=array(); $filedir=array(); $mimetype=array(); + array_push($filename,dol_sanitizeFileName($object->ref).".pdf"); + array_push($filedir,$conf->expensereport->dir_output . "/" . dol_sanitizeFileName($object->ref) . "/" . dol_sanitizeFileName($object->ref).".pdf"); + array_push($mimetype,"application/pdf"); + */ + + // PREPARE SEND + $mailfile = new CMailFile($subject,$emailTo,$emailFrom,$message,$filedir,$mimetype,$filename); + + if ($mailfile) { - // Send mail - - // TO - $destinataire = new User($db); - $destinataire->fetch($object->fk_user_validator); - $emailTo = $destinataire->email; - - // FROM - $expediteur = new User($db); - $expediteur->fetch($object->fk_user_author); - $emailFrom = $expediteur->email; - - // SUBJECT - $subject = "' ERP - Note de frais à valider"; - - // CONTENT - $message = "Bonjour {$destinataire->firstname},\n\n"; - $message.= "Veuillez trouver en pièce jointe une nouvelle note de frais à valider.\n"; - $message.= "- Déclarant : {$expediteur->firstname} {$expediteur->lastname}\n"; - $message.= "- Période : du {$object->date_debut} au {$object->date_fin}\n"; - $message.= "- Lien : {$dolibarr_main_url_root}/expensereport/card.php?id={$object->id}\n\n"; - $message.= "Bien cordialement,\n' SI"; - - // Génération du pdf avant attachement - $object->setDocModel($user,""); - $resultPDF = expensereport_pdf_create($db,$id,'',"",$langs); - - if($resultPDF): - // ATTACHMENT - $filename=array(); $filedir=array(); $mimetype=array(); - array_push($filename,dol_sanitizeFileName($object->ref).".pdf"); - array_push($filedir,$conf->expensereport->dir_output . "/" . dol_sanitizeFileName($object->ref) . "/" . dol_sanitizeFileName($object->ref).".pdf"); - array_push($mimetype,"application/pdf"); - - // PREPARE SEND - $mailfile = new CMailFile($subject,$emailTo,$emailFrom,$message,$filedir,$mimetype,$filename); - - if(!$mailfile->error): - // SEND $result=$mailfile->sendfile(); - if ($result): - Header("Location: ".$_SEVER["PHP_SELF"]."?id=".$id); - exit; - endif; - - else: - - $mesg="Impossible d'envoyer l'email."; - - endif; - // END - Send mail - else: - dol_print_error($db,$resultPDF); - exit; - endif; + if ($result) + { + $mesg=$langs->trans('MailSuccessfulySent',$mailfile->getValidAddress($emailFrom,2),$mailfile->getValidAddress($emailTo,2)); + setEventMessage($mesg); + header("Location: ".$_SEVER["PHP_SELF"]."?id=".$id); + exit; + } + else + { + $langs->load("other"); + if ($mailfile->error) + { + $mesg=''; + $mesg.=$langs->trans('ErrorFailedToSendMail',$from,$sendto); + $mesg.='
'.$mailfile->error; + setEventMessage($mesg,'errors'); + } + else + { + setEventMessage('No mail sent. Feature is disabled by option MAIN_DISABLE_ALL_MAILS', 'warnings'); + } + } + } + else + { + setEventMessages($mailfile->error,$mailfile->errors,'errors'); + $action=''; } } else @@ -311,7 +323,7 @@ if ($action == "confirm_save_from_refuse" && GETPOST("confirm") == "yes" && $id } // Approve -if ($action == "confirm_validate" && GETPOST("confirm") == "yes" && $id > 0 && $user->rights->expensereport->to_validate) +if ($action == "confirm_approve" && GETPOST("confirm") == "yes" && $id > 0 && $user->rights->expensereport->approve) { $object = new ExpenseReport($db); $object->fetch($id); @@ -394,7 +406,7 @@ if ($action == "confirm_validate" && GETPOST("confirm") == "yes" && $id > 0 && $ } } -if ($action == "confirm_refuse" && GETPOST('confirm')=="yes" && $id > 0 && $user->rights->expensereport->to_validate) +if ($action == "confirm_refuse" && GETPOST('confirm')=="yes" && $id > 0 && $user->rights->expensereport->approve) { $object = new ExpenseReport($db); $object->fetch($id); @@ -1120,7 +1132,7 @@ else endif; if ($action == 'validate'): - $ret=$form->form_confirm($_SEVER["PHP_SELF"]."?id=".$id,$langs->trans("ValideTrip"),$langs->trans("ConfirmValideTrip"),"confirm_validate","","",1); + $ret=$form->form_confirm($_SEVER["PHP_SELF"]."?id=".$id,$langs->trans("ValideTrip"),$langs->trans("ConfirmValideTrip"),"confirm_approve","","",1); if ($ret == 'html') print '
'; endif; @@ -1633,7 +1645,7 @@ if ($action != 'create' && $action != 'edit') } /* Si l'état est "En attente d'approbation" - * ET user à droit de "to_validate" + * ET user à droit de "approve" * ET fk_user_validator == user courant * Afficher : "Valider" / "Refuser" / "Supprimer" */ @@ -1646,7 +1658,7 @@ if ($action != 'create' && $action != 'edit') } } - if ($user->rights->expensereport->to_validate && $object->fk_c_expensereport_statuts == 2) + if ($user->rights->expensereport->approve && $object->fk_c_expensereport_statuts == 2) { //if($object->fk_user_validator==$user->id) //{ @@ -1692,11 +1704,11 @@ if ($action != 'create' && $action != 'edit') } /* Si l'état est "Payée" - * ET user à droit "to_validate" + * ET user à droit "approve" * ET user à droit "to_paid" * Afficher : "Annuler" */ - if ($user->rights->expensereport->to_validate && $user->rights->expensereport->to_paid && $object->fk_c_expensereport_statuts==6) + if ($user->rights->expensereport->approve && $user->rights->expensereport->to_paid && $object->fk_c_expensereport_statuts==6) { // Annuler print ''.$langs->trans('Cancel').''; diff --git a/htdocs/expensereport/class/expensereport.class.php b/htdocs/expensereport/class/expensereport.class.php index 40be7298a1c..2523ef34154 100755 --- a/htdocs/expensereport/class/expensereport.class.php +++ b/htdocs/expensereport/class/expensereport.class.php @@ -790,7 +790,7 @@ class ExpenseReport extends CommonObject } /** - * set_to_validate + * set_save_from_refuse * * @param User $user User * @return int <0 if KO, >0 if OK @@ -971,38 +971,6 @@ class ExpenseReport extends CommonObject } } - /** - * set_to_validate - * - * @param User $user User - * @return int <0 if KO, >0 if OK - */ - function set_to_valide($user) - { - if ($this->fk_c_expensereport_statuts != 2) - { - $sql = 'UPDATE '.MAIN_DB_PREFIX.$this->table_element; - $sql.= " SET fk_c_expensereport_statuts = 2, fk_user_validator = ".$this->fk_user_validator; - $sql.= ' WHERE rowid = '.$this->id; - - dol_syslog(get_class($this)."::set_to_valide sql=".$sql, LOG_DEBUG); - - if ($this->db->query($sql)) - { - return 1; - } - else - { - $this->error=$this->db->error(); - return -1; - } - } - else - { - dol_syslog(get_class($this)."::set_to_valide expensereport already with to-valide status", LOG_WARNING); - } - } - /** * set_cancel * @@ -1312,7 +1280,7 @@ class ExpenseReport extends CommonObject $sql = "SELECT fk_user"; $sql.= " FROM ".MAIN_DB_PREFIX."user_rights as ur, ".MAIN_DB_PREFIX."rights_def as rd"; - $sql.= " WHERE ur.fk_id = rd.id and module = 'expensereport' AND perms = 'to_validate'"; // Permission 'Approve'; + $sql.= " WHERE ur.fk_id = rd.id and module = 'expensereport' AND perms = 'approve'"; // Permission 'Approve'; dol_syslog(get_class($this)."::fetch_users_approver_expensereport sql=".$sql); $result = $this->db->query($sql); diff --git a/htdocs/expensereport/class/expensereportstats.class.php b/htdocs/expensereport/class/expensereportstats.class.php index e12b4ed2a79..9536d59937d 100644 --- a/htdocs/expensereport/class/expensereportstats.class.php +++ b/htdocs/expensereport/class/expensereportstats.class.php @@ -49,7 +49,7 @@ class ExpenseReportStats extends Stats */ function __construct($db, $socid=0, $userid=0) { - global $conf; + global $conf, $user; $this->db = $db; $this->socid = $socid; @@ -65,7 +65,16 @@ class ExpenseReportStats extends Stats { $this->where.=" AND fk_soc = ".$this->socid; } - if ($this->userid > 0) $this->where.=' AND fk_user_author = '.$this->userid; + + // Only me and subordinates + if (empty($user->rights->expensereport->readall) && empty($user->rights->expensereport->lire_tous)) + { + $childids = $user->getAllChildIds(); + $childids[]=$user->id; + $this->where.=" AND fk_user_author IN (".(join(',',$childids)).")"; + } + + if ($this->userid > 0) $this->where.=' AND fk_user_author = '.$this->userid; } diff --git a/htdocs/expensereport/index.php b/htdocs/expensereport/index.php index 2ea024fb3b0..89469609e2a 100644 --- a/htdocs/expensereport/index.php +++ b/htdocs/expensereport/index.php @@ -69,7 +69,13 @@ $totalnb=$totalsum=0; $sql = "SELECT tf.code, tf.label, count(de.rowid) as nb, sum(de.total_ht) as km"; $sql.= " FROM ".MAIN_DB_PREFIX."expensereport as d, ".MAIN_DB_PREFIX."expensereport_det as de, ".MAIN_DB_PREFIX."c_type_fees as tf"; $sql.= " WHERE de.fk_expensereport = d.rowid AND de.fk_c_type_fees = tf.id"; -if (empty($user->rights->expensereport->readall) && empty($user->rights->expensereport->lire_tous)) $sql.=' AND d.fk_user_author IN ('.join(',',$childids).')'; + +// RESTRICT RIGHTS +if (empty($user->rights->expensereport->readall) && empty($user->rights->expensereport->lire_tous)) +{ + $sql.= " AND d.fk_user_author IN (".join(',',$childids).")\n"; +} + $sql.= " GROUP BY tf.code, tf.label"; $result = $db->query($sql); diff --git a/htdocs/expensereport/list.php b/htdocs/expensereport/list.php index 348c564812e..d71a9410c9f 100755 --- a/htdocs/expensereport/list.php +++ b/htdocs/expensereport/list.php @@ -48,7 +48,7 @@ $html = new Form($db); $formother = new FormOther($db); $expensereporttmp=new ExpenseReport($db); -llxHeader(); +llxHeader('', $langs->trans("ListOfExpenseReports")); $max_year = 5; $min_year = 5; @@ -84,13 +84,14 @@ $sql.= " u.rowid as id_user, u.firstname, u.lastname"; $sql.= " FROM ".MAIN_DB_PREFIX."expensereport d\n"; $sql.= " INNER JOIN ".MAIN_DB_PREFIX."user u ON d.fk_user_author = u.rowid\n"; + + // WHERE if(!empty($search_ref)){ $sql.= " WHERE d.ref LIKE '%".$db->escape($search_ref)."%'\n"; }else{ $sql.= " WHERE 1 = 1\n"; } - // DATE START if ($month_start > 0) { if ($year_start > 0) { @@ -148,13 +149,15 @@ if ($month_start > 0) { } } } - -if (!empty($search_user) && $search_user != -1) $sql.= " AND d.fk_user_author = '$search_user'\n"; +if (!empty($search_user) && $search_user > 0) $sql.= " AND d.fk_user_author = ".$search_user."\n"; if($search_state != '') $sql.= " AND d.fk_c_expensereport_statuts = '$search_state'\n"; // RESTRICT RIGHTS -if (empty($user->rights->expensereport->readall) && empty($user->rights->expensereport->lire_tous)){ - $sql.= " AND d.fk_user_author = '{$user->id}'\n"; +if (empty($user->rights->expensereport->readall) && empty($user->rights->expensereport->lire_tous)) +{ + $childids = $user->getAllChildIds(); + $childids[]=$user->id; + $sql.= " AND d.fk_user_author IN (".join(',',$childids).")\n"; } $sql.= $db->order($sortfield,$sortorder); diff --git a/htdocs/expensereport/stats/index.php b/htdocs/expensereport/stats/index.php index 07843985b00..402eb56e01b 100755 --- a/htdocs/expensereport/stats/index.php +++ b/htdocs/expensereport/stats/index.php @@ -222,7 +222,9 @@ print '
'; */ // User print ''; // Year print '\n"; // Accountancy code - if (! empty($conf->global->USER_ENABLE_ACCOUNTANCY_CODE)) // For the moment field is not used so must not appeared. - { - $rowspan++; - print ''; - print ''; - } + $rowspan++; + print ''; + print ''; // Color user if (! empty($conf->agenda->enabled)) From 4bb524d55d75af966bf7462e9132c223722d8326 Mon Sep 17 00:00:00 2001 From: aspangaro Date: Sun, 22 Feb 2015 08:12:40 +0100 Subject: [PATCH 108/287] Also for edit user. --- htdocs/user/card.php | 31 ++++++++++++++----------------- 1 file changed, 14 insertions(+), 17 deletions(-) diff --git a/htdocs/user/card.php b/htdocs/user/card.php index 67407bd6d39..fde96bcc21c 100644 --- a/htdocs/user/card.php +++ b/htdocs/user/card.php @@ -2018,23 +2018,20 @@ else print "\n"; // Accountancy code - if (! empty($conf->global->USER_ENABLE_ACCOUNTANCY_CODE)) // For the moment field is not used so must not appeared. - { - print ""; - print ''; - print ''; - print ""; - } + print ""; + print ''; + print ''; + print ""; // User color if (! empty($conf->agenda->enabled)) From 067af47955e92d257dc3fda13d2a5278d41c6557 Mon Sep 17 00:00:00 2001 From: aspangaro Date: Sun, 22 Feb 2015 08:35:25 +0100 Subject: [PATCH 109/287] Add accountancy field on creation mode and correct rowspan. --- htdocs/user/card.php | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/htdocs/user/card.php b/htdocs/user/card.php index fde96bcc21c..b8e70dcd12f 100644 --- a/htdocs/user/card.php +++ b/htdocs/user/card.php @@ -8,7 +8,7 @@ * Copyright (C) 2011 Herve Prot * Copyright (C) 2012 Juanjo Menent * Copyright (C) 2013 Florian Henry - * Copyright (C) 2013-2014 Alexandre Spangaro + * Copyright (C) 2013-2015 Alexandre Spangaro * * 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 @@ -980,6 +980,12 @@ if (($action == 'create') || ($action == 'adduserldap')) print ''; print ''; print "\n"; + + // Accountancy code + print ''; + print ''; // User color if (! empty($conf->agenda->enabled)) @@ -1123,7 +1129,7 @@ else */ if ($action != 'edit') { - $rowspan=17; + $rowspan=19; print '
'.$langs->trans("Element").'
'.$langs->trans("User").''; -print $form->select_dolusers($userid,'userid',1); +$include=''; +if (empty($user->rights->expensereport->readall) && empty($user->rights->expensereport->lire_tous)) $include='hierarchy'; +print $form->select_dolusers($userid,'userid',1,'',0,$include); print '
'.$langs->trans("Year").''; diff --git a/htdocs/langs/en_US/trips.lang b/htdocs/langs/en_US/trips.lang index c31b902805e..e5f683eb8fe 100644 --- a/htdocs/langs/en_US/trips.lang +++ b/htdocs/langs/en_US/trips.lang @@ -20,7 +20,8 @@ ListToApprove=Waiting for approval ExpensesArea=Expense reports area SearchATripAndExpense=Search an expense report ClassifyRefunded=Classify 'Refunded' - +ExpenseReportWaitingForApproval=A new expense report has been submitted for approval +ExpenseReportWaitingForApprovalMessage=A new expense report has been submitted and is waiting for approval.\n- User: %s\n- Period: %s\nClick here to validate: %s TripId=Id expense report AnyOtherInThisListCanValidate=Person to inform for validation. TripSociete=Information company diff --git a/htdocs/user/class/user.class.php b/htdocs/user/class/user.class.php index 16123c86b9c..babac9c33ba 100644 --- a/htdocs/user/class/user.class.php +++ b/htdocs/user/class/user.class.php @@ -2211,7 +2211,7 @@ class User extends CommonObject /** - * Return and array with all instanciated children users of current user + * Return and array with all instanciated first level children users of current user * * @return void */ @@ -2365,7 +2365,7 @@ class User extends CommonObject } /** - * Return list of all childs users in herarchy. + * Return list of all child users id in herarchy (all sublevels). * * @return array Array of user id lower than user. This overwrite this->users. */ From ce247432eec3324ae2eb72cc07bdd4f0bcc0150f Mon Sep 17 00:00:00 2001 From: aspangaro Date: Sun, 22 Feb 2015 08:05:23 +0100 Subject: [PATCH 107/287] FIXED: Remove condition to show accountancy field on user. --- htdocs/user/card.php | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/htdocs/user/card.php b/htdocs/user/card.php index 429bcc91130..67407bd6d39 100644 --- a/htdocs/user/card.php +++ b/htdocs/user/card.php @@ -1319,12 +1319,9 @@ else print "
'.$langs->trans("AccountancyCode").''.$object->accountancy_code.'
'.$langs->trans("AccountancyCode").''.$object->accountancy_code.'
'.$langs->trans("AccountancyCode").''; - if ($caneditfield) - { - print ''; - } - else - { - print ''; - print $object->accountancy_code; - } - print '
'.$langs->trans("AccountancyCode").''; + if ($caneditfield) + { + print ''; + } + else + { + print ''; + print $object->accountancy_code; + } + print '
'.$langs->trans("AccountancyCode").''; + print ''; + print '
'; @@ -1319,7 +1325,6 @@ else print "\n"; // Accountancy code - $rowspan++; print ''; print ''; @@ -1651,7 +1656,7 @@ else */ if ($action == 'edit' && ($canedituser || $caneditfield || $caneditpassword || ($user->id == $object->id))) { - $rowspan=15; + $rowspan=16; if (isset($conf->file->main_authentication) && preg_match('/openid/',$conf->file->main_authentication) && ! empty($conf->global->MAIN_OPENIDURL_PERUSER)) $rowspan++; if (! empty($conf->societe->enabled)) $rowspan++; if (! empty($conf->adherent->enabled)) $rowspan++; From ce916f3bcb5fc5ad75d671adaac87d2f9516ee9a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcos=20Garci=CC=81a=20de=20La=20Fuente?= Date: Sun, 22 Feb 2015 12:35:51 +0100 Subject: [PATCH 110/287] Better practice in getBrowserInfo --- htdocs/admin/system/browser.php | 2 +- htdocs/core/lib/functions.lib.php | 54 ++++++++++++++++++------------- htdocs/install/check.php | 2 +- htdocs/main.inc.php | 2 +- test/phpunit/FunctionsLibTest.php | 33 +++++++++++-------- 5 files changed, 54 insertions(+), 39 deletions(-) diff --git a/htdocs/admin/system/browser.php b/htdocs/admin/system/browser.php index 58601c6e998..a25ca7b1622 100644 --- a/htdocs/admin/system/browser.php +++ b/htdocs/admin/system/browser.php @@ -44,7 +44,7 @@ llxHeader(); print_fiche_titre($langs->trans("InfoBrowser"),'','setup'); -$tmp=getBrowserInfo(); +$tmp=getBrowserInfo($_SERVER["HTTP_USER_AGENT"]); // Browser $var=true; diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php index 537cf68986b..f1590a1be57 100644 --- a/htdocs/core/lib/functions.lib.php +++ b/htdocs/core/lib/functions.lib.php @@ -125,38 +125,40 @@ function getEntity($element=false, $shared=false) /** * Return information about user browser * + * @param string $user_agent Content of $_SERVER["HTTP_USER_AGENT"] variable * @return array Array of information ('browsername'=>,'browseros'=>,'browserversion'=>,'layout'=>(classic|phone|tablet)) */ -function getBrowserInfo() +function getBrowserInfo($user_agent) { $name='unknown'; $version=''; $os='unknown'; $phone=''; $tablet=''; // If phone/smartphone, we set phone os name. - if (preg_match('/android/i',$_SERVER["HTTP_USER_AGENT"])) { $os=$phone='android'; } - elseif (preg_match('/blackberry/i',$_SERVER["HTTP_USER_AGENT"])) { $os=$phone='blackberry'; } - elseif (preg_match('/iphone/i',$_SERVER["HTTP_USER_AGENT"])) { $os='ios'; $phone='iphone'; } - elseif (preg_match('/ipod/i',$_SERVER["HTTP_USER_AGENT"])) { $os='ios'; $phone='iphone'; } - elseif (preg_match('/palm/i',$_SERVER["HTTP_USER_AGENT"])) { $os=$phone='palm'; } - elseif (preg_match('/symbian/i',$_SERVER["HTTP_USER_AGENT"])) { $os='symbian'; $phone='unknown'; } - elseif (preg_match('/webos/i',$_SERVER["HTTP_USER_AGENT"])) { $os='webos'; $phone='unknown'; } - elseif (preg_match('/maemo/i',$_SERVER["HTTP_USER_AGENT"])) { $os='maemo'; $phone='unknown'; } + if (preg_match('/android/i', $user_agent)) { $os=$phone='android'; } + elseif (preg_match('/blackberry/i', $user_agent)) { $os=$phone='blackberry'; } + elseif (preg_match('/iphone/i', $user_agent)) { $os='ios'; $phone='iphone'; } + elseif (preg_match('/ipod/i', $user_agent)) { $os='ios'; $phone='iphone'; } + elseif (preg_match('/palm/i', $user_agent)) { $os=$phone='palm'; } + elseif (preg_match('/symbian/i', $user_agent)) { $os='symbian'; $phone='unknown'; } + elseif (preg_match('/webos/i', $user_agent)) { $os='webos'; $phone='unknown'; } + elseif (preg_match('/maemo/i', $user_agent)) { $os='maemo'; $phone='unknown'; } // MS products at end - elseif (preg_match('/iemobile/i',$_SERVER["HTTP_USER_AGENT"])) { $os='windows'; $phone='unkown'; } - elseif (preg_match('/windows ce/i',$_SERVER["HTTP_USER_AGENT"])) { $os='windows'; $phone='unkown'; } + elseif (preg_match('/iemobile/i', $user_agent)) { $os='windows'; $phone='unkown'; } + elseif (preg_match('/windows ce/i', $user_agent)) { $os='windows'; $phone='unkown'; } // OS - if (preg_match('/android/i',$_SERVER["HTTP_USER_AGENT"])) { $os='android'; } - elseif (preg_match('/linux/i',$_SERVER["HTTP_USER_AGENT"])) { $os='linux'; } + if (preg_match('/android/i', $user_agent)) { $os='android'; } + elseif (preg_match('/linux/i', $user_agent)) { $os='linux'; } // Name - if (preg_match('/firefox(\/|\s)([\d\.]*)/i', $_SERVER["HTTP_USER_AGENT"], $reg)) { $name='firefox'; $version=$reg[2]; } - elseif (preg_match('/chrome(\/|\s)([\d\.]+)/i', $_SERVER["HTTP_USER_AGENT"], $reg)) { $name='chrome'; $version=$reg[2]; } // we can have 'chrome (Mozilla...) chrome x.y' in one string - elseif (preg_match('/chrome/i', $_SERVER["HTTP_USER_AGENT"], $reg)) { $name='chrome'; } - elseif (preg_match('/iceweasel/i',$_SERVER["HTTP_USER_AGENT"])) { $name='iceweasel'; $version=$reg[2]; } - elseif (preg_match('/epiphany/i',$_SERVER["HTTP_USER_AGENT"])) { $name='epiphany'; $version=$reg[2]; } - elseif ((empty($phone) || preg_match('/iphone/i',$_SERVER["HTTP_USER_AGENT"])) && preg_match('/safari(\/|\s)([\d\.]*)/i',$_SERVER["HTTP_USER_AGENT"], $reg)) { $name='safari'; $version=$reg[2]; } // Safari is often present in string for mobile but its not. - elseif (preg_match('/opera(\/|\s)([\d\.]*)/i', $_SERVER["HTTP_USER_AGENT"], $reg)) { $name='opera'; $version=$reg[2]; } - elseif (preg_match('/msie(\/|\s)([\d\.]*)/i', $_SERVER["HTTP_USER_AGENT"], $reg)) { $name='ie'; $version=$reg[2]; } // MS products at end + if (preg_match('/firefox(\/|\s)([\d\.]*)/i', $user_agent, $reg)) { $name='firefox'; $version=$reg[2]; } + elseif (preg_match('/chrome(\/|\s)([\d\.]+)/i', $user_agent, $reg)) { $name='chrome'; $version=$reg[2]; } // we can have 'chrome (Mozilla...) chrome x.y' in one string + elseif (preg_match('/chrome/i', $user_agent, $reg)) { $name='chrome'; } + elseif (preg_match('/iceweasel/i', $user_agent)) { $name='iceweasel'; $version=$reg[2]; } + elseif (preg_match('/epiphany/i', $user_agent)) { $name='epiphany'; $version=$reg[2]; } + elseif ((empty($phone) || preg_match('/iphone/i', $user_agent)) && preg_match('/safari(\/|\s)([\d\.]*)/i', + $user_agent, $reg)) { $name='safari'; $version=$reg[2]; } // Safari is often present in string for mobile but its not. + elseif (preg_match('/opera(\/|\s)([\d\.]*)/i', $user_agent, $reg)) { $name='opera'; $version=$reg[2]; } + elseif (preg_match('/msie(\/|\s)([\d\.]*)/i', $user_agent, $reg)) { $name='ie'; $version=$reg[2]; } // MS products at end // Other $firefox=0; if (in_array($name,array('firefox','iceweasel'))) $firefox=1; @@ -167,7 +169,15 @@ function getBrowserInfo() $tablet=$detectmobile->isTablet(); unset($detectmobile); // free memory - return array('browsername'=>$name, 'browserversion'=>$version, 'browseros'=>$os, 'browserfirefox'=>$firefox, 'layout'=> ($tablet?'tablet':($phone?'phone':'classic')), 'phone'=>$phone, 'tablet'=>$tablet); + return array( + 'browsername' => $name, + 'browserversion' => $version, + 'browseros' => $os, + 'browserfirefox' => $firefox, + 'layout' => ($tablet ? 'tablet' : ($phone ? 'phone' : 'classic')), + 'phone' => $phone, + 'tablet' => $tablet + ); } /** diff --git a/htdocs/install/check.php b/htdocs/install/check.php index b92f219a5af..15ba736acd5 100644 --- a/htdocs/install/check.php +++ b/htdocs/install/check.php @@ -63,7 +63,7 @@ print '

'.$langs->trans("MiscellaneousChecks").":

\n"; $useragent=$_SERVER['HTTP_USER_AGENT']; if (! empty($useragent)) { - $tmp=getBrowserInfo(); + $tmp=getBrowserInfo($_SERVER["HTTP_USER_AGENT"]); $browserversion=$tmp['browserversion']; $browsername=$tmp['browsername']; if ($browsername == 'ie' && $browserversion < 7) print 'Error '.$langs->trans("WarningBrowserTooOld")."
\n"; diff --git a/htdocs/main.inc.php b/htdocs/main.inc.php index 7be99f5e278..4818b2d38f1 100644 --- a/htdocs/main.inc.php +++ b/htdocs/main.inc.php @@ -208,7 +208,7 @@ register_shutdown_function('dol_shutdown'); // Detection browser if (isset($_SERVER["HTTP_USER_AGENT"])) { - $tmp=getBrowserInfo(); + $tmp=getBrowserInfo($_SERVER["HTTP_USER_AGENT"]); $conf->browser->name=$tmp['browsername']; $conf->browser->os=$tmp['browseros']; $conf->browser->version=$tmp['browserversion']; diff --git a/test/phpunit/FunctionsLibTest.php b/test/phpunit/FunctionsLibTest.php index 24408d53594..0c3995bc7b5 100755 --- a/test/phpunit/FunctionsLibTest.php +++ b/test/phpunit/FunctionsLibTest.php @@ -120,34 +120,39 @@ class FunctionsLibTest extends PHPUnit_Framework_TestCase /** - * testDolHtmlCleanLastBr + * testGetBrowserInfo * * @return void */ - public function testGetBrowserVersion() + public function testGetBrowserInfo() { - $_SERVER['HTTP_USER_AGENT']='Mozilla/4.0 (compatible; MSIE 5.0; Windows 98; DigExt; KITV4 Wanadoo; KITV5 Wanadoo)'; // MSIE 5.0 - $tmp=getBrowserInfo(); + $user_agent ='Mozilla/4.0 (compatible; MSIE 5.0; Windows 98; DigExt; KITV4 Wanadoo; KITV5 Wanadoo)'; // MSIE 5.0 + $tmp=getBrowserInfo($user_agent); $this->assertEquals('ie',$tmp['browsername']); $this->assertEquals('5.0',$tmp['browserversion']); - $_SERVER['HTTP_USER_AGENT']='Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.5a) Gecko/20030728 Mozilla Firefox/0.9.1'; // Firefox 0.9.1 - $tmp=getBrowserInfo(); + + $user_agent ='Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.5a) Gecko/20030728 Mozilla Firefox/0.9.1'; // Firefox 0.9.1 + $tmp=getBrowserInfo($user_agent); $this->assertEquals('firefox',$tmp['browsername']); $this->assertEquals('0.9.1',$tmp['browserversion']); - $_SERVER['HTTP_USER_AGENT']='Mozilla/3.0 (Windows 98; U) Opera 6.03 [en]'; - $tmp=getBrowserInfo(); + + $user_agent ='Mozilla/3.0 (Windows 98; U) Opera 6.03 [en]'; + $tmp=getBrowserInfo($user_agent); $this->assertEquals('opera',$tmp['browsername']); $this->assertEquals('6.03',$tmp['browserversion']); - $_SERVER['HTTP_USER_AGENT']='Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.21 (KHTML, like Gecko) Chrome/19.0.1042.0 Safari/535.21'; - $tmp=getBrowserInfo(); + + $user_agent ='Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.21 (KHTML, like Gecko) Chrome/19.0.1042.0 Safari/535.21'; + $tmp=getBrowserInfo($user_agent); $this->assertEquals('chrome',$tmp['browsername']); $this->assertEquals('19.0.1042.0',$tmp['browserversion']); - $_SERVER['HTTP_USER_AGENT']='chrome (Mozilla/5.0 (X11; Linux i686) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11)'; - $tmp=getBrowserInfo(); + + $user_agent ='chrome (Mozilla/5.0 (X11; Linux i686) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11)'; + $tmp=getBrowserInfo($user_agent); $this->assertEquals('chrome',$tmp['browsername']); $this->assertEquals('17.0.963.56',$tmp['browserversion']); - $_SERVER['HTTP_USER_AGENT']='Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_8; de-at) AppleWebKit/533.21.1 (KHTML, like Gecko) Version/5.0.5 Safari/533.21.1'; - $tmp=getBrowserInfo(); + + $user_agent ='Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_8; de-at) AppleWebKit/533.21.1 (KHTML, like Gecko) Version/5.0.5 Safari/533.21.1'; + $tmp=getBrowserInfo($user_agent); $this->assertEquals('safari',$tmp['browsername']); $this->assertEquals('533.21.1',$tmp['browserversion']); } From 2bc6ac4671f6e96c1ee6a03f8c589f65011deae8 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 22 Feb 2015 13:16:49 +0100 Subject: [PATCH 111/287] Finished new module to manage expense reports ! Fix export to support corectly multicompany --- htdocs/admin/expensereport.php | 499 ++++++++++++++++++ htdocs/core/class/html.formfile.class.php | 8 +- htdocs/core/lib/expensereport.lib.php | 43 ++ htdocs/core/lib/functions.lib.php | 9 +- .../modules/commande/modules_commande.php | 2 +- .../doc/pdf_standard.modules.php | 456 +++++++++------- .../expensereport/modules_expensereport.php | 72 +-- htdocs/core/modules/modAgenda.class.php | 2 +- htdocs/core/modules/modBanque.class.php | 4 +- htdocs/core/modules/modCategorie.class.php | 12 +- htdocs/core/modules/modCommande.class.php | 2 +- htdocs/core/modules/modContrat.class.php | 6 +- htdocs/core/modules/modDeplacement.class.php | 2 +- htdocs/core/modules/modExpedition.class.php | 2 +- .../core/modules/modExpenseReport.class.php | 39 +- htdocs/core/modules/modFacture.class.php | 4 +- htdocs/core/modules/modFicheinter.class.php | 2 +- htdocs/core/modules/modFournisseur.class.php | 6 +- htdocs/core/modules/modProjet.class.php | 26 +- htdocs/core/modules/modPropale.class.php | 2 +- htdocs/core/modules/modSalaries.class.php | 14 - htdocs/core/modules/modStock.class.php | 2 +- htdocs/core/modules/modTax.class.php | 2 +- htdocs/core/modules/modUser.class.php | 2 +- htdocs/expensereport/card.php | 222 +++++++- .../class/expensereport.class.php | 99 +++- htdocs/exports/export.php | 8 +- .../install/mysql/migration/3.7.0-3.8.0.sql | 2 +- .../mysql/tables/llx_expensereport.sql | 2 +- htdocs/langs/en_US/admin.lang | 2 + htdocs/langs/en_US/trips.lang | 9 +- 31 files changed, 1189 insertions(+), 373 deletions(-) create mode 100644 htdocs/admin/expensereport.php diff --git a/htdocs/admin/expensereport.php b/htdocs/admin/expensereport.php new file mode 100644 index 00000000000..d8b3d727bb5 --- /dev/null +++ b/htdocs/admin/expensereport.php @@ -0,0 +1,499 @@ + + * Copyright (C) 2004-2015 Laurent Destailleur + * Copyright (C) 2004 Sebastien Di Cintio + * Copyright (C) 2004 Benoit Mortier + * Copyright (C) 2005-2014 Regis Houssin + * Copyright (C) 2008 Raphael Bertrand (Resultic) + * Copyright (C) 2011-2013 Juanjo Menent + * Copyright (C) 2011-2013 Philippe Grand + * + * 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 3 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, see . + */ + +/** + * \file htdocs/admin/expensereport.php + * \ingroup expensereport + * \brief Setup page of module ExpenseReport + */ + +require '../main.inc.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/admin.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/expensereport.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/expensereport/class/expensereport.class.php'; + +$langs->load("admin"); +$langs->load("errors"); +$langs->load("trips"); +$langs->load('other'); + +if (! $user->admin) accessforbidden(); + +$action = GETPOST('action','alpha'); +$value = GETPOST('value','alpha'); +$label = GETPOST('label','alpha'); +$scandir = GETPOST('scandir','alpha'); +$type='expensereport'; + + +/* + * Actions + */ +if ($action == 'updateMask') +{ + $maskconst=GETPOST('maskconst','alpha'); + $maskvalue=GETPOST('maskvalue','alpha'); + if ($maskconst) $res = dolibarr_set_const($db,$maskconst,$maskvalue,'chaine',0,'',$conf->entity); + + if (! $res > 0) $error++; + + if (! $error) + { + setEventMessage($langs->trans("SetupSaved")); + } + else + { + setEventMessage($langs->trans("Error"),'errors'); + } +} + +else if ($action == 'specimen') // For fiche inter +{ + $modele= GETPOST('module','alpha'); + + $inter = new ExpenseReport($db); + $inter->initAsSpecimen(); + + // Search template files + $file=''; $classname=''; $filefound=0; + $dirmodels=array_merge(array('/'),(array) $conf->modules_parts['models']); + foreach($dirmodels as $reldir) + { + $file=dol_buildpath($reldir."core/modules/expensereport/doc/pdf_".$modele.".modules.php",0); + if (file_exists($file)) + { + $filefound=1; + $classname = "pdf_".$modele; + break; + } + } + + if ($filefound) + { + require_once $file; + + $module = new $classname($db); + + if ($module->write_file($inter,$langs) > 0) + { + header("Location: ".DOL_URL_ROOT."/document.php?modulepart=expensereport&file=SPECIMEN.pdf"); + return; + } + else + { + setEventMessage($obj->error,'errors'); + dol_syslog($obj->error, LOG_ERR); + } + } + else + { + setEventMessage($langs->trans("ErrorModuleNotFound"),'errors'); + dol_syslog($langs->trans("ErrorModuleNotFound"), LOG_ERR); + } +} + +// Define constants for submodules that contains parameters (forms with param1, param2, ... and value1, value2, ...) +if ($action == 'setModuleOptions') +{ + $post_size=count($_POST); + + $db->begin(); + + for($i=0;$i < $post_size;$i++) + { + if (array_key_exists('param'.$i,$_POST)) + { + $param=GETPOST("param".$i,'alpha'); + $value=GETPOST("value".$i,'alpha'); + if ($param) $res = dolibarr_set_const($db,$param,$value,'chaine',0,'',$conf->entity); + if (! $res > 0) $error++; + } + } + if (! $error) + { + $db->commit(); + setEventMessage($langs->trans("SetupSaved")); + } + else + { + $db->rollback(); + setEventMessage($langs->trans("Error"),'errors'); + } +} + +// Activate a model +else if ($action == 'set') +{ + $ret = addDocumentModel($value, $type, $label, $scandir); +} + +else if ($action == 'del') +{ + $ret = delDocumentModel($value, $type); + if ($ret > 0) + { + if ($conf->global->EXPENSEREPORT_ADDON_PDF == "$value") dolibarr_del_const($db, 'EXPENSEREPORT_ADDON_PDF',$conf->entity); + } +} + +// Set default model +else if ($action == 'setdoc') +{ + if (dolibarr_set_const($db, "EXPENSEREPORT_ADDON_PDF",$value,'chaine',0,'',$conf->entity)) + { + // La constante qui a ete lue en avant du nouveau set + // on passe donc par une variable pour avoir un affichage coherent + $conf->global->EXPENSEREPORT_ADDON_PDF = $value; + } + + // On active le modele + $ret = delDocumentModel($value, $type); + if ($ret > 0) + { + $ret = addDocumentModel($value, $type, $label, $scandir); + } +} + +else if ($action == 'setmod') +{ + // TODO Verifier si module numerotation choisi peut etre active + // par appel methode canBeActivated + + dolibarr_set_const($db, "EXPENSEREPORT_ADDON",$value,'chaine',0,'',$conf->entity); +} + +else if ($action == 'set_EXPENSEREPORT_FREE_TEXT') +{ + $freetext= GETPOST('EXPENSEREPORT_FREE_TEXT','alpha'); + $res = dolibarr_set_const($db, "EXPENSEREPORT_FREE_TEXT",$freetext,'chaine',0,'',$conf->entity); + + if (! $res > 0) $error++; + + if (! $error) + { + setEventMessage($langs->trans("SetupSaved")); + } + else + { + setEventMessage($langs->trans("Error"),'errors'); + } +} + +else if ($action == 'set_EXPENSEREPORT_DRAFT_WATERMARK') +{ + $draft= GETPOST('EXPENSEREPORT_DRAFT_WATERMARK','alpha'); + + $res = dolibarr_set_const($db, "EXPENSEREPORT_DRAFT_WATERMARK",trim($draft),'chaine',0,'',$conf->entity); + + if (! $res > 0) $error++; + + if (! $error) + { + setEventMessage($langs->trans("SetupSaved")); + } + else + { + setEventMessage($langs->trans("Error"),'errors'); + } +} + + + +/* + * View + */ + +$dirmodels=array_merge(array('/'),(array) $conf->modules_parts['models']); + +llxHeader(); + +$form=new Form($db); + +$linkback=''.$langs->trans("BackToModuleList").''; +print_fiche_titre($langs->trans("ExpenseReportsSetup"),$linkback,'setup'); + + +$head=expensereport_admin_prepare_head(); + +dol_fiche_head($head, 'expensereport', $langs->trans("ExpenseReports"), 0, 'trip'); + +// Interventions numbering model +/* +print_titre($langs->trans("FicheinterNumberingModules")); + +print '
'.$langs->trans("AccountancyCode").''.$object->accountancy_code.'
'; +print ''; +print ''; +print ''; +print ''; +print ''; +print ''; +print "\n"; + +clearstatcache(); + +foreach ($dirmodels as $reldir) +{ + $dir = dol_buildpath($reldir."core/modules/fichinter/"); + + if (is_dir($dir)) + { + $handle = opendir($dir); + if (is_resource($handle)) + { + $var=true; + + while (($file = readdir($handle))!==false) + { + if (preg_match('/^(mod_.*)\.php$/i',$file,$reg)) + { + $file = $reg[1]; + $classname = substr($file,4); + + require_once $dir.$file.'.php'; + + $module = new $file; + + if ($module->isEnabled()) + { + // Show modules according to features level + if ($module->version == 'development' && $conf->global->MAIN_FEATURES_LEVEL < 2) continue; + if ($module->version == 'experimental' && $conf->global->MAIN_FEATURES_LEVEL < 1) continue; + + $var=!$var; + print ''; + + // Show example of numbering model + print ''."\n"; + + print ''; + + $ficheinter=new Fichinter($db); + $ficheinter->initAsSpecimen(); + + // Info + $htmltooltip=''; + $htmltooltip.=''.$langs->trans("Version").': '.$module->getVersion().'
'; + $nextval=$module->getNextValue($mysoc,$ficheinter); + if ("$nextval" != $langs->trans("NotAvailable")) { // Keep " on nextval + $htmltooltip.=''.$langs->trans("NextValue").': '; + if ($nextval) { + if (preg_match('/^Error/',$nextval) || $nextval=='NotConfigured') + $nextval = $langs->trans($nextval); + $htmltooltip.=$nextval.'
'; + } else { + $htmltooltip.=$langs->trans($module->error).'
'; + } + } + print ''; + + print ''; + } + } + } + closedir($handle); + } + } +} + +print '
'.$langs->trans("Name").''.$langs->trans("Description").''.$langs->trans("Example").''.$langs->trans("Status").''.$langs->trans("ShortInfo").'
'.$module->nom."\n"; + print $module->info(); + print ''; + $tmp=$module->getExample(); + if (preg_match('/^Error/',$tmp)) print '
'.$langs->trans($tmp).'
'; + elseif ($tmp=='NotConfigured') print $langs->trans($tmp); + else print $tmp; + print '
'; + if ($conf->global->FICHEINTER_ADDON == $classname) + { + print img_picto($langs->trans("Activated"),'switch_on'); + } + else + { + print ''.img_picto($langs->trans("Disabled"),'switch_off').''; + } + print ''; + print $form->textwithpicto('',$htmltooltip,1,0); + print '

'; +*/ + +/* + * Documents models for Interventions + */ + +print_titre($langs->trans("TemplatePDFExpenseReports")); + +// Defini tableau def des modeles +$type='expensereport'; +$def = array(); +$sql = "SELECT nom"; +$sql.= " FROM ".MAIN_DB_PREFIX."document_model"; +$sql.= " WHERE type = '".$type."'"; +$sql.= " AND entity = ".$conf->entity; +$resql=$db->query($sql); +if ($resql) +{ + $i = 0; + $num_rows=$db->num_rows($resql); + while ($i < $num_rows) + { + $array = $db->fetch_array($resql); + array_push($def, $array[0]); + $i++; + } +} +else +{ + dol_print_error($db); +} + + +print ''; +print ''; +print ''; +print ''; +print '\n"; +print '\n"; +print ''; +print ''; +print "\n"; + +clearstatcache(); + +$var=true; +foreach ($dirmodels as $reldir) +{ + $dir = dol_buildpath($reldir."core/modules/expensereport/doc"); + + if (is_dir($dir)) + { + $handle=opendir($dir); + if (is_resource($handle)) + { + while (($file = readdir($handle))!==false) + { + $filelist[]=$file; + } + closedir($handle); + arsort($filelist); + + foreach($filelist as $file) + { + if (preg_match('/\.modules\.php$/i',$file) && preg_match('/^(pdf_|doc_)/',$file)) + { + + if (file_exists($dir.'/'.$file)) + { + $var=!$var; + + $name = substr($file, 4, dol_strlen($file) -16); + $classname = substr($file, 0, dol_strlen($file) -12); + + require_once $dir.'/'.$file; + $module = new $classname($db); + + $modulequalified=1; + if ($module->version == 'development' && $conf->global->MAIN_FEATURES_LEVEL < 2) $modulequalified=0; + if ($module->version == 'experimental' && $conf->global->MAIN_FEATURES_LEVEL < 1) $modulequalified=0; + + if ($modulequalified) + { + print ''; + + // Active + if (in_array($name, $def)) + { + print ""; + } + else + { + print ""; + } + + // Default + print "'; + + // Info + $htmltooltip = ''.$langs->trans("Name").': '.$module->name; + $htmltooltip.='
'.$langs->trans("Type").': '.($module->type?$module->type:$langs->trans("Unknown")); + $htmltooltip.='
'.$langs->trans("Width").'/'.$langs->trans("Height").': '.$module->page_largeur.'/'.$module->page_hauteur; + $htmltooltip.='

'.$langs->trans("FeaturesSupported").':'; + $htmltooltip.='
'.$langs->trans("Logo").': '.yn($module->option_logo,1,1); + $htmltooltip.='
'.$langs->trans("PaymentMode").': '.yn($module->option_modereg,1,1); + $htmltooltip.='
'.$langs->trans("PaymentConditions").': '.yn($module->option_condreg,1,1); + $htmltooltip.='
'.$langs->trans("MultiLanguage").': '.yn($module->option_multilang,1,1); + $htmltooltip.='
'.$langs->trans("WatermarkOnDraftOrders").': '.yn($module->option_draft_watermark,1,1); + print ''; + + // Preview + print ''; + + print ''; + } + } + } + } + } + } +} + +print '
'.$langs->trans("Name").''.$langs->trans("Description").''.$langs->trans("Status")."'.$langs->trans("Default")."'.$langs->trans("ShortInfo").''.$langs->trans("Preview").'
'; + print (empty($module->name)?$name:$module->name); + print "\n"; + if (method_exists($module,'info')) print $module->info($langs); + else print $module->description; + print '\n"; + print 'scandir.'&label='.urlencode($module->name).'">'; + print img_picto($langs->trans("Enabled"),'switch_on'); + print ''; + print "\n"; + print 'scandir.'&label='.urlencode($module->name).'">'.img_picto($langs->trans("Disabled"),'switch_off').''; + print ""; + if ($conf->global->EXPENSEREPORT_ADDON_PDF == "$name") + { + print img_picto($langs->trans("Default"),'on'); + } + else + { + print 'scandir.'&label='.urlencode($module->name).'" alt="'.$langs->trans("Default").'">'.img_picto($langs->trans("Disabled"),'off').''; + } + print ''; + print $form->textwithpicto('',$htmltooltip,-1,0); + print ''; + if ($module->type == 'pdf') + { + print ''.img_object($langs->trans("Preview"),'intervention').''; + } + else + { + print img_object($langs->trans("PreviewNotAvailable"),'generic'); + } + print '
'; + +dol_fiche_end(); + + +llxFooter(); + +$db->close(); diff --git a/htdocs/core/class/html.formfile.class.php b/htdocs/core/class/html.formfile.class.php index 241c44cf5f8..8a47e8a0eb1 100644 --- a/htdocs/core/class/html.formfile.class.php +++ b/htdocs/core/class/html.formfile.class.php @@ -440,11 +440,11 @@ class FormFile } else if ($modulepart != 'agenda') { - // For normalized standard modules - $file=dol_buildpath('/core/modules/'.$modulepart.'/modules_'.$modulepart.'.php',0); + // For normalized standard modules + $file=dol_buildpath('/core/modules/'.$modulepart.'/modules_'.$modulepart.'.php',0); if (file_exists($file)) { - $res=include_once $file; + $res=include_once $file; } // For normalized external modules else @@ -458,7 +458,7 @@ class FormFile $modellist=call_user_func($class.'::liste_modeles',$this->db); } else - { + { dol_print_error($this->db,'Bad value for modulepart'); return -1; } diff --git a/htdocs/core/lib/expensereport.lib.php b/htdocs/core/lib/expensereport.lib.php index f46e6416ec6..0bd2c0f721b 100644 --- a/htdocs/core/lib/expensereport.lib.php +++ b/htdocs/core/lib/expensereport.lib.php @@ -59,3 +59,46 @@ function expensereport_prepare_head($object) return $head; } + + + +/** + * Return array head with list of tabs to view object informations. + * + * @return array head array with tabs + */ +function expensereport_admin_prepare_head() +{ + global $langs, $conf, $user; + + $h = 0; + $head = array(); + + $h = 0; + + $head[$h][0] = DOL_URL_ROOT."/admin/expensereport.php"; + $head[$h][1] = $langs->trans("ExpenseReports"); + $head[$h][2] = 'expensereport'; + $h++; + + // Show more tabs from modules + // Entries must be declared in modules descriptor with line + // $this->tabs = array('entity:+tabname:Title:@mymodule:/mymodule/mypage.php?id=__ID__'); to add new tab + // $this->tabs = array('entity:-tabname:Title:@mymodule:/mymodule/mypage.php?id=__ID__'); to remove a tab + complete_head_from_modules($conf,$langs,null,$head,$h,'expensereport_admin'); + + /*$head[$h][0] = DOL_URL_ROOT.'/fichinter/admin/fichinter_extrafields.php'; + $head[$h][1] = $langs->trans("ExtraFields"); + $head[$h][2] = 'attributes'; + $h++; + + $head[$h][0] = DOL_URL_ROOT.'/fichinter/admin/fichinterdet_extrafields.php'; + $head[$h][1] = $langs->trans("ExtraFieldsLines"); + $head[$h][2] = 'attributesdet'; + $h++; + */ + + complete_head_from_modules($conf,$langs,null,$head,$h,'expensereport_admin','remove'); + + return $head; +} diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php index 537cf68986b..ebbe6d0d79c 100644 --- a/htdocs/core/lib/functions.lib.php +++ b/htdocs/core/lib/functions.lib.php @@ -95,13 +95,13 @@ function getDoliDBInstance($type, $host, $user, $pass, $name, $port) } /** - * Get entity to use + * Get list of entity id to use * * @param string $element Current element - * @param int $shared 1=Return shared entities + * @param int $shared 0=Return id of entity, 1=Return id entity + shared entities * @return mixed Entity id(s) to use */ -function getEntity($element=false, $shared=false) +function getEntity($element=false, $shared=0) { global $conf, $mc; @@ -112,12 +112,9 @@ function getEntity($element=false, $shared=false) else { $out=''; - $addzero = array('user', 'usergroup'); if (in_array($element, $addzero)) $out.= '0,'; - $out.= $conf->entity; - return $out; } } diff --git a/htdocs/core/modules/commande/modules_commande.php b/htdocs/core/modules/commande/modules_commande.php index 18a586d3b63..2caf1f905e6 100644 --- a/htdocs/core/modules/commande/modules_commande.php +++ b/htdocs/core/modules/commande/modules_commande.php @@ -160,7 +160,7 @@ abstract class ModeleNumRefCommandes * @param int $hidedesc Hide description * @param int $hideref Hide ref * @return int 0 if KO, 1 if OK - * @deprecated Use the new function generateDocument of Commande class + * @deprecated Use the new function generateDocument of Commande class */ function commande_pdf_create(DoliDB $db, Commande $object, $modele, $outputlangs, $hidedetails=0, $hidedesc=0, $hideref=0) { diff --git a/htdocs/core/modules/expensereport/doc/pdf_standard.modules.php b/htdocs/core/modules/expensereport/doc/pdf_standard.modules.php index 2ce272af9ef..bdb19778c87 100755 --- a/htdocs/core/modules/expensereport/doc/pdf_standard.modules.php +++ b/htdocs/core/modules/expensereport/doc/pdf_standard.modules.php @@ -3,7 +3,7 @@ * * 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 + * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, @@ -19,10 +19,10 @@ /** * \file htdocs/core/modules/expensereport/doc/pdf_standard.modules.php * \ingroup expensereport - * \brief File of class to generate invoices from standard model + * \brief File of class to generate expense report from standard model */ -dol_include_once("/expensereport/core/modules/expensereport/modules_expensereport.php"); +require_once DOL_DOCUMENT_ROOT.'/core/modules/expensereport/modules_expensereport.php'; require_once(DOL_DOCUMENT_ROOT."/product/class/product.class.php"); require_once(DOL_DOCUMENT_ROOT."/core/lib/functions2.lib.php"); require_once(DOL_DOCUMENT_ROOT.'/core/lib/pdf.lib.php'); @@ -34,9 +34,25 @@ require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php'; /** * Classe permettant de generer les factures au modele Crabe */ -class pdf_ extends ModeleExpenseReport +class pdf_standard extends ModeleExpenseReport { - var $emetteur; // Objet societe qui emet + var $db; + var $name; + var $description; + var $type; + + var $phpmin = array(4,3,0); // Minimum version of PHP required by module + var $version = 'dolibarr'; + + var $page_largeur; + var $page_hauteur; + var $format; + var $marge_gauche; + var $marge_droite; + var $marge_haute; + var $marge_basse; + + var $emetteur; // Objet societe qui emet /** @@ -51,11 +67,11 @@ class pdf_ extends ModeleExpenseReport $langs->load("main"); $langs->load("trips"); $langs->load("project"); - $langs->load("expensereport@expensereport"); + $langs->load("trips"); $this->db = $db; $this->name = ""; - $this->description = $langs->trans('PDFDescription'); + $this->description = $langs->trans('PDFStandardExpenseReports'); // Dimension page pour format A4 $this->type = 'pdf'; @@ -85,17 +101,16 @@ class pdf_ extends ModeleExpenseReport $this->emetteur=$mysoc; if (empty($this->emetteur->country_code)) $this->emetteur->country_code=substr($langs->defaultlang,-2); // By default, if was not defined - // Defini position des colonnes - // Defini position des colonnes + // Define position of columns $this->posxpiece=$this->marge_gauche+1; $this->posxdesc=20; $this->posxdate=85; $this->posxtype=105; $this->posxprojet=125; $this->posxtva=145; - $this->posxup=158; - $this->posxqty=170; - $this->postotalttc=176; + $this->posxup=162; + $this->posxqty=176; + $this->postotalttc=186; if ($this->page_largeur < 210) // To work with US executive format { $this->posxdate-=20; @@ -124,6 +139,7 @@ class pdf_ extends ModeleExpenseReport * @param int $hidedetails Do not show line details * @param int $hidedesc Do not show desc * @param int $hideref Do not show ref + * @return int 1=OK, 0=KO */ function write_file($object,$outputlangs,$srctemplatepath='',$hidedetails=0,$hidedesc=0,$hideref=0) { @@ -133,40 +149,27 @@ class pdf_ extends ModeleExpenseReport // For backward compatibility with FPDF, force output charset to ISO, because FPDF expect text to be encoded in ISO if (! empty($conf->global->MAIN_USE_FPDF)) $outputlangs->charset_output='ISO-8859-1'; - - // Hack to use expensereport dir - $rootfordata = DOL_DATA_ROOT; - $rootforuser = DOL_DATA_ROOT; - // If multicompany module is enabled, we redefine the root of data - //if (! empty($this->multicompany->enabled) && ! empty($this->entity) && $this->entity > 1) - //{ - // $rootfordata.='/'.$this->entity; - //} - $conf->expensereport->dir_output = $rootfordata.'/expensereport'; - $conf->expensereport_->dir_output = $rootfordata.'/expensereport'; - - $outputlangs->load("main"); $outputlangs->load("dict"); $outputlangs->load("trips"); $outputlangs->load("project"); - $outputlangs->load("expensereport@expensereport"); - $default_font_size = pdf_getPDFFontSize($outputlangs); + $nblignes = count($object->lines); - if ($conf->expensereport_->dir_output) + if ($conf->expensereport->dir_output) { - // Definition de l'objet $object (pour compatibilite ascendante) - if (! is_object($object)) + // Definition of $dir and $file + if ($object->specimen) { - $id = $object; - $object = new ExpenseReport($db); - $ret=$object->fetch($id,$user); + $dir = $conf->expensereport->dir_output; + $file = $dir . "/SPECIMEN.pdf"; + } + else + { + $objectref = dol_sanitizeFileName($object->ref); + $dir = $conf->expensereport->dir_output . "/" . $objectref; + $file = $dir . "/" . $objectref . ".pdf"; } - - $objectref = dol_sanitizeFileName($object->ref_number); - $dir = $conf->expensereport_->dir_output . "/" . $objectref; - $file = $dir . "/" . $objectref . ".pdf"; if (! file_exists($dir)) { @@ -181,10 +184,24 @@ class pdf_ extends ModeleExpenseReport if (file_exists($dir)) { - $nblignes = count($object->lines); + // Add pdfgeneration hook + if (! is_object($hookmanager)) + { + include_once DOL_DOCUMENT_ROOT.'/core/class/hookmanager.class.php'; + $hookmanager=new HookManager($this->db); + } + $hookmanager->initHooks(array('pdfgeneration')); + $parameters=array('file'=>$file,'object'=>$object,'outputlangs'=>$outputlangs); + global $action; + $reshook=$hookmanager->executeHooks('beforePDFCreation',$parameters,$object,$action); // Note that $action and $object may have been modified by some hooks // Create pdf instance $pdf=pdf_getInstance($this->format); + $default_font_size = pdf_getPDFFontSize($outputlangs); // Must be after pdf_getInstance + $heightforinfotot = 50; // Height reserved to output the info and total part + $heightforfreetext= (isset($conf->global->MAIN_PDF_FREETEXT_HEIGHT)?$conf->global->MAIN_PDF_FREETEXT_HEIGHT:5); // Height reserved to output the free text on last page + $heightforfooter = $this->marge_basse + 8; // Height reserved to output the footer (value include bottom margin) + $pdf->SetAutoPageBreak(1,0); if (class_exists('TCPDF')) { @@ -205,13 +222,12 @@ class pdf_ extends ModeleExpenseReport $pdf->SetTitle($outputlangs->convToOutputCharset($object->ref_number)); $pdf->SetSubject($outputlangs->transnoentities("Trips")); - $pdf->SetCreator(""); + $pdf->SetCreator("Dolibarr ".DOL_VERSION); $pdf->SetAuthor($outputlangs->convToOutputCharset($user->getFullName($outputlangs))); - $pdf->SetKeyWords($outputlangs->convToOutputCharset($object->ref_number)." ".$outputlangs->transnoentities("Trips")); + $pdf->SetKeyWords($outputlangs->convToOutputCharset($object->ref)." ".$outputlangs->transnoentities("Trips")); if (! empty($conf->global->MAIN_DISABLE_PDF_COMPRESSION)) $pdf->SetCompression(false); $pdf->SetMargins($this->marge_gauche, $this->marge_haute, $this->marge_droite); // Left, Top, Right - $pdf->SetAutoPageBreak(1,0); // Positionne $this->atleastonediscount si on a au moins une remise for ($i = 0 ; $i < $nblignes ; $i++) @@ -232,17 +248,29 @@ class pdf_ extends ModeleExpenseReport $pdf->SetTextColor(0,0,0); $tab_top = 95; - $tab_top_newpage = 95; + $tab_top_newpage = (empty($conf->global->MAIN_PDF_DONOTREPEAT_HEAD)?95:10); $tab_height = 110; $tab_height_newpage = 110; // Affiche notes - if (! empty($object->note)) + $notetoshow=empty($object->note_public)?'':$object->note_public; + if (! empty($conf->global->MAIN_ADD_SALE_REP_SIGNATURE_IN_NOTE)) { - $tab_top = 93; + // Get first sale rep + if (is_object($object->thirdparty)) + { + $salereparray=$object->thirdparty->getSalesRepresentatives($user); + $salerepobj=new User($this->db); + $salerepobj->fetch($salereparray[0]['id']); + if (! empty($salerepobj->signature)) $notetoshow=dol_concatdesc($notetoshow, $salerepobj->signature); + } + } + if ($notetoshow) + { + $tab_top = 95; $pdf->SetFont('','', $default_font_size - 1); - $pdf->writeHTMLCell(190, 3, $this->posxdesc-1, $tab_top, dol_htmlentitiesbr($object->note), 0, 1); + $pdf->writeHTMLCell(190, 3, $this->posxpiece-1, $tab_top, dol_htmlentitiesbr($notetoshow), 0, 1); $nexY = $pdf->GetY(); $height_note=$nexY-$tab_top; @@ -265,11 +293,20 @@ class pdf_ extends ModeleExpenseReport // Loop on each lines for ($i = 0 ; $i < $nblignes ; $i++) { + $piece_comptable = $i +1; + $curY = $nexY; $pdf->SetFont('','', $default_font_size - 1); // Into loop to work with multipage $pdf->SetTextColor(0,0,0); - $piece_comptable = $i +1; + $pdf->setTopMargin($tab_top_newpage); + $pdf->setPageOrientation('', 1, $heightforfooter+$heightforfreetext+$heightforinfotot); // The only function to edit the bottom margin of current page to set it. + $pageposbefore=$pdf->getPage(); + + // Description of product line + $curX = $this->posxdesc-1; + + $showpricebeforepagebreak=1; // Piece comptable $pdf->SetFont('','', $default_font_size - 1); @@ -277,46 +314,50 @@ class pdf_ extends ModeleExpenseReport // Comments $pdf->SetFont('','', $default_font_size - 1); - $pdf->SetXY ($this->posxcomment, $curY); - $pdf->writeHTMLCell($this->posxdate-$this->posxdesc-1, 3, $this->posxdesc-1, $curY, $object->lignes[$i]->comments, 0, 1); + $pdf->SetXY($this->posxcomment, $curY); + $pdf->writeHTMLCell($this->posxdate-$this->posxdesc-1, 3, $this->posxdesc-1, $curY, $object->lines[$i]->comments, 0, 1); //nexY $nexY = $pdf->GetY(); + $pageposafter=$pdf->getPage(); + $pdf->setPage($pageposbefore); + $pdf->setTopMargin($this->marge_haute); + $pdf->setPageOrientation('', 1, 0); // The only function to edit the bottom margin of current page to set it. // Date $pdf->SetFont('','', $default_font_size - 1); - $pdf->SetXY ($this->posxdate, $curY); - $pdf->MultiCell($this->posxtype-$this->posxdate-1, 3,dol_print_date($object->lignes[$i]->date,"day",false,$outpulangs), 0, 'C'); + $pdf->SetXY($this->posxdate, $curY); + $pdf->MultiCell($this->posxtype-$this->posxdate-1, 3,dol_print_date($object->lines[$i]->date,"day",false,$outpulangs), 0, 'C'); // Type $pdf->SetFont('','', $default_font_size - 1); - $pdf->SetXY ($this->posxtype, $curY); - $pdf->MultiCell($this->posxprojet-$this->posxtype-1, 3,$outputlangs->transnoentities($object->lignes[$i]->type_fees_code), 0, 'C'); + $pdf->SetXY($this->posxtype, $curY); + $pdf->MultiCell($this->posxprojet-$this->posxtype-1, 3,$outputlangs->transnoentities($object->lines[$i]->type_fees_code), 0, 'C'); // Projet $pdf->SetFont('','', $default_font_size - 1); - $pdf->SetXY ($this->posxprojet, $curY); - $pdf->MultiCell($this->posxtva-$this->posxprojet-1, 3,$object->lignes[$i]->projet_ref, 0, 'C'); + $pdf->SetXY($this->posxprojet, $curY); + $pdf->MultiCell($this->posxtva-$this->posxprojet-1, 3,$object->lines[$i]->projet_ref, 0, 'C'); - // TVA + // VAT Rate $pdf->SetFont('','', $default_font_size - 1); - $pdf->SetXY ($this->posxtva, $curY); - $pdf->MultiCell($this->posxup-$this->posxtva-1, 3,vatrate($object->lignes[$i]->tva_taux,true), 0, 'R'); + $pdf->SetXY($this->posxtva, $curY); + $pdf->MultiCell($this->posxup-$this->posxtva-1, 3,vatrate($object->lines[$i]->tva_taux,true), 0, 'R'); // UP $pdf->SetFont('','', $default_font_size - 1); - $pdf->SetXY ($this->posxup, $curY); - $pdf->MultiCell($this->posxqty-$this->posxup-1, 3,price($object->lignes[$i]->value_unit), 0, 'R'); + $pdf->SetXY($this->posxup, $curY); + $pdf->MultiCell($this->posxqty-$this->posxup-1, 3,price($object->lines[$i]->value_unit), 0, 'R'); - // QTY + // Quantity $pdf->SetFont('','', $default_font_size - 1); - $pdf->SetXY ($this->posxqty, $curY); - $pdf->MultiCell($this->postotalttc-$this->posxqty, 3,$object->lignes[$i]->qty, 0, 'C'); + $pdf->SetXY($this->posxqty, $curY); + $pdf->MultiCell($this->postotalttc-$this->posxqty, 3,$object->lines[$i]->qty, 0, 'C'); // TotalTTC $pdf->SetFont('','', $default_font_size - 1); - $pdf->SetXY ($this->postotalttc-2, $curY); - $pdf->MultiCell(26, 3,price($object->lignes[$i]->total_ttc), 0, 'R'); + $pdf->SetXY($this->postotalttc-2, $curY); + $pdf->MultiCell($this->page_largeur-$this->marge_droite-$this->postotalttc, 3, price($object->lines[$i]->total_ttc), 0, 'R'); $nexY+=5; @@ -338,38 +379,42 @@ class pdf_ extends ModeleExpenseReport $nblineFollowDesc = 0; } - // Test if a new page is required - if ($pagenb == 1) - { - $tab_top_in_current_page=$tab_top; - $tab_height_in_current_page=$tab_height; - } - else - { - $tab_top_in_current_page=$tab_top_newpage; - $tab_height_in_current_page=$tab_height_newpage; - } - if (($nexY+$nblineFollowDesc) > ($tab_top_in_current_page+$tab_height_in_current_page) && $i < ($nblignes - 1)) - { - if ($pagenb == 1): - $this->_tableau($pdf, $tab_top, $tab_height, $nexY, $outputlangs); - $nexY=$tab_top + $tab_height + 1; - else: - $this->_tableau($pdf, $tab_top_newpage, $tab_height_newpage, $nexY, $outputlangs); - $nexY=$tab_top_newpage + $tab_height_newpage + 1; - endif; - - $this->_pagefoot($pdf,$object,$outputlangs); + $nexY+=2; // Passe espace entre les lignes + // Detect if some page were added automatically and output _tableau for past pages + while ($pagenb < $pageposafter) + { + $pdf->setPage($pagenb); + if ($pagenb == 1) + { + $this->_tableau($pdf, $tab_top, $this->page_hauteur - $tab_top - $heightforfooter, 0, $outputlangs, 0, 1); + } + else + { + $this->_tableau($pdf, $tab_top_newpage, $this->page_hauteur - $tab_top_newpage - $heightforfooter, 0, $outputlangs, 1, 1); + } + $this->_pagefoot($pdf,$object,$outputlangs,1); + $pagenb++; + $pdf->setPage($pagenb); + $pdf->setPageOrientation('', 1, 0); // The only function to edit the bottom margin of current page to set it. + if (empty($conf->global->MAIN_PDF_DONOTREPEAT_HEAD)) $this->_pagehead($pdf, $object, 0, $outputlangs); + } + if (isset($object->lines[$i+1]->pagebreak) && $object->lines[$i+1]->pagebreak) + { + if ($pagenb == 1) + { + $this->_tableau($pdf, $tab_top, $this->page_hauteur - $tab_top - $heightforfooter, 0, $outputlangs, 0, 1); + } + else + { + $this->_tableau($pdf, $tab_top_newpage, $this->page_hauteur - $tab_top_newpage - $heightforfooter, 0, $outputlangs, 1, 1); + } + $this->_pagefoot($pdf,$object,$outputlangs,1); // New page $pdf->AddPage(); + if (! empty($tplidx)) $pdf->useTemplate($tplidx); $pagenb++; - $this->_pagehead($pdf, $object, 0, $outputlangs); - $pdf->SetFont('','', $default_font_size - 1); - $pdf->MultiCell(0, 3, ''); // Set interline to 3 - $pdf->SetTextColor(0,0,0); - - $nexY = $tab_top_newpage + 7; + if (empty($conf->global->MAIN_PDF_DONOTREPEAT_HEAD)) $this->_pagehead($pdf, $object, 0, $outputlangs); } } @@ -377,30 +422,30 @@ class pdf_ extends ModeleExpenseReport // Show square if ($pagenb == 1) { - $this->_tableau($pdf, $tab_top, $tab_height, $nexY, $outputlangs); - $bottomlasttab=$tab_top + $tab_height + 1; + $this->_tableau($pdf, $tab_top, $this->page_hauteur - $tab_top - $heightforinfotot - $heightforfreetext - $heightforfooter, 0, $outputlangs, 0, 0); + $bottomlasttab=$this->page_hauteur - $heightforinfotot - $heightforfreetext - $heightforfooter + 1; } else { - $this->_tableau($pdf, $tab_top_newpage, $tab_height_newpage, $nexY, $outputlangs); - $bottomlasttab=$tab_top_newpage + $tab_height_newpage + 1; + $this->_tableau($pdf, $tab_top_newpage, $this->page_hauteur - $tab_top_newpage - $heightforinfotot - $heightforfreetext - $heightforfooter, 0, $outputlangs, 1, 0); + $bottomlasttab=$this->page_hauteur - $heightforinfotot - $heightforfreetext - $heightforfooter + 1; } - // Affiche zone totaux + // Show total area box $posy=$bottomlasttab+5;//$nexY+95; - $pdf->SetXY(120, $posy); - $pdf->MultiCell(50, 5, $outputlangs->transnoentities("TotalHT"), 1, 'L'); - $pdf->SetXY (170, $posy); - $pdf->MultiCell(30, 5, price($object->total_ht), 1, 'R'); + $pdf->SetXY(100, $posy); + $pdf->MultiCell(60, 5, $outputlangs->transnoentities("TotalHT"), 1, 'L'); + $pdf->SetXY(160, $posy); + $pdf->MultiCell($this->page_largeur - $this->marge_gauche - 160, 5, price($object->total_ht), 1, 'R'); $pdf->SetFillColor(248,248,248); $posy+=5; - $pdf->SetXY (120, $posy); + $pdf->SetXY(100, $posy); $pdf->SetFont('','B', 10); $pdf->SetTextColor(0,0,60); - $pdf->MultiCell(50, 5, $outputlangs->transnoentities("TotalTTC"), 1,'L'); - $pdf->SetXY (170, $posy); - $pdf->MultiCell(30, 5, price($object->total_ttc),1, 'R'); + $pdf->MultiCell(60, 5, $outputlangs->transnoentities("TotalTTC"), 1,'L'); + $pdf->SetXY(160, $posy); + $pdf->MultiCell($this->page_largeur - $this->marge_gauche - 160, 5, price($object->total_ttc),1, 'R'); // Pied de page $this->_pagefoot($pdf,$object,$outputlangs); @@ -411,11 +456,6 @@ class pdf_ extends ModeleExpenseReport $pdf->Output($file,'F'); // Add pdfgeneration hook - if (! is_object($hookmanager)) - { - include_once DOL_DOCUMENT_ROOT.'/core/class/hookmanager.class.php'; - $hookmanager=new HookManager($this->db); - } $hookmanager->initHooks(array('pdfgeneration')); $parameters=array('file'=>$file,'object'=>$object,'outputlangs'=>$outputlangs); global $action; @@ -434,7 +474,7 @@ class pdf_ extends ModeleExpenseReport } else { - $this->error=$langs->trans("ErrorConstantNotDefined","DEPLACEMENT_OUTPUTDIR"); + $this->error=$langs->trans("ErrorConstantNotDefined","EXPENSEREPORT_OUTPUTDIR"); return 0; } $this->error=$langs->trans("ErrorUnknown"); @@ -468,9 +508,9 @@ class pdf_ extends ModeleExpenseReport */ // Filligrane brouillon - if($object->fk_c_expensereport_statuts==1) + if ($object->fk_c_expensereport_statuts==1 && ! empty($conf->global->EXPENSEREPORT_FREE_TEXT)) { - pdf_watermark($pdf,$outputlangs,$this->page_hauteur,$this->page_largeur,'mm',"' - PREVIEW ONLY"); + pdf_watermark($pdf,$outputlangs,$this->page_hauteur,$this->page_largeur,'mm',$conf->global->EXPENSEREPORT_FREE_TEXT); } $pdf->SetTextColor(0,0,60); @@ -504,48 +544,37 @@ class pdf_ extends ModeleExpenseReport $pdf->MultiCell(100, 4, $outputlangs->convToOutputCharset($text), 0, 'L'); } - $pdf->SetFont('','B', $default_font_size + 6); + $pdf->SetFont('','B', $default_font_size + 4); $pdf->SetXY($posx,$posy); - $pdf->SetTextColor(255,255,255); - $pdf->SetFillColor(193,219,62); - $ref_text = explode($conf->global->NDF_EXPLODE_CHAR,$object->ref_number); - $ref_text = substr($ref_text[1],3,$conf->global->NDF_NUM_CAR_REF); - $pdf->MultiCell(110,6,"Note de frais ".$ref_text, 0, 'L', 1); + $pdf->SetTextColor(0,0,60); + $pdf->MultiCell($this->page_largeur-$this->marge_droite-$posx,6,$langs->trans("ExpenseReport"), 0, 'L'); $pdf->SetFont('','', $default_font_size -1); // Réf complète $posy+=8; - $pdf->SetXY(100,$posy); + $pdf->SetXY($posx,$posy); $pdf->SetTextColor(0,0,60); - $pdf->MultiCell(100, 3, $outputlangs->transnoentities("Ref")." : " . $object->ref_number, '', 'L'); + $pdf->MultiCell($this->page_largeur-$this->marge_droite-$posx, 3, $outputlangs->transnoentities("Ref")." : " . $object->ref, '', 'L'); // Date début période $posy+=5; - $pdf->SetXY(100,$posy); + $pdf->SetXY($posx,$posy); $pdf->SetTextColor(0,0,60); - $pdf->MultiCell(100, 3, $outputlangs->transnoentities("DateStart")." : " . ($object->date_debut>0?$object->date_debut:dol_print_date($object->date_debut,"day",false,$outpulangs)), '', 'L'); + $pdf->MultiCell($this->page_largeur-$this->marge_droite-$posx, 3, $outputlangs->transnoentities("DateStart")." : " . ($object->date_debut>0?dol_print_date($object->date_debut,"day",false,$outpulangs):''), '', 'L'); // Date fin période $posy+=5; - $pdf->SetXY(100,$posy); + $pdf->SetXY($posx,$posy); $pdf->SetTextColor(0,0,60); - $pdf->MultiCell(100, 3, $outputlangs->transnoentities("DateEnd")." : " . ($object->date_fin>0?dol_print_date($object->date_fin,"day",false,$outpulangs):''), '', 'L'); + $pdf->MultiCell($this->page_largeur-$this->marge_droite-$posx, 3, $outputlangs->transnoentities("DateEnd")." : " . ($object->date_fin>0?dol_print_date($object->date_fin,"day",false,$outpulangs):''), '', 'L'); // Statut NDF - $posy+=7; - $pdf->SetXY(100,$posy); - $pdf->SetFont('','B',20); + $posy+=6; + $pdf->SetXY($posx,$posy); + $pdf->SetFont('','B',18); $pdf->SetTextColor(111,81,124); - if(preg_match("#Pay#",$object->libelle_statut) && !preg_match("#A P#",$object->libelle_statut)): - $pdf->MultiCell(100, 3,$outputlangs->convToOutputCharset("Payée"), '', 'L'); - elseif(preg_match("#Annul#",$object->libelle_statut)): - $pdf->MultiCell(100, 3,$outputlangs->convToOutputCharset("Annulée"), '', 'L'); - elseif(preg_match("#Refus#",$object->libelle_statut)): - $pdf->MultiCell(100, 3,$outputlangs->convToOutputCharset("Refusée"), '', 'L'); - else: - $pdf->MultiCell(100, 3,$object->libelle_statut, '', 'L'); - endif; + $pdf->MultiCell($this->page_largeur-$this->marge_droite-$posx, 3, $object->getLibStatut(0), '', 'R'); // Sender properties $carac_emetteur = ''; @@ -596,64 +625,80 @@ class pdf_ extends ModeleExpenseReport $pdf->SetFont('','B',8); $pdf->SetXY($posx,$posy-5); $pdf->MultiCell(80,5, $outputlangs->transnoentities("TripNDF")." :", 0, 'L'); - $pdf->rect($posx, $posy, 100, $hautcadre); + $pdf->rect($posx, $posy, $this->page_largeur - $this->marge_gauche - $posx, $hautcadre); // Informations for trip (dates and users workflow) - $userfee=new User($this->db); - $userfee->fetch($object->fk_user_author); $posy+=3; - $pdf->SetXY($posx+2,$posy); - $pdf->SetFont('','',10); - $pdf->MultiCell(96,4,$outputlangs->transnoentities("AUTHOR")." : ".$outputlangs->convToOutputCharset($userfee->firstname)." ".$outputlangs->convToOutputCharset($userfee->lastname),0,'L'); - $posy+=5; - $pdf->SetXY($posx+2,$posy); - $pdf->MultiCell(96,4,$outputlangs->transnoentities("DATE_SAVE")." : ".dol_print_date($object->date_create,"day",false,$outpulangs),0,'L'); + if ($object->fk_user_author > 0) + { + $userfee=new User($this->db); + $userfee->fetch($object->fk_user_author); $posy+=3; + $pdf->SetXY($posx+2,$posy); + $pdf->SetFont('','',10); + $pdf->MultiCell(96,4,$outputlangs->transnoentities("AUTHOR")." : ".dolGetFirstLastname($userfee->firstname,$userfee->lastname),0,'L'); + $posy+=5; + $pdf->SetXY($posx+2,$posy); + $pdf->MultiCell(96,4,$outputlangs->transnoentities("DateCreation")." : ".dol_print_date($object->date_create,"day",false,$outpulangs),0,'L'); + } - if($object->fk_c_expensereport_statuts<3): - $userfee=new User($this->db); - $userfee->fetch($object->fk_user_validator); $posy+=6; - $pdf->SetXY($posx+2,$posy); - $pdf->MultiCell(96,4,$outputlangs->transnoentities("VALIDATOR")." : ".$outputlangs->convToOutputCharset($userfee->firstname)." ".$outputlangs->convToOutputCharset($userfee->lastname),0,'L'); - elseif($object->fk_c_expensereport_statuts==99): - $userfee=new User($this->db); - $userfee->fetch($object->fk_user_refuse); $posy+=6; - $pdf->SetXY($posx+2,$posy); - $pdf->MultiCell(96,4,$outputlangs->transnoentities("REFUSEUR")." : ".$outputlangs->convToOutputCharset($userfee->firstname)." ".$outputlangs->convToOutputCharset($userfee->lastname),0,'L'); - $posy+=5; - $pdf->SetXY($posx+2,$posy); - $pdf->MultiCell(96,4,$outputlangs->transnoentities("MOTIF_REFUS")." : ".$outputlangs->convToOutputCharset($object->detail_refuse),0,'L'); - $posy+=5; - $pdf->SetXY($posx+2,$posy); - $pdf->MultiCell(96,4,$outputlangs->transnoentities("DATE_REFUS")." : ".dol_print_date($object->date_refuse,"day",false,$outpulangs),0,'L'); - elseif($object->fk_c_expensereport_statuts==4): - $userfee=new User($this->db); - $userfee->fetch($object->fk_user_cancel); $posy+=6; - $pdf->SetXY($posx+2,$posy); - $pdf->MultiCell(96,4,$outputlangs->transnoentities("CANCEL_USER")." : ".$outputlangs->convToOutputCharset($userfee->firstname)." ".$outputlangs->convToOutputCharset($userfee->lastname),0,'L'); - $posy+=5; - $pdf->SetXY($posx+2,$posy); - $pdf->MultiCell(96,4,$outputlangs->transnoentities("MOTIF_CANCEL")." : ".$outputlangs->convToOutputCharset($object->detail_cancel),0,'L'); - $posy+=5; - $pdf->SetXY($posx+2,$posy); - $pdf->MultiCell(96,4,$outputlangs->transnoentities("DATE_CANCEL")." : ".dol_print_date($object->date_cancel,"day",false,$outpulangs),0,'L'); - else: - $userfee=new User($this->db); - $userfee->fetch($object->fk_user_validator); $posy+=6; - $pdf->SetXY($posx+2,$posy); - $pdf->MultiCell(96,4,$outputlangs->transnoentities("VALIDOR")." : ".$outputlangs->convToOutputCharset($userfee->firstname)." ".$outputlangs->convToOutputCharset($userfee->lastname),0,'L'); - $posy+=5; - $pdf->SetXY($posx+2,$posy); - $pdf->MultiCell(96,4,$outputlangs->transnoentities("DATE_VALIDE")." : ".dol_print_date($object->date_valide,"day",false,$outpulangs),0,'L'); - endif; + if ($object->fk_c_expensereport_statuts==99) + { + if ($object->fk_user_refuse > 0) + { + $userfee=new User($this->db); + $userfee->fetch($object->fk_user_refuse); $posy+=6; + $pdf->SetXY($posx+2,$posy); + $pdf->MultiCell(96,4,$outputlangs->transnoentities("REFUSEUR")." : ".dolGetFirstLastname($userfee->firstname,$userfee->lastname),0,'L'); + $posy+=5; + $pdf->SetXY($posx+2,$posy); + $pdf->MultiCell(96,4,$outputlangs->transnoentities("MOTIF_REFUS")." : ".$outputlangs->convToOutputCharset($object->detail_refuse),0,'L'); + $posy+=5; + $pdf->SetXY($posx+2,$posy); + $pdf->MultiCell(96,4,$outputlangs->transnoentities("DATE_REFUS")." : ".dol_print_date($object->date_refuse,"day",false,$outpulangs),0,'L'); + } + } + else if($object->fk_c_expensereport_statuts==4) + { + if ($object->fk_user_cancel > 0) + { + $userfee=new User($this->db); + $userfee->fetch($object->fk_user_cancel); $posy+=6; + $pdf->SetXY($posx+2,$posy); + $pdf->MultiCell(96,4,$outputlangs->transnoentities("CANCEL_USER")." : ".dolGetFirstLastname($userfee->firstname,$userfee->lastname),0,'L'); + $posy+=5; + $pdf->SetXY($posx+2,$posy); + $pdf->MultiCell(96,4,$outputlangs->transnoentities("MOTIF_CANCEL")." : ".$outputlangs->convToOutputCharset($object->detail_cancel),0,'L'); + $posy+=5; + $pdf->SetXY($posx+2,$posy); + $pdf->MultiCell(96,4,$outputlangs->transnoentities("DATE_CANCEL")." : ".dol_print_date($object->date_cancel,"day",false,$outpulangs),0,'L'); + } + } + else + { + if ($object->fk_user_approve > 0) + { + $userfee=new User($this->db); + $userfee->fetch($object->fk_user_approve); $posy+=6; + $pdf->SetXY($posx+2,$posy); + $pdf->MultiCell(96,4,$outputlangs->transnoentities("VALIDOR")." : ".dolGetFirstLastname($userfee->firstname,$userfee->lastname),0,'L'); + $posy+=5; + $pdf->SetXY($posx+2,$posy); + $pdf->MultiCell(96,4,$outputlangs->transnoentities("DateApprove")." : ".dol_print_date($object->date_approve,"day",false,$outpulangs),0,'L'); + } + } - if($object->fk_c_expensereport_statuts==6): - $userfee=new User($this->db); - $userfee->fetch($object->fk_user_paid); $posy+=6; - $pdf->SetXY($posx+2,$posy); - $pdf->MultiCell(96,4,$outputlangs->transnoentities("AUTHORPAIEMENT")." : ".$outputlangs->convToOutputCharset($userfee->firstname)." ".$outputlangs->convToOutputCharset($userfee->lastname),0,'L'); - $posy+=5; - $pdf->SetXY($posx+2,$posy); - $pdf->MultiCell(96,4,$outputlangs->transnoentities("DATE_PAIEMENT")." : ".dol_print_date($object->date_paiement,"day",false,$outpulangs),0,'L'); - endif; + if($object->fk_c_expensereport_statuts==6) + { + if ($object->fk_user_paid > 0) + { + $userfee=new User($this->db); + $userfee->fetch($object->fk_user_paid); $posy+=6; + $pdf->SetXY($posx+2,$posy); + $pdf->MultiCell(96,4,$outputlangs->transnoentities("AUTHORPAIEMENT")." : ".dolGetFirstLastname($userfee->firstname,$userfee->lastname),0,'L'); + $posy+=5; + $pdf->SetXY($posx+2,$posy); + $pdf->MultiCell(96,4,$outputlangs->transnoentities("DATE_PAIEMENT")." : ".dol_print_date($object->date_paiement,"day",false,$outpulangs),0,'L'); + } + } } @@ -690,48 +735,48 @@ class pdf_ extends ModeleExpenseReport $pdf->SetFont('','',8); //Piece comptable - $pdf->SetXY ($this->posxpiece-1, $tab_top+1); - $pdf->MultiCell($this->posxpiece-$this->posxpiece-1,1,$outputlangs->transnoentities("Piece"),'','L'); + $pdf->SetXY($this->posxpiece-1, $tab_top+1); + $pdf->MultiCell($this->posxdesc-$this->posxpiece-1,1,'','','R'); //Comments $pdf->line($this->posxdesc-1, $tab_top, $this->posxdesc-1, $tab_top + $tab_height); - $pdf->SetXY ($this->posxdesc-1, $tab_top+1); + $pdf->SetXY($this->posxdesc-1, $tab_top+1); $pdf->MultiCell($this->posxdate-$this->posxdesc-1,1,$outputlangs->transnoentities("Description"),'','L'); //Date $pdf->line($this->posxdate-1, $tab_top, $this->posxdate-1, $tab_top + $tab_height); - $pdf->SetXY ($this->posxdate-1, $tab_top+1); + $pdf->SetXY($this->posxdate-1, $tab_top+1); $pdf->MultiCell($this->posxtype-$this->posxdate-1,2, $outputlangs->transnoentities("Date"),'','C'); //Type $pdf->line($this->posxtype-1, $tab_top, $this->posxtype-1, $tab_top + $tab_height); - $pdf->SetXY ($this->posxtype-1, $tab_top+1); + $pdf->SetXY($this->posxtype-1, $tab_top+1); $pdf->MultiCell($this->posxprojet-$this->posxtype-1,2, $outputlangs->transnoentities("Type"),'','C'); // Projet $pdf->line($this->posxprojet-1, $tab_top, $this->posxprojet-1, $tab_top + $tab_height); - $pdf->SetXY ($this->posxprojet-1, $tab_top+1); + $pdf->SetXY($this->posxprojet-1, $tab_top+1); $pdf->MultiCell($this->posxtva-$this->posxprojet-1,2, $outputlangs->transnoentities("Project"),'','C'); //TVA $pdf->line($this->posxtva-1, $tab_top, $this->posxtva-1, $tab_top + $tab_height); - $pdf->SetXY ($this->posxtva-1, $tab_top+1); + $pdf->SetXY($this->posxtva-1, $tab_top+1); $pdf->MultiCell($this->posxup-$this->posxtva-1,2, $outputlangs->transnoentities("VAT"),'','C'); //PU $pdf->line($this->posxup-1, $tab_top, $this->posxup-1, $tab_top + $tab_height); - $pdf->SetXY ($this->posxup-1, $tab_top+1); - $pdf->MultiCell($this->posxqty-$this->posxup-1,2, $outputlangs->transnoentities("PU"),'','C'); + $pdf->SetXY($this->posxup-1, $tab_top+1); + $pdf->MultiCell($this->posxqty-$this->posxup-1,2, $outputlangs->transnoentities("UP"),'','C'); //QTY $pdf->line($this->posxqty-1, $tab_top, $this->posxqty-1, $tab_top + $tab_height); - $pdf->SetXY ($this->posxqty-1, $tab_top+1); - $pdf->MultiCell($this->postotalttc-$this->posxqty,2, $outputlangs->transnoentities("Q"),'','R'); + $pdf->SetXY($this->posxqty-1, $tab_top+1); + $pdf->MultiCell($this->postotalttc-$this->posxqty,2, $outputlangs->transnoentities("Qty"),'','R'); //TOTALTTC $pdf->line($this->postotalttc, $tab_top, $this->postotalttc, $tab_top + $tab_height); - $pdf->SetXY ($this->postotalttc-4, $tab_top+1); - $pdf->MultiCell(28,2, $outputlangs->transnoentities("TotalTTC"),'','R'); + $pdf->SetXY($this->postotalttc-1, $tab_top+1); + $pdf->MultiCell($this->page_largeur-$this->marge_droite-$this->postotalttc, 2, $outputlangs->transnoentities("TotalTTC"),'','R'); $pdf->SetTextColor(0,0,0); } @@ -747,7 +792,8 @@ class pdf_ extends ModeleExpenseReport */ function _pagefoot(&$pdf,$object,$outputlangs,$hidefreetext=0) { - return pdf_pagefoot($pdf,$outputlangs,'DEPLACEMENT_FREE_TEXT',$this->emetteur,$this->marge_basse,$this->marge_gauche,$this->page_hauteur,$object,0,$hidefreetext); + $showdetails=0; + return pdf_pagefoot($pdf,$outputlangs,'EXPENSEREPORT_FREE_TEXT',$this->emetteur,$this->marge_basse,$this->marge_gauche,$this->page_hauteur,$object,$showdetails,$hidefreetext); } } diff --git a/htdocs/core/modules/expensereport/modules_expensereport.php b/htdocs/core/modules/expensereport/modules_expensereport.php index 86fa894dbaf..641f1de9c98 100755 --- a/htdocs/core/modules/expensereport/modules_expensereport.php +++ b/htdocs/core/modules/expensereport/modules_expensereport.php @@ -49,62 +49,20 @@ class ModeleExpenseReport extends CommonDocGenerator } -function expensereport_pdf_create($db, $id, $message, $modele, $outputlangs) +/** + * expensereport_pdf_create + * + * @param DoliDB $db Database handler + * @param Object $object Object order + * @param string $modele Force le modele a utiliser ('' to not force) + * @param Translate $outputlangs objet lang a utiliser pour traduction + * @param int $hidedetails Hide details of lines + * @param int $hidedesc Hide description + * @param int $hideref Hide ref + * @return int 0 if KO, 1 if OK + * @return number + */ +function expensereport_pdf_create(DoliDB $db, ExpenseReport $object, $message, $modele, $outputlangs, $hidedetails=0, $hidedesc=0, $hideref=0) { - global $conf,$langs; - $langs->load("trips"); - - // Increase limit for PDF build - $err=error_reporting(); - error_reporting(0); - @set_time_limit(120); - error_reporting($err); - - $dir = dol_buildpath('/expensereport/core/modules/expensereport/'); - - // Positionne modele sur le nom du modele a utiliser - if (! strlen($modele)) - { - if ($conf->global->DEPLACEMENT_ADDON_PDF) - { - $modele = $conf->global->DEPLACEMENT_ADDON_PDF; - } - else - { - print $langs->trans("Error")." ".$langs->trans("Error_DEPLACEMENT_ADDON_PDF_NotDefined"); - return 0; - } - } - - // Charge le modele - $file = "pdf_".$modele.".modules.php"; - if (file_exists($dir.$file)) - { - $classname = "pdf_".$modele; - require_once($dir.$file); - - $obj = new $classname($db); - $obj->message = $message; - - // We save charset_output to restore it because write_file can change it if needed for - // output format that does not support UTF8. - $sav_charset_output=$outputlangs->charset_output; - if ($obj->write_file($id, $outputlangs) > 0) - { - $outputlangs->charset_output=$sav_charset_output; - return 1; - } - else - { - $outputlangs->charset_output=$sav_charset_output; - dol_print_error($db,"expensereport_pdf_create Error: ".$obj->error); - return -1; - } - - } - else - { - dol_print_error('',$langs->trans("Error")." ".$langs->trans("ErrorFileDoesNotExists",$dir.$file)); - return -1; - } + return $object->generateDocument($modele, $outputlangs, $hidedetails, $hidedesc, $hideref); } diff --git a/htdocs/core/modules/modAgenda.class.php b/htdocs/core/modules/modAgenda.class.php index c633734b227..165b547dff4 100644 --- a/htdocs/core/modules/modAgenda.class.php +++ b/htdocs/core/modules/modAgenda.class.php @@ -393,7 +393,7 @@ class modAgenda extends DolibarrModules $this->export_sql_end[$r] .=' LEFT JOIN '.MAIN_DB_PREFIX.'socpeople as sp on ac.fk_contact = sp.rowid'; $this->export_sql_end[$r] .=' LEFT JOIN '.MAIN_DB_PREFIX.'societe as s on ac.fk_soc = s.rowid'; $this->export_sql_end[$r] .=' LEFT JOIN '.MAIN_DB_PREFIX.'c_country as co on s.fk_pays = co.rowid'; - $this->export_sql_end[$r] .=' Where ac.entity = '.$conf->entity; + $this->export_sql_end[$r] .=' WHERE ac.entity IN ('.getEntity('agenda',1).')'; $this->export_sql_end[$r] .=' ORDER BY ac.datep'; } diff --git a/htdocs/core/modules/modBanque.class.php b/htdocs/core/modules/modBanque.class.php index 0d383603a06..246aac2b6d7 100644 --- a/htdocs/core/modules/modBanque.class.php +++ b/htdocs/core/modules/modBanque.class.php @@ -157,7 +157,7 @@ class modBanque extends DolibarrModules $this->export_sql_end[$r] .=' LEFT JOIN '.MAIN_DB_PREFIX."bank_url as bu ON (bu.fk_bank = b.rowid AND bu.type = 'company')"; $this->export_sql_end[$r] .=' LEFT JOIN '.MAIN_DB_PREFIX.'societe as s ON bu.url_id = s.rowid'; $this->export_sql_end[$r] .=' WHERE ba.rowid = b.fk_account'; - $this->export_sql_end[$r] .=' AND ba.entity = '.$conf->entity; + $this->export_sql_end[$r] .=' AND ba.entity IN ('.getEntity('bank',1).')'; $this->export_sql_order[$r] =' ORDER BY b.datev, b.num_releve'; $r++; @@ -184,7 +184,7 @@ class modBanque extends DolibarrModules $this->export_sql_end[$r] .=' WHERE ba.rowid = b.fk_account AND bch.rowid = b.fk_bordereau and bch.fk_bank_account=ba.rowid'; $this->export_sql_end[$r] .=" AND b.fk_type = 'CHQ'"; $this->export_sql_end[$r] .=' AND p.fk_paiement = 7'; - $this->export_sql_end[$r] .=' AND ba.entity = '.$conf->entity; + $this->export_sql_end[$r] .=' AND ba.entity IN ('.getEntity('bank',1).')'; $this->export_sql_order[$r] =' ORDER BY b.datev, b.num_releve'; } diff --git a/htdocs/core/modules/modCategorie.class.php b/htdocs/core/modules/modCategorie.class.php index 327608c8814..a75e73e6c3d 100644 --- a/htdocs/core/modules/modCategorie.class.php +++ b/htdocs/core/modules/modCategorie.class.php @@ -122,7 +122,7 @@ class modCategorie extends DolibarrModules $this->export_sql_start[$r]='SELECT DISTINCT '; $this->export_sql_end[$r] =' FROM '.MAIN_DB_PREFIX.'categorie as u, '.MAIN_DB_PREFIX.'categorie_fournisseur as cf, '.MAIN_DB_PREFIX.'societe as s LEFT JOIN '.MAIN_DB_PREFIX.'c_typent as t ON s.fk_typent = t.id LEFT JOIN '.MAIN_DB_PREFIX.'c_country as c ON s.fk_pays = c.rowid LEFT JOIN '.MAIN_DB_PREFIX.'c_effectif as ce ON s.fk_effectif = ce.id LEFT JOIN '.MAIN_DB_PREFIX.'c_forme_juridique as cfj ON s.fk_forme_juridique = cfj.code'; $this->export_sql_end[$r] .=' WHERE u.rowid = cf.fk_categorie AND cf.fk_societe = s.rowid'; - $this->export_sql_end[$r] .=' AND u.entity = '.$conf->entity; + $this->export_sql_end[$r] .=' AND u.entity IN ('.getEntity('category',1).')'; $this->export_sql_end[$r] .=' AND u.type = 1'; // Supplier categories $r++; @@ -137,7 +137,7 @@ class modCategorie extends DolibarrModules $this->export_sql_start[$r]='SELECT DISTINCT '; $this->export_sql_end[$r] =' FROM '.MAIN_DB_PREFIX.'categorie as u, '.MAIN_DB_PREFIX.'categorie_societe as cf, '.MAIN_DB_PREFIX.'societe as s LEFT JOIN '.MAIN_DB_PREFIX.'c_typent as t ON s.fk_typent = t.id LEFT JOIN '.MAIN_DB_PREFIX.'c_country as c ON s.fk_pays = c.rowid LEFT JOIN '.MAIN_DB_PREFIX.'c_effectif as ce ON s.fk_effectif = ce.id LEFT JOIN '.MAIN_DB_PREFIX.'c_forme_juridique as cfj ON s.fk_forme_juridique = cfj.code'; $this->export_sql_end[$r] .=' WHERE u.rowid = cf.fk_categorie AND cf.fk_societe = s.rowid'; - $this->export_sql_end[$r] .=' AND u.entity = '.$conf->entity; + $this->export_sql_end[$r] .=' AND u.entity IN ('.getEntity('category',1).')'; $this->export_sql_end[$r] .=' AND u.type = 2'; // Customer/Prospect categories $r++; @@ -152,7 +152,7 @@ class modCategorie extends DolibarrModules $this->export_sql_start[$r]='SELECT DISTINCT '; $this->export_sql_end[$r] =' FROM '.MAIN_DB_PREFIX.'categorie as u, '.MAIN_DB_PREFIX.'categorie_product as cp, '.MAIN_DB_PREFIX.'product as p'; $this->export_sql_end[$r] .=' WHERE u.rowid = cp.fk_categorie AND cp.fk_product = p.rowid'; - $this->export_sql_end[$r] .=' AND u.entity = '.$conf->entity; + $this->export_sql_end[$r] .=' AND u.entity IN ('.getEntity('category',1).')'; $this->export_sql_end[$r] .=' AND u.type = 0'; // Supplier categories $r++; @@ -167,8 +167,8 @@ class modCategorie extends DolibarrModules $this->export_sql_start[$r]='SELECT DISTINCT '; $this->export_sql_end[$r] =' FROM '.MAIN_DB_PREFIX.'categorie as u, '.MAIN_DB_PREFIX.'categorie_member as cp, '.MAIN_DB_PREFIX.'adherent as p'; $this->export_sql_end[$r] .=' WHERE u.rowid = cp.fk_categorie AND cp.fk_member = p.rowid'; - $this->export_sql_end[$r] .=' AND u.entity = '.$conf->entity; - $this->export_sql_end[$r] .=' AND u.type = 3'; // Supplier categories + $this->export_sql_end[$r] .=' AND u.entity IN ('.getEntity('category',1).')'; + $this->export_sql_end[$r] .=' AND u.type = 3'; // Member categories $r++; $this->export_code[$r]='category_'.$r; @@ -232,7 +232,7 @@ class modCategorie extends DolibarrModules $this->export_sql_start[$r] = 'SELECT DISTINCT '; $this->export_sql_end[$r] = ' FROM ' . MAIN_DB_PREFIX . 'categorie as u, '.MAIN_DB_PREFIX . 'categorie_contact as cp, '.MAIN_DB_PREFIX . 'socpeople as p'; $this->export_sql_end[$r] .= ' LEFT JOIN ' . MAIN_DB_PREFIX . 'c_country as country ON p.fk_pays = country.rowid'; - $this->export_sql_end[$r] .= ' WHERE u.rowid = cp.fk_categorie AND cp.fk_socpeople = p.rowid AND u.entity = ' . $conf->entity; + $this->export_sql_end[$r] .= ' WHERE u.rowid = cp.fk_categorie AND cp.fk_socpeople = p.rowid AND u.entity IN ('.getEntity('category',1).')'; $this->export_sql_end[$r] .= ' AND u.type = 4'; // contact categories // Imports diff --git a/htdocs/core/modules/modCommande.class.php b/htdocs/core/modules/modCommande.class.php index d8cc5647817..c7fb5cfa587 100644 --- a/htdocs/core/modules/modCommande.class.php +++ b/htdocs/core/modules/modCommande.class.php @@ -192,7 +192,7 @@ class modCommande extends DolibarrModules $this->export_sql_end[$r] .=' , '.MAIN_DB_PREFIX.'commandedet as cd'; $this->export_sql_end[$r] .=' LEFT JOIN '.MAIN_DB_PREFIX.'product as p on cd.fk_product = p.rowid'; $this->export_sql_end[$r] .=' WHERE c.fk_soc = s.rowid AND c.rowid = cd.fk_commande'; - $this->export_sql_end[$r] .=' AND c.entity = '.$conf->entity; + $this->export_sql_end[$r] .=' AND c.entity IN ('.getEntity('commande',1).')'; } diff --git a/htdocs/core/modules/modContrat.class.php b/htdocs/core/modules/modContrat.class.php index 4906d9e3954..dc97964fa45 100644 --- a/htdocs/core/modules/modContrat.class.php +++ b/htdocs/core/modules/modContrat.class.php @@ -42,7 +42,7 @@ class modContrat extends DolibarrModules function __construct($db) { global $conf; - + $this->db = $db; $this->numero = 54; @@ -160,9 +160,9 @@ class modContrat extends DolibarrModules $this->export_sql_end[$r] .=' LEFT JOIN '.MAIN_DB_PREFIX.'c_country as c on s.fk_pays = c.rowid,'; $this->export_sql_end[$r] .=' '.MAIN_DB_PREFIX.'contrat as co,'; $this->export_sql_end[$r] .=' '.MAIN_DB_PREFIX.'contratdet as cod'; - $this->export_sql_end[$r] .=' LEFT JOIN '.MAIN_DB_PREFIX.'product as p on (cod.fk_product = p.rowid)'; + $this->export_sql_end[$r] .=' LEFT JOIN '.MAIN_DB_PREFIX.'product as p on (cod.fk_product = p.rowid)'; $this->export_sql_end[$r] .=' WHERE co.fk_soc = s.rowid and co.rowid = cod.fk_contrat'; - $this->export_sql_end[$r] .=' AND co.entity = '.$conf->entity; + $this->export_sql_end[$r] .=' AND co.entity IN ('.getEntity('contract',1).')'; } diff --git a/htdocs/core/modules/modDeplacement.class.php b/htdocs/core/modules/modDeplacement.class.php index f08a346577a..47642e5195d 100644 --- a/htdocs/core/modules/modDeplacement.class.php +++ b/htdocs/core/modules/modDeplacement.class.php @@ -124,7 +124,7 @@ class modDeplacement extends DolibarrModules $this->export_sql_end[$r] .=', '.MAIN_DB_PREFIX.'deplacement as d'; $this->export_sql_end[$r] .=' LEFT JOIN '.MAIN_DB_PREFIX.'societe as s ON d.fk_soc = s.rowid'; $this->export_sql_end[$r] .=' WHERE d.fk_user = u.rowid'; - $this->export_sql_end[$r] .=' AND d.entity = '.$conf->entity; + $this->export_sql_end[$r] .=' AND d.entity IN ('.getEntity('deplacement',1).')'; } diff --git a/htdocs/core/modules/modExpedition.class.php b/htdocs/core/modules/modExpedition.class.php index e2c85c60352..2f4b7a88be8 100644 --- a/htdocs/core/modules/modExpedition.class.php +++ b/htdocs/core/modules/modExpedition.class.php @@ -229,7 +229,7 @@ class modExpedition extends DolibarrModules $this->export_sql_end[$r] .=' '.MAIN_DB_PREFIX.'expeditiondet as ed, '.MAIN_DB_PREFIX.'commandedet as cd'; $this->export_sql_end[$r] .=' LEFT JOIN '.MAIN_DB_PREFIX.'product as p on cd.fk_product = p.rowid'; $this->export_sql_end[$r] .=' WHERE c.fk_soc = s.rowid AND c.rowid = ed.fk_expedition AND ed.fk_origin_line = cd.rowid'; - $this->export_sql_end[$r] .=' AND c.entity = '.$conf->entity; + $this->export_sql_end[$r] .=' AND c.entity IN ('.getEntity('shipment',1).')'; } diff --git a/htdocs/core/modules/modExpenseReport.class.php b/htdocs/core/modules/modExpenseReport.class.php index 1bf00f86f31..c82de294008 100755 --- a/htdocs/core/modules/modExpenseReport.class.php +++ b/htdocs/core/modules/modExpenseReport.class.php @@ -4,7 +4,7 @@ * * 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 + * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, @@ -14,7 +14,6 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - * or see http://www.gnu.org/ */ /** @@ -50,8 +49,6 @@ class modExpenseReport extends DolibarrModules // Id for module (must be unique). // Use here a free id (See in Home -> System information -> Dolibarr for list of used modules id). $this->numero = 770; - // Key text used to identify module (for permissions, menus, etc...) - $this->rights_class = 'deplacement'; // Family can be 'crm','financial','hr','projects','products','ecm','technic','other' // It is used to group modules in module setup page @@ -83,21 +80,29 @@ class modExpenseReport extends DolibarrModules //$this->style_sheet = '/mymodule/mymodule.css.php'; // Config pages. Put here list of php page names stored in admmin directory used to setup module. - $this->config_page_url = array(); + $this->config_page_url = array('expensereport.php'); // Dependencies $this->depends = array(); // List of modules id that must be enabled if this module is enabled // $this->conflictwith = array("modDeplacement"); $this->requiredby = array(); // List of modules id to disable if this one is disabled $this->phpmin = array(4,3); // Minimum version of PHP required by module - $this->need_dolibarr_version = array(3,0); // Minimum version of Dolibarr required by module - $this->langfiles = array("companies","trips","deplacement@deplacement"); + $this->need_dolibarr_version = array(3,7); // Minimum version of Dolibarr required by module + $this->langfiles = array("companies","trips"); // Constants // Example: $this->const=array(0=>array('MYMODULE_MYNEWCONST1','chaine','myvalue','This is a constant to add',0), // 1=>array('MYMODULE_MYNEWCONST2','chaine','myvalue','This is another constant to add',0) ); // 2=>array('MAIN_MODULE_MYMODULE_NEEDSMARTY','chaine',1,'Constant to say module need smarty',0) $this->const = array(); // List of particular constants to add when module is enabled (key, 'chaine', value, desc, visible, 0 or 'allentities') + $r=0; + + $this->const[$r][0] = "EXPENSEREPORT_ADDON_PDF"; + $this->const[$r][1] = "chaine"; + $this->const[$r][2] = "standard"; + $this->const[$r][3] = 'Name of manager to build PDF expense reports documents'; + $this->const[$r][4] = 0; + $r++; // Array to add new pages in new tabs $this->tabs = array(); @@ -195,19 +200,21 @@ class modExpenseReport extends DolibarrModules $r=0; $r++; - $this->export_code[$r]='trips_'.$r; + $this->export_code[$r]='expensereport_'.$r; $this->export_label[$r]='ListTripsAndExpenses'; + $this->export_icon[$r]='trip'; $this->export_permission[$r]=array(array("expensereport","export")); - $this->export_fields_array[$r]=array('d.rowid'=>"TripId",'d.type'=>"Type",'d.km'=>"FeesKilometersOrAmout",'d.note'=>'NotePrivate','d.note_public'=>'NotePublic','s.nom'=>'ThirdParty','u.lastname'=>'Lastname','u.firstname'=>'Firstname','d.dated'=>"Date"); - $this->export_entities_array[$r]=array('d.rowid'=>"Trip",'d.type'=>"Trip",'d.km'=>"Trip",'d.note'=>'Trip','d.note_public'=>'Trip','s.nom'=>'company','u.lastname'=>'user','u.firstname'=>'user','d.dated'=>"Date"); - $this->export_alias_array[$r]=array('d.rowid'=>"idtrip",'d.type'=>"type",'d.km'=>"km",'d.note'=>'note','d.note_public'=>'note_public','s.nom'=>'companyname','u.lastname'=>'name','u.firstname'=>'firstname','d.dated'=>'date'); + $this->export_fields_array[$r]=array('d.rowid'=>"TripId",'d.ref'=>'Ref','d.date_debut'=>'DateStart','d.date_fin'=>'DateEnd','d.date_create'=>'DateCreation','d.date_approve'=>'DateApprove','d.total_ht'=>"TotalHT",'d.total_tva'=>'TotalVAT','d.total_ttc'=>'TotalTTC','d.note_private'=>'NotePrivate','d.note_public'=>'NotePublic','u.lastname'=>'Lastname','u.firstname'=>'Firstname','u.login'=>"Login",'ed.rowid'=>'LineId','tf.code'=>'Type','ed.date'=>'Date','ed.fk_c_tva'=>'VATRate','ed.total_ht'=>'TotalHT','ed.total_tva'=>'TotalVAT','ed.total_ttc'=>'TotalTTC','ed.comments'=>'Comment','p.rowid'=>'ProjectId','p.ref'=>'Ref'); + $this->export_entities_array[$r]=array('u.lastname'=>'user','u.firstname'=>'user','u.login'=>'user','ed.rowid'=>'expensereport_line','ed.date'=>'expensereport_line','ed.fk_c_tva'=>'expensereport_line','ed.total_ht'=>'expensereport_line','ed.total_tva'=>'expensereport_line','ed.total_ttc'=>'expensereport_line','ed.comments'=>'expensereport_line','tf.code'=>'expensereport_line','p.project_ref'=>'expensereport_line','p.rowid'=>'project','p.ref'=>'project'); + $this->export_alias_array[$r]=array('d.rowid'=>"idtrip",'d.type'=>"type",'d.note_private'=>'note_private','d.note_public'=>'note_public','u.lastname'=>'name','u.firstname'=>'firstname','u.login'=>'login'); + $this->export_dependencies_array[$r]=array('expensereport_line'=>'ed.rowid','type_fees'=>'tf.rowid'); // To add unique key if we ask a field of a child to avoid the DISTINCT to discard them $this->export_sql_start[$r]='SELECT DISTINCT '; - $this->export_sql_end[$r] =' FROM '.MAIN_DB_PREFIX.'user as u'; - $this->export_sql_end[$r] .=', '.MAIN_DB_PREFIX.'expensereport as d'; - $this->export_sql_end[$r] .=' LEFT JOIN '.MAIN_DB_PREFIX.'societe as s ON d.fk_soc = s.rowid'; - $this->export_sql_end[$r] .=' WHERE d.fk_user = u.rowid'; - $this->export_sql_end[$r] .=' AND d.entity = '.$conf->entity; + $this->export_sql_end[$r] =' FROM '.MAIN_DB_PREFIX.'expensereport as d, '.MAIN_DB_PREFIX.'user as u,'; + $this->export_sql_end[$r] .=' '.MAIN_DB_PREFIX.'expensereport_det as ed LEFT JOIN '.MAIN_DB_PREFIX.'c_type_fees as tf ON ed.fk_c_type_fees = tf.id'; + $this->export_sql_end[$r] .=' LEFT JOIN '.MAIN_DB_PREFIX.'projet as p ON ed.fk_projet = p.rowid'; + $this->export_sql_end[$r] .=' WHERE ed.fk_expensereport = d.rowid AND d.fk_user_author = u.rowid'; + $this->export_sql_end[$r] .=' AND d.entity IN ('.getEntity('expensereport',1).')'; diff --git a/htdocs/core/modules/modFacture.class.php b/htdocs/core/modules/modFacture.class.php index 38a06576c9e..86762fbb87c 100644 --- a/htdocs/core/modules/modFacture.class.php +++ b/htdocs/core/modules/modFacture.class.php @@ -228,7 +228,7 @@ class modFacture extends DolibarrModules $this->export_sql_end[$r] .=' , '.MAIN_DB_PREFIX.'facturedet as fd'; $this->export_sql_end[$r] .=' LEFT JOIN '.MAIN_DB_PREFIX.'product as p on (fd.fk_product = p.rowid)'; $this->export_sql_end[$r] .=' WHERE f.fk_soc = s.rowid AND f.rowid = fd.fk_facture'; - $this->export_sql_end[$r] .=' AND f.entity = '.$conf->entity; + $this->export_sql_end[$r] .=' AND f.entity IN ('.getEntity('facture',1).')'; $r++; $this->export_code[$r]=$this->rights_class.'_'.$r; @@ -284,7 +284,7 @@ class modFacture extends DolibarrModules $this->export_sql_end[$r] .=' LEFT JOIN '.MAIN_DB_PREFIX.'paiement_facture as pf ON pf.fk_facture = f.rowid'; $this->export_sql_end[$r] .=' LEFT JOIN '.MAIN_DB_PREFIX.'paiement as p ON pf.fk_paiement = p.rowid'; $this->export_sql_end[$r] .=' WHERE f.fk_soc = s.rowid'; - $this->export_sql_end[$r] .=' AND f.entity = '.$conf->entity; + $this->export_sql_end[$r] .=' AND f.entity IN ('.getEntity('facture',1).')'; $r++; } diff --git a/htdocs/core/modules/modFicheinter.class.php b/htdocs/core/modules/modFicheinter.class.php index 45d8a0fa7bc..7c54679bd9c 100644 --- a/htdocs/core/modules/modFicheinter.class.php +++ b/htdocs/core/modules/modFicheinter.class.php @@ -147,7 +147,7 @@ class modFicheinter extends DolibarrModules $this->export_sql_start[$r]='SELECT DISTINCT '; $this->export_sql_end[$r] =' FROM ('.MAIN_DB_PREFIX.'fichinter as f, '.MAIN_DB_PREFIX.'fichinterdet as fd, '.MAIN_DB_PREFIX.'societe as s)'; $this->export_sql_end[$r] .=' WHERE f.fk_soc = s.rowid AND f.rowid = fd.fk_fichinter'; - $this->export_sql_end[$r] .=' AND f.entity = '.$conf->entity; + $this->export_sql_end[$r] .=' AND f.entity IN ('.getEntity('intervention',1).')'; $r++; } diff --git a/htdocs/core/modules/modFournisseur.class.php b/htdocs/core/modules/modFournisseur.class.php index 656ef87c191..1f8b3af3ed6 100644 --- a/htdocs/core/modules/modFournisseur.class.php +++ b/htdocs/core/modules/modFournisseur.class.php @@ -297,7 +297,7 @@ class modFournisseur extends DolibarrModules $this->export_sql_end[$r] .=' , '.MAIN_DB_PREFIX.'facture_fourn_det as fd'; $this->export_sql_end[$r] .=' LEFT JOIN '.MAIN_DB_PREFIX.'product as p on (fd.fk_product = p.rowid)'; $this->export_sql_end[$r] .=' WHERE f.fk_soc = s.rowid AND f.rowid = fd.fk_facture_fourn'; - $this->export_sql_end[$r] .=' AND f.entity = '.$conf->entity; + $this->export_sql_end[$r] .=' AND f.entity IN ('.getEntity('supplier_invoice',1).')'; $r++; $this->export_code[$r]=$this->rights_class.'_'.$r; @@ -351,7 +351,7 @@ class modFournisseur extends DolibarrModules $this->export_sql_end[$r] .=' LEFT JOIN '.MAIN_DB_PREFIX.'paiementfourn_facturefourn as pf ON pf.fk_facturefourn = f.rowid'; $this->export_sql_end[$r] .=' LEFT JOIN '.MAIN_DB_PREFIX.'paiementfourn as p ON pf.fk_paiementfourn = p.rowid'; $this->export_sql_end[$r] .=' WHERE f.fk_soc = s.rowid'; - $this->export_sql_end[$r] .=' AND f.entity = '.$conf->entity; + $this->export_sql_end[$r] .=' AND f.entity IN ('.getEntity('supplier_invoice',1).')'; $r++; $this->export_code[$r]=$this->rights_class.'_'.$r; @@ -369,7 +369,7 @@ class modFournisseur extends DolibarrModules $this->export_sql_end[$r] .=' '.MAIN_DB_PREFIX.'commande_fournisseur as f, '.MAIN_DB_PREFIX.'commande_fournisseurdet as fd'; $this->export_sql_end[$r] .=' LEFT JOIN '.MAIN_DB_PREFIX.'product as p on (fd.fk_product = p.rowid)'; $this->export_sql_end[$r] .=' WHERE f.fk_soc = s.rowid AND f.rowid = fd.fk_commande'; - $this->export_sql_end[$r] .=' AND f.entity = '.$conf->entity; + $this->export_sql_end[$r] .=' AND f.entity IN ('.getEntity('supplier_order',1).')'; } diff --git a/htdocs/core/modules/modProjet.class.php b/htdocs/core/modules/modProjet.class.php index 4a534c937cc..548306fc022 100644 --- a/htdocs/core/modules/modProjet.class.php +++ b/htdocs/core/modules/modProjet.class.php @@ -94,21 +94,21 @@ class modProjet extends DolibarrModules $this->const[$r][3] = ""; $this->const[$r][4] = 0; $r++; - + $this->const[$r][0] = "PROJECT_TASK_ADDON_PDF"; $this->const[$r][1] = "chaine"; $this->const[$r][2] = ""; $this->const[$r][3] = 'Name of PDF/ODT tasks manager class'; $this->const[$r][4] = 0; $r++; - + $this->const[$r][0] = "PROJECT_TASK_ADDON"; $this->const[$r][1] = "chaine"; $this->const[$r][2] = "mod_task_simple"; $this->const[$r][3] = 'Name of Numbering Rule task manager class'; $this->const[$r][4] = 0; $r++; - + $this->const[$r][0] = "PROJECT_TASK_ADDON_PDF_ODT_PATH"; $this->const[$r][1] = "chaine"; $this->const[$r][2] = "DOL_DATA_ROOT/doctemplates/tasks"; @@ -155,7 +155,7 @@ class modProjet extends DolibarrModules $this->rights[$r][2] = 'd'; // type de la permission (deprecie a ce jour) $this->rights[$r][3] = 0; // La permission est-elle une permission par defaut $this->rights[$r][4] = 'export'; - + $r++; $this->rights[$r][0] = 141; // id de la permission $this->rights[$r][1] = "Lire tous les projets et tâches (y compris prives qui ne me sont pas affectes)"; // libelle de la permission @@ -189,7 +189,7 @@ class modProjet extends DolibarrModules $this->export_label[$r]='ProjectsAndTasksLines'; // Translation key (used only if key ExportDataset_xxx_z not found) $this->export_permission[$r]=array(array("projet","export")); $this->export_dependencies_array[$r]=array('task_time'=>'ppt.rowid'); - + $this->export_TypeFields_array[$r]=array('s.rowid'=>"List:societe:nom",'s.nom'=>'Text','s.address'=>'Text','s.zip'=>'Text','s.town'=>'Text','s.fk_pays'=>'List:c_country:label', 's.phone'=>'Text','s.siren'=>'Text','s.siret'=>'Text','s.ape'=>'Text','s.idprof4'=>'Text','s.code_compta'=>'Text','s.code_compta_fournisseur'=>'Text', 'p.rowid'=>"List:projet:ref",'p.ref'=>"Text",'p.datec'=>"Date",'p.dateo'=>"Date",'p.datee'=>"Date",'p.fk_statut'=>'Status','p.description'=>"Text", @@ -199,11 +199,11 @@ class modProjet extends DolibarrModules $this->export_entities_array[$r]=array('s.rowid'=>"company",'s.nom'=>'company','s.address'=>'company','s.zip'=>'company','s.town'=>'company','s.fk_pays'=>'company', 's.phone'=>'company','s.siren'=>'company','s.siret'=>'company','s.ape'=>'company','s.idprof4'=>'company','s.code_compta'=>'company','s.code_compta_fournisseur'=>'company', 'p.rowid'=>"project",'p.ref'=>"project",'p.datec'=>"project",'p.dateo'=>"project",'p.datee'=>"project",'p.duree'=>"project",'p.fk_statut'=>"project",'p.description'=>"project"); - + $this->export_fields_array[$r]=array('s.rowid'=>"IdCompany",'s.nom'=>'CompanyName','s.address'=>'Address','s.zip'=>'Zip','s.town'=>'Town','s.fk_pays'=>'Country', 's.phone'=>'Phone','s.siren'=>'ProfId1','s.siret'=>'ProfId2','s.ape'=>'ProfId3','s.idprof4'=>'ProfId4','s.code_compta'=>'CustomerAccountancyCode','s.code_compta_fournisseur'=>'SupplierAccountancyCode', 'p.rowid'=>"ProjectId",'p.ref'=>"RefProject",'p.datec'=>"DateCreation",'p.dateo'=>"DateStart",'p.datee'=>"DateEnd",'p.fk_statut'=>'Status','p.description'=>"Description"); - + // Add fields for project $this->export_fields_array[$r]=array_merge($this->export_fields_array[$r], array()); // Add extra fields @@ -239,7 +239,7 @@ class modProjet extends DolibarrModules $this->export_entities_array[$r][$fieldname]='project'; } } - // End add extra fields + // End add extra fields // Add fields for tasks $this->export_fields_array[$r]=array_merge($this->export_fields_array[$r], array('pt.rowid'=>'RefTask','pt.dateo'=>"TaskDateStart",'pt.datee'=>"TaskDateEnd",'pt.duration_effective'=>"DurationEffective",'pt.planned_workload'=>"PlannedWorkload",'pt.progress'=>"Progress",'pt.description'=>"TaskDescription")); @@ -277,10 +277,10 @@ class modProjet extends DolibarrModules $this->export_entities_array[$r][$fieldname]='projecttask'; } } - // End add extra fields + // End add extra fields $this->export_fields_array[$r]=array_merge($this->export_fields_array[$r], array('ptt.task_date'=>'TaskTimeDate','ptt.task_duration'=>"TimesSpent",'ptt.fk_user'=>"TaskTimeUser",'ptt.note'=>"TaskTimeNote")); $this->export_entities_array[$r]=array_merge($this->export_entities_array[$r], array('ptt.task_date'=>'task_time','ptt.task_duration'=>"task_time",'ptt.fk_user'=>"task_time",'ptt.note'=>"task_time")); - + $this->export_sql_start[$r]='SELECT DISTINCT '; $this->export_sql_end[$r] =' FROM '.MAIN_DB_PREFIX.'projet as p'; $this->export_sql_end[$r] .=' LEFT JOIN '.MAIN_DB_PREFIX.'projet_extrafields as extra ON p.rowid = extra.fk_object'; @@ -289,7 +289,7 @@ class modProjet extends DolibarrModules $this->export_sql_end[$r] .=' LEFT JOIN '.MAIN_DB_PREFIX."projet_task_time as ptt ON pt.rowid = ptt.fk_task,"; $this->export_sql_end[$r] .=' '.MAIN_DB_PREFIX.'societe as s'; $this->export_sql_end[$r] .=' WHERE p.fk_soc = s.rowid'; - $this->export_sql_end[$r] .=' AND p.entity = '.$conf->entity; + $this->export_sql_end[$r] .=' AND p.entity IN ('.getEntity('project',1).')'; } @@ -344,12 +344,12 @@ class modProjet extends DolibarrModules return 0; } } - + $sql = array( "DELETE FROM ".MAIN_DB_PREFIX."document_model WHERE nom = '".$this->const[0][2]."' AND entity = ".$conf->entity, "INSERT INTO ".MAIN_DB_PREFIX."document_model (nom, type, entity) VALUES('".$this->const[0][2]."','invoice',".$conf->entity.")" ); - + $sql = array( "DELETE FROM ".MAIN_DB_PREFIX."document_model WHERE nom = '".$this->const[0][2]."' AND entity = ".$conf->entity, "INSERT INTO ".MAIN_DB_PREFIX."document_model (nom, type, entity) VALUES('".$this->const[0][2]."','project',".$conf->entity.")", diff --git a/htdocs/core/modules/modPropale.class.php b/htdocs/core/modules/modPropale.class.php index de1566578fe..e205c696a97 100644 --- a/htdocs/core/modules/modPropale.class.php +++ b/htdocs/core/modules/modPropale.class.php @@ -186,7 +186,7 @@ class modPropale extends DolibarrModules $this->export_sql_end[$r] .=', '.MAIN_DB_PREFIX.'propaldet as cd'; $this->export_sql_end[$r] .=' LEFT JOIN '.MAIN_DB_PREFIX.'product as p on (cd.fk_product = p.rowid)'; $this->export_sql_end[$r] .=' WHERE c.fk_soc = s.rowid AND c.rowid = cd.fk_propal'; - $this->export_sql_end[$r] .=' AND c.entity = '.$conf->entity; + $this->export_sql_end[$r] .=' AND c.entity IN ('.getEntity('propal',1).')'; } diff --git a/htdocs/core/modules/modSalaries.class.php b/htdocs/core/modules/modSalaries.class.php index 35f5a145bee..2144c95b1b3 100644 --- a/htdocs/core/modules/modSalaries.class.php +++ b/htdocs/core/modules/modSalaries.class.php @@ -132,21 +132,7 @@ class modSalaries extends DolibarrModules // Exports //-------- $r=0; -/* - $r++; - $this->export_code[$r]=$this->rights_class.'_'.$r; - $this->export_label[$r]='Payment of salaries'; - $this->export_permission[$r]=array(array("tax","charges","export")); - $this->export_fields_array[$r]=array('cc.libelle'=>"Type",'c.rowid'=>"IdSocialContribution",'c.libelle'=>"Label",'c.date_ech'=>'DateDue','c.periode'=>'Period','c.amount'=>"AmountExpected","c.paye"=>"Status",'p.rowid'=>'PaymentId','p.datep'=>'DatePayment','p.amount'=>'AmountPayment','p.num_paiement'=>'Numero'); - $this->export_TypeFields_array[$r]=array('cc.libelle'=>"List:c_chargesociales:libelle:id",'c.libelle'=>"Text",'c.date_ech'=>'Date','c.periode'=>'Period','c.amount'=>"Number","c.paye"=>"Boolean",'p.datep'=>'Date','p.amount'=>'Number','p.num_paiement'=>'Number'); - $this->export_entities_array[$r]=array('cc.libelle'=>"tax_type",'c.rowid'=>"tax",'c.libelle'=>'tax','c.date_ech'=>'tax','c.periode'=>'tax','c.amount'=>"tax","c.paye"=>"tax",'p.rowid'=>'payment','p.datep'=>'payment','p.amount'=>'payment','p.num_paiement'=>'payment'); - $this->export_sql_start[$r]='SELECT DISTINCT '; - $this->export_sql_end[$r] =' FROM '.MAIN_DB_PREFIX.'c_chargesociales as cc, '.MAIN_DB_PREFIX.'chargesociales as c'; - $this->export_sql_end[$r] .=' LEFT JOIN '.MAIN_DB_PREFIX.'paiementcharge as p ON p.fk_charge = c.rowid'; - $this->export_sql_end[$r] .=' WHERE c.fk_type = cc.id'; - $this->export_sql_end[$r] .=' AND c.entity = '.$conf->entity; - */ } diff --git a/htdocs/core/modules/modStock.class.php b/htdocs/core/modules/modStock.class.php index 43c7cec6fb3..8f6840a21b0 100644 --- a/htdocs/core/modules/modStock.class.php +++ b/htdocs/core/modules/modStock.class.php @@ -131,7 +131,7 @@ class modStock extends DolibarrModules $this->export_sql_start[$r]='SELECT DISTINCT '; $this->export_sql_end[$r] =' FROM '.MAIN_DB_PREFIX.'product as p, '.MAIN_DB_PREFIX.'product_stock as ps, '.MAIN_DB_PREFIX.'entrepot as e'; $this->export_sql_end[$r] .=' WHERE p.rowid = ps.fk_product AND ps.fk_entrepot = e.rowid'; - $this->export_sql_end[$r] .=' AND e.entity = '.$conf->entity; + $this->export_sql_end[$r] .=' AND e.entity IN ('.getEntity('stock',1).')'; // Imports diff --git a/htdocs/core/modules/modTax.class.php b/htdocs/core/modules/modTax.class.php index f4942d567c9..6f47d66f5a9 100644 --- a/htdocs/core/modules/modTax.class.php +++ b/htdocs/core/modules/modTax.class.php @@ -133,7 +133,7 @@ class modTax extends DolibarrModules $this->export_sql_end[$r] =' FROM '.MAIN_DB_PREFIX.'c_chargesociales as cc, '.MAIN_DB_PREFIX.'chargesociales as c'; $this->export_sql_end[$r] .=' LEFT JOIN '.MAIN_DB_PREFIX.'paiementcharge as p ON p.fk_charge = c.rowid'; $this->export_sql_end[$r] .=' WHERE c.fk_type = cc.id'; - $this->export_sql_end[$r] .=' AND c.entity = '.$conf->entity; + $this->export_sql_end[$r] .=' AND c.entity IN ('.getEntity('tax',1).')'; } diff --git a/htdocs/core/modules/modUser.class.php b/htdocs/core/modules/modUser.class.php index 55e96f02262..c683c2b34cc 100644 --- a/htdocs/core/modules/modUser.class.php +++ b/htdocs/core/modules/modUser.class.php @@ -220,7 +220,7 @@ class modUser extends DolibarrModules } $this->export_sql_start[$r]='SELECT DISTINCT '; $this->export_sql_end[$r] =' FROM '.MAIN_DB_PREFIX.'user as u'; - $this->export_sql_end[$r] .=' WHERE u.entity IN (0,'.$conf->entity.')'; + $this->export_sql_end[$r] .=' WHERE u.entity IN ('.getEntity('user',1).')'; } diff --git a/htdocs/expensereport/card.php b/htdocs/expensereport/card.php index 75ab8b7cb45..8cbb25fcc53 100755 --- a/htdocs/expensereport/card.php +++ b/htdocs/expensereport/card.php @@ -33,8 +33,8 @@ require_once(DOL_DOCUMENT_ROOT."/projet/class/project.class.php"); require_once(DOL_DOCUMENT_ROOT.'/compta/bank/class/account.class.php'); require_once(DOL_DOCUMENT_ROOT."/core/lib/expensereport.lib.php"); require_once(DOL_DOCUMENT_ROOT."/core/lib/price.lib.php"); -dol_include_once('/expensereport/core/modules/expensereport/modules_expensereport.php'); -dol_include_once("/expensereport/class/expensereport.class.php"); +require_once(DOL_DOCUMENT_ROOT."/core/modules/expensereport/modules_expensereport.php"); +require_once(DOL_DOCUMENT_ROOT."/expensereport/class/expensereport.class.php"); $langs->load("trips"); @@ -68,13 +68,17 @@ if (! empty($conf->multicompany->enabled) && ! empty($conf->entity) && $conf->en $rootfordata.='/'.$conf->entity; } $conf->expensereport->dir_output = $rootfordata.'/expensereport'; -$conf->expensereport->dir_output = $rootfordata.'/expensereport'; // Define $urlwithroot $urlwithouturlroot=preg_replace('/'.preg_quote(DOL_URL_ROOT,'/').'$/i','',trim($dolibarr_main_url_root)); $urlwithroot=$urlwithouturlroot.DOL_URL_ROOT; // This is to use external domain name found into config file //$urlwithroot=DOL_MAIN_URL_ROOT; // This is to use same domain name than current +// PDF +$hidedetails = (GETPOST('hidedetails', 'int') ? GETPOST('hidedetails', 'int') : (! empty($conf->global->MAIN_GENERATE_DOCUMENTS_HIDE_DETAILS) ? 1 : 0)); +$hidedesc = (GETPOST('hidedesc', 'int') ? GETPOST('hidedesc', 'int') : (! empty($conf->global->MAIN_GENERATE_DOCUMENTS_HIDE_DESC) ? 1 : 0)); +$hideref = (GETPOST('hideref', 'int') ? GETPOST('hideref', 'int') : (! empty($conf->global->MAIN_GENERATE_DOCUMENTS_HIDE_REF) ? 1 : 0)); + /* @@ -83,7 +87,7 @@ $urlwithroot=$urlwithouturlroot.DOL_URL_ROOT; // This is to use external domain if ($cancel) $action=''; -if ($action == 'confirm_delete' && $_GET["confirm"] == "yes" && $id > 0 && $user->rights->expensereport->supprimer) +if ($action == 'confirm_delete' && GETPOST("confirm") == "yes" && $id > 0 && $user->rights->expensereport->supprimer) { $object = new ExpenseReport($db); $result=$object->delete($id); @@ -171,6 +175,27 @@ if ($action == "confirm_save" && GETPOST("confirm") == "yes" && $id > 0 && $user $object = new ExpenseReport($db); $object->fetch($id); $result = $object->setValidate($user); + + if ($result > 0) + { + // Define output language + if (empty($conf->global->MAIN_DISABLE_PDF_AUTOUPDATE)) + { + $outputlangs = $langs; + $newlang = ''; + if ($conf->global->MAIN_MULTILANGS && empty($newlang) && GETPOST('lang_id')) $newlang = GETPOST('lang_id','alpha'); + if ($conf->global->MAIN_MULTILANGS && empty($newlang)) $newlang = $object->thirdparty->default_lang; + if (! empty($newlang)) { + $outputlangs = new Translate("", $conf); + $outputlangs->setDefaultLang($newlang); + } + $model=$object->modelpdf; + $ret = $object->fetch($id); // Reload to get new records + + $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref); + } + } + if ($result > 0 && $object->fk_user_validator > 0) { $langs->load("mails"); @@ -252,6 +277,27 @@ if ($action == "confirm_save_from_refuse" && GETPOST("confirm") == "yes" && $id $object = new ExpenseReport($db); $object->fetch($id); $result = $object->set_save_from_refuse($user); + + if ($result > 0) + { + // Define output language + if (empty($conf->global->MAIN_DISABLE_PDF_AUTOUPDATE)) + { + $outputlangs = $langs; + $newlang = ''; + if ($conf->global->MAIN_MULTILANGS && empty($newlang) && GETPOST('lang_id')) $newlang = GETPOST('lang_id','alpha'); + if ($conf->global->MAIN_MULTILANGS && empty($newlang)) $newlang = $object->thirdparty->default_lang; + if (! empty($newlang)) { + $outputlangs = new Translate("", $conf); + $outputlangs->setDefaultLang($newlang); + } + $model=$object->modelpdf; + $ret = $object->fetch($id); // Reload to get new records + + $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref); + } + } + if ($result > 0) { // Send mail @@ -283,7 +329,7 @@ if ($action == "confirm_save_from_refuse" && GETPOST("confirm") == "yes" && $id // Génération du pdf avant attachement $object->setDocModel($user,""); - $resultPDF = expensereport_pdf_create($db,$id,'',"",$langs); + $resultPDF = expensereport_pdf_create($db,$object,'',"",$langs); if($resultPDF): // ATTACHMENT @@ -329,6 +375,27 @@ if ($action == "confirm_approve" && GETPOST("confirm") == "yes" && $id > 0 && $u $object->fetch($id); $result = $object->setApproved($user); + + if ($result > 0) + { + // Define output language + if (empty($conf->global->MAIN_DISABLE_PDF_AUTOUPDATE)) + { + $outputlangs = $langs; + $newlang = ''; + if ($conf->global->MAIN_MULTILANGS && empty($newlang) && GETPOST('lang_id')) $newlang = GETPOST('lang_id','alpha'); + if ($conf->global->MAIN_MULTILANGS && empty($newlang)) $newlang = $object->thirdparty->default_lang; + if (! empty($newlang)) { + $outputlangs = new Translate("", $conf); + $outputlangs->setDefaultLang($newlang); + } + $model=$object->modelpdf; + $ret = $object->fetch($id); // Reload to get new records + + $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref); + } + } + if ($result > 0) { if (! empty($conf->global->DEPLACEMENT_TO_CLEAN)) @@ -360,7 +427,7 @@ if ($action == "confirm_approve" && GETPOST("confirm") == "yes" && $id > 0 && $u // Génération du pdf avant attachement $object->setDocModel($user,""); - $resultPDF = expensereport_pdf_create($db,$id,'',"",$langs); + $resultPDF = expensereport_pdf_create($db,$object,'',"",$langs); if($resultPDF): // ATTACHMENT @@ -412,6 +479,27 @@ if ($action == "confirm_refuse" && GETPOST('confirm')=="yes" && $id > 0 && $user $object->fetch($id); $result = $object->setDeny($user,GETPOST('detail_refuse')); + + if ($result > 0) + { + // Define output language + if (empty($conf->global->MAIN_DISABLE_PDF_AUTOUPDATE)) + { + $outputlangs = $langs; + $newlang = ''; + if ($conf->global->MAIN_MULTILANGS && empty($newlang) && GETPOST('lang_id')) $newlang = GETPOST('lang_id','alpha'); + if ($conf->global->MAIN_MULTILANGS && empty($newlang)) $newlang = $object->thirdparty->default_lang; + if (! empty($newlang)) { + $outputlangs = new Translate("", $conf); + $outputlangs->setDefaultLang($newlang); + } + $model=$object->modelpdf; + $ret = $object->fetch($id); // Reload to get new records + + $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref); + } + } + if ($result > 0) { if (! empty($conf->global->DEPLACEMENT_TO_CLEAN)) @@ -477,6 +565,26 @@ if ($action == "confirm_cancel" && GETPOST('confirm')=="yes" && GETPOST('detail_ { $result = $object->set_cancel($user,GETPOST('detail_cancel')); + if ($result > 0) + { + // Define output language + if (empty($conf->global->MAIN_DISABLE_PDF_AUTOUPDATE)) + { + $outputlangs = $langs; + $newlang = ''; + if ($conf->global->MAIN_MULTILANGS && empty($newlang) && GETPOST('lang_id')) $newlang = GETPOST('lang_id','alpha'); + if ($conf->global->MAIN_MULTILANGS && empty($newlang)) $newlang = $object->thirdparty->default_lang; + if (! empty($newlang)) { + $outputlangs = new Translate("", $conf); + $outputlangs->setDefaultLang($newlang); + } + $model=$object->modelpdf; + $ret = $object->fetch($id); // Reload to get new records + + $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref); + } + } + if ($result > 0) { if (! empty($conf->global->DEPLACEMENT_TO_CLEAN)) @@ -541,6 +649,27 @@ if ($action == "confirm_paid" && GETPOST('confirm')=="yes" && $id > 0 && $user-> $object->fetch($id); $result = $object->setPaid($user); + + if ($result > 0) + { + // Define output language + if (empty($conf->global->MAIN_DISABLE_PDF_AUTOUPDATE)) + { + $outputlangs = $langs; + $newlang = ''; + if ($conf->global->MAIN_MULTILANGS && empty($newlang) && GETPOST('lang_id')) $newlang = GETPOST('lang_id','alpha'); + if ($conf->global->MAIN_MULTILANGS && empty($newlang)) $newlang = $object->thirdparty->default_lang; + if (! empty($newlang)) { + $outputlangs = new Translate("", $conf); + $outputlangs->setDefaultLang($newlang); + } + $model=$object->modelpdf; + $ret = $object->fetch($id); // Reload to get new records + + $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref); + } + } + if ($result > 0) { if (! empty($conf->global->DEPLACEMENT_TO_CLEAN)) @@ -569,7 +698,7 @@ if ($action == "confirm_paid" && GETPOST('confirm')=="yes" && $id > 0 && $user-> // Génération du pdf avant attachement $object->setDocModel($user,""); - $resultPDF = expensereport_pdf_create($db,$id,'',"",$langs); + $resultPDF = expensereport_pdf_create($db,$object,'',"",$langs); // PREPARE SEND $mailfile = new CMailFile($subject,$emailTo,$emailFrom,$message); @@ -638,6 +767,27 @@ if ($action == "confirm_brouillonner" && GETPOST('confirm')=="yes" && $id > 0 && if ($user->id == $object->fk_user_author || $user->id == $object->fk_user_valid) { $result = $object->setStatut(0); + + if ($result > 0) + { + // Define output language + if (empty($conf->global->MAIN_DISABLE_PDF_AUTOUPDATE)) + { + $outputlangs = $langs; + $newlang = ''; + if ($conf->global->MAIN_MULTILANGS && empty($newlang) && GETPOST('lang_id')) $newlang = GETPOST('lang_id','alpha'); + if ($conf->global->MAIN_MULTILANGS && empty($newlang)) $newlang = $object->thirdparty->default_lang; + if (! empty($newlang)) { + $outputlangs = new Translate("", $conf); + $outputlangs->setDefaultLang($newlang); + } + $model=$object->modelpdf; + $ret = $object->fetch($id); // Reload to get new records + + $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref); + } + } + if ($result > 0) { header("Location: ".$_SEVER["PHP_SELF"]."?id=".$id); @@ -746,7 +896,7 @@ if ($action == "addline") $action=''; } -if ($action == 'confirm_delete_line' && $_POST["confirm"] == "yes") +if ($action == 'confirm_delete_line' && GETPOST("confirm") == "yes") { $object = new ExpenseReport($db); $object->fetch($id); @@ -759,6 +909,26 @@ if ($action == 'confirm_delete_line' && $_POST["confirm"] == "yes") $result=$object->deleteline($_GET["rowid"]); if ($result >= 0) { + if ($result > 0) + { + // Define output language + if (empty($conf->global->MAIN_DISABLE_PDF_AUTOUPDATE)) + { + $outputlangs = $langs; + $newlang = ''; + if ($conf->global->MAIN_MULTILANGS && empty($newlang) && GETPOST('lang_id')) $newlang = GETPOST('lang_id','alpha'); + if ($conf->global->MAIN_MULTILANGS && empty($newlang)) $newlang = $object->thirdparty->default_lang; + if (! empty($newlang)) { + $outputlangs = new Translate("", $conf); + $outputlangs->setDefaultLang($newlang); + } + $model=$object->modelpdf; + $ret = $object->fetch($id); // Reload to get new records + + $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref); + } + } + $object->update_totaux_del($object_ligne->total_ht,$object_ligne->total_tva); header("Location: ".$_SERVER["PHP_SELF"]."?id=".$_GET['id']); exit; @@ -801,6 +971,26 @@ if ($action == "updateligne" ) $result = $object->updateline($rowid, $type_fees_id, $projet_id, $c_tva, $comments, $qty, $value_unit, $date, $object_id); if ($result >= 0) { + if ($result > 0) + { + // Define output language + if (empty($conf->global->MAIN_DISABLE_PDF_AUTOUPDATE)) + { + $outputlangs = $langs; + $newlang = ''; + if ($conf->global->MAIN_MULTILANGS && empty($newlang) && GETPOST('lang_id')) $newlang = GETPOST('lang_id','alpha'); + if ($conf->global->MAIN_MULTILANGS && empty($newlang)) $newlang = $object->thirdparty->default_lang; + if (! empty($newlang)) { + $outputlangs = new Translate("", $conf); + $outputlangs->setDefaultLang($newlang); + } + $model=$object->modelpdf; + $ret = $object->fetch($id); // Reload to get new records + + $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref); + } + } + $object->recalculer($object_id); header("Location: ".$_SERVER["PHP_SELF"]."?id=".$object_id); exit; @@ -812,20 +1002,6 @@ if ($action == "updateligne" ) } } -if ($action == "recalc" && $id > 0) -{ - $object = new ExpenseReport($db); - $object->fetch($id); - if($object->recalculer($id) > 0) - { - header("Location: ".$_SERVER["PHP_SELF"]."?id=".$_GET['id']); - exit; - } - else - { - setEventMessages($object->error, $object->errors, 'errors'); - } -} /* * Generer ou regenerer le document PDF @@ -846,7 +1022,7 @@ if ($action == 'builddoc') // En get ou en post $outputlangs = new Translate("",$conf); $outputlangs->setDefaultLang($_REQUEST['lang_id']); } - $result=expensereport_pdf_create($db, $depl->id, '', $depl->modelpdf, $outputlangs); + $result=expensereport_pdf_create($db, $depl, '', $depl->modelpdf, $outputlangs); if ($result <= 0) { dol_print_error($db,$result); diff --git a/htdocs/expensereport/class/expensereport.class.php b/htdocs/expensereport/class/expensereport.class.php index 2523ef34154..0ebde8ac92c 100755 --- a/htdocs/expensereport/class/expensereport.class.php +++ b/htdocs/expensereport/class/expensereport.class.php @@ -24,7 +24,8 @@ class ExpenseReport extends CommonObject var $date_fin; var $fk_user_validator; - var $fk_c_expensereport_statuts; // -- 1=brouillon, 2=validé (attente approb), 4=annulé, 5=approuvé, 6=payed, 99=refusé + var $status; + var $fk_c_expensereport_statuts; // -- 1=draft, 2=validated (attente approb), 4=canceled, 5=approved, 6=payed, 99=denied var $fk_c_paiement; var $user_author_infos; @@ -467,6 +468,67 @@ class ExpenseReport extends CommonObject } + + /** + * Initialise an instance with random values. + * Used to build previews or test instances. + * id must be 0 if object instance is a specimen. + * + * @return void + */ + function initAsSpecimen() + { + global $user,$langs,$conf; + + $now=dol_now(); + + // Initialise parametres + $this->id=0; + $this->ref = 'SPECIMEN'; + $this->specimen=1; + $this->date_create = $now; + $this->date_debut = $now; + $this->date_fin = $now; + $this->date_approve = $now; + + $this->status = 5; + $this->fk_c_expensereport_statuts = 5; + + $this->fk_user_author = $user->id; + $this->fk_user_valid = $user->id; + $this->fk_user_approve = $user->id; + $this->fk_user_validator = $user->id; + + $this->note_private='Private note'; + $this->note_public='SPECIMEN'; + $nbp = 5; + $xnbp = 0; + while ($xnbp < $nbp) + { + $line=new ExpenseReportLine($this->db); + $line->comments=$langs->trans("Comment")." ".$xnbp; + $line->date=($now-3600*(1+$xnbp)); + $line->total_ht=100; + $line->total_tva=20; + $line->total_ttc=120; + $line->qty=1; + $line->fk_c_tva=20; + $line->tva_taux=20; + $line->value_unit=120; + $line->fk_expensereport=0; + $line->type_fees_code='TRA'; + + $line->projet_ref = 'ABC'; + + $this->lines[$xnbp]=$line; + $xnbp++; + + $this->total_ht+=$line->total_ht; + $this->total_tva+=$line->total_tva; + $this->total_ttc+=$line->total_ttc; + } + } + /** * fetch_line_by_project * @@ -1302,6 +1364,41 @@ class ExpenseReport extends CommonObject return -1; } } + + /** + * Create a document onto disk accordign to template module. + * + * @param string $modele Force le mnodele a utiliser ('' to not force) + * @param Translate $outputlangs objet lang a utiliser pour traduction + * @param int $hidedetails Hide details of lines + * @param int $hidedesc Hide description + * @param int $hideref Hide ref + * @return int 0 if KO, 1 if OK + */ + public function generateDocument($modele, $outputlangs, $hidedetails=0, $hidedesc=0, $hideref=0) + { + global $conf,$langs; + + $langs->load("trips"); + + // Positionne le modele sur le nom du modele a utiliser + if (! dol_strlen($modele)) + { + if (! empty($conf->global->EXPENSEREPORT_ADDON_PDF)) + { + $modele = $conf->global->EXPENSEREPORT_ADDON_PDF; + } + else + { + $modele = 'standard'; + } + } + + $modelpath = "core/modules/expensereport/doc/"; + + return $this->commonGenerateDocument($modelpath, $modele, $outputlangs, $hidedetails, $hidedesc, $hideref); + } + } diff --git a/htdocs/exports/export.php b/htdocs/exports/export.php index 45e78b2ecd3..ca997f0eb59 100644 --- a/htdocs/exports/export.php +++ b/htdocs/exports/export.php @@ -60,7 +60,9 @@ $entitytoicon = array( 'warehouse' => 'stock', 'category' => 'category', 'shipment' => 'sending', - 'shipment_line'=> 'sending' + 'shipment_line'=> 'sending', + 'expensereport'=> 'trip', + 'expensereport_line'=> 'trip' ); // Translation code @@ -95,7 +97,9 @@ $entitytolang = array( 'project' => 'Projects', 'projecttask' => 'Tasks', 'task_time' => 'TaskTimeSpent', - 'action' => 'Action' + 'action' => 'Action', + 'expensereport'=> 'ExpenseReport', + 'expensereport_line'=> 'ExpenseReportLine', ); $array_selected=isset($_SESSION["export_selected_fields"])?$_SESSION["export_selected_fields"]:array(); diff --git a/htdocs/install/mysql/migration/3.7.0-3.8.0.sql b/htdocs/install/mysql/migration/3.7.0-3.8.0.sql index 13c948bea56..4a71995133c 100755 --- a/htdocs/install/mysql/migration/3.7.0-3.8.0.sql +++ b/htdocs/install/mysql/migration/3.7.0-3.8.0.sql @@ -148,7 +148,7 @@ CREATE TABLE llx_expensereport ( fk_user_paid integer DEFAULT NULL, fk_c_expensereport_statuts integer NOT NULL, -- 1=brouillon, 2=validé (attente approb), 4=annulé, 5=approuvé, 6=payed, 99=refusé fk_c_paiement integer DEFAULT NULL, - note text, + note_public text, note_private text, detail_refuse varchar(255) DEFAULT NULL, detail_cancel varchar(255) DEFAULT NULL, diff --git a/htdocs/install/mysql/tables/llx_expensereport.sql b/htdocs/install/mysql/tables/llx_expensereport.sql index 7224ec38b61..e60be7251a5 100755 --- a/htdocs/install/mysql/tables/llx_expensereport.sql +++ b/htdocs/install/mysql/tables/llx_expensereport.sql @@ -46,7 +46,7 @@ CREATE TABLE llx_expensereport ( fk_user_paid integer DEFAULT NULL, fk_c_expensereport_statuts integer NOT NULL, -- 1=brouillon, 2=validé (attente approb), 4=annulé, 5=approuvé, 6=payed, 99=refusé fk_c_paiement integer DEFAULT NULL, - note text, + note_public text, note_private text, detail_refuse varchar(255) DEFAULT NULL, detail_cancel varchar(255) DEFAULT NULL, diff --git a/htdocs/langs/en_US/admin.lang b/htdocs/langs/en_US/admin.lang index 20d12072b5e..e16a0a30ccc 100755 --- a/htdocs/langs/en_US/admin.lang +++ b/htdocs/langs/en_US/admin.lang @@ -1581,3 +1581,5 @@ SortOrder=Sort order Format=Format TypePaymentDesc=0:Customer payment type, 1:Supplier payment type, 2:Both customers and suppliers payment type IncludePath=Include path (defined into variable %s) +ExpenseReportsSetup=Setup of module Expense Reports +TemplatePDFExpenseReports=Document templates to generate expense report document diff --git a/htdocs/langs/en_US/trips.lang b/htdocs/langs/en_US/trips.lang index e5f683eb8fe..c84b8905562 100644 --- a/htdocs/langs/en_US/trips.lang +++ b/htdocs/langs/en_US/trips.lang @@ -27,10 +27,10 @@ AnyOtherInThisListCanValidate=Person to inform for validation. TripSociete=Information company TripSalarie=Informations user TripNDF=Informations expense report - DeleteLine=Delete a ligne of the expense report ConfirmDeleteLine=Are you sure you want to delete this line ? - +PDFStandardExpenseReports=Standard template to generate a PDF document for expense report +ExpenseReportLine=Expense report line TF_OTHER=Other TF_TRANSPORTATION=Transportation TF_LUNCH=Lunch @@ -67,10 +67,11 @@ MOTIF_REFUS=Reason MOTIF_CANCEL=Reason DATE_REFUS=Deny date -DATE_CANCEL=Cancelation date +DATE_SAVE=Validation date DATE_VALIDE=Validation date +DateApprove=Approving date +DATE_CANCEL=Cancelation date DATE_PAIEMENT=Payment date -DATE_SAVE=Recording date Deny=Deny TO_PAID=Pay From 702c19dab37fdfd45a21e1eb5890acc25b98e1f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcos=20Garci=CC=81a=20de=20La=20Fuente?= Date: Sun, 22 Feb 2015 13:17:57 +0100 Subject: [PATCH 112/287] Refactored function getBrowserInfo --- htdocs/core/lib/functions.lib.php | 58 ++++++++++++++++++------------- 1 file changed, 33 insertions(+), 25 deletions(-) diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php index f1590a1be57..fc261bd4290 100644 --- a/htdocs/core/lib/functions.lib.php +++ b/htdocs/core/lib/functions.lib.php @@ -130,24 +130,34 @@ function getEntity($element=false, $shared=false) */ function getBrowserInfo($user_agent) { - $name='unknown'; $version=''; $os='unknown'; $phone=''; $tablet=''; + include_once DOL_DOCUMENT_ROOT.'/core/class/mobiledetect.class.php'; - // If phone/smartphone, we set phone os name. - if (preg_match('/android/i', $user_agent)) { $os=$phone='android'; } - elseif (preg_match('/blackberry/i', $user_agent)) { $os=$phone='blackberry'; } - elseif (preg_match('/iphone/i', $user_agent)) { $os='ios'; $phone='iphone'; } - elseif (preg_match('/ipod/i', $user_agent)) { $os='ios'; $phone='iphone'; } - elseif (preg_match('/palm/i', $user_agent)) { $os=$phone='palm'; } - elseif (preg_match('/symbian/i', $user_agent)) { $os='symbian'; $phone='unknown'; } - elseif (preg_match('/webos/i', $user_agent)) { $os='webos'; $phone='unknown'; } - elseif (preg_match('/maemo/i', $user_agent)) { $os='maemo'; $phone='unknown'; } - // MS products at end - elseif (preg_match('/iemobile/i', $user_agent)) { $os='windows'; $phone='unkown'; } - elseif (preg_match('/windows ce/i', $user_agent)) { $os='windows'; $phone='unkown'; } + $name='unknown'; + $version=''; + $os='unknown'; + + $detectmobile = new MobileDetect(null, $user_agent); + $phone = ''; + $tablet = $detectmobile->isTablet(); + + if ($detectmobile->isMobile()) { + + // If phone/smartphone, we set phone os name. + if ($detectmobile->is('AndroidOS')) { $os=$phone='android'; } + elseif ($detectmobile->is('BlackBerryOS')) { $os=$phone='blackberry'; } + elseif ($detectmobile->is('iOS')) { $os='ios'; $phone='iphone'; } + elseif ($detectmobile->is('PalmOS')) { $os=$phone='palm'; } + elseif ($detectmobile->is('SymbianOS')) { $os='symbian'; $phone='unknown'; } + elseif ($detectmobile->is('webOS')) { $os='webos'; $phone='unknown'; } + elseif ($detectmobile->is('MaemoOS')) { $os='maemo'; $phone='unknown'; } + // MS products at end + elseif ($detectmobile->is('WindowsMobileOS') || $detectmobile->is('WindowsPhoneOS')) { + $os='windows'; $phone='unkown'; + } + } // OS - if (preg_match('/android/i', $user_agent)) { $os='android'; } - elseif (preg_match('/linux/i', $user_agent)) { $os='linux'; } + if (preg_match('/linux/i', $user_agent)) { $os='linux'; } // Name if (preg_match('/firefox(\/|\s)([\d\.]*)/i', $user_agent, $reg)) { $name='firefox'; $version=$reg[2]; } @@ -159,22 +169,20 @@ function getBrowserInfo($user_agent) $user_agent, $reg)) { $name='safari'; $version=$reg[2]; } // Safari is often present in string for mobile but its not. elseif (preg_match('/opera(\/|\s)([\d\.]*)/i', $user_agent, $reg)) { $name='opera'; $version=$reg[2]; } elseif (preg_match('/msie(\/|\s)([\d\.]*)/i', $user_agent, $reg)) { $name='ie'; $version=$reg[2]; } // MS products at end - // Other - $firefox=0; - if (in_array($name,array('firefox','iceweasel'))) $firefox=1; - include_once DOL_DOCUMENT_ROOT.'/core/class/mobiledetect.class.php'; - $detectmobile=new MobileDetect(); - $phone=$detectmobile->isMobile(); - $tablet=$detectmobile->isTablet(); - unset($detectmobile); // free memory + if ($tablet) { + $layout = 'tablet'; + } elseif ($phone) { + $layout = 'phone'; + } else { + $layout = 'classic'; + } return array( 'browsername' => $name, 'browserversion' => $version, 'browseros' => $os, - 'browserfirefox' => $firefox, - 'layout' => ($tablet ? 'tablet' : ($phone ? 'phone' : 'classic')), + 'layout' => $layout, 'phone' => $phone, 'tablet' => $tablet ); From cda6e7adf9c36529cc3f50198b0c7f752b07335d Mon Sep 17 00:00:00 2001 From: aspangaro Date: Sun, 22 Feb 2015 14:20:42 +0100 Subject: [PATCH 113/287] Delete cash journal --- htdocs/accountancy/journal/cashjournal.php | 533 --------------------- 1 file changed, 533 deletions(-) delete mode 100644 htdocs/accountancy/journal/cashjournal.php diff --git a/htdocs/accountancy/journal/cashjournal.php b/htdocs/accountancy/journal/cashjournal.php deleted file mode 100644 index bbd74a8c29c..00000000000 --- a/htdocs/accountancy/journal/cashjournal.php +++ /dev/null @@ -1,533 +0,0 @@ - - * Copyright (C) 2007-2010 Jean Heimburger - * Copyright (C) 2011 Juanjo Menent - * Copyright (C) 2012 Regis Houssin - * Copyright (C) 2013 Christophe Battarel - * Copyright (C) 2013-2015 Alexandre Spangaro - * Copyright (C) 2013-2014 Florian Henry - * Copyright (C) 2013-2014 Olivier Geffroy - * - * 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 3 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, see . - */ - -/** - * \file htdocs/accountancy/journal/cashjournal.php - * \ingroup Accounting Expert - * \brief Page with cash journal - */ - -require '../../main.inc.php'; - -// Class -require_once DOL_DOCUMENT_ROOT.'/core/lib/report.lib.php'; -require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php'; -require_once DOL_DOCUMENT_ROOT.'/core/lib/bank.lib.php'; -require_once DOL_DOCUMENT_ROOT.'/core/lib/accounting.lib.php'; -require_once DOL_DOCUMENT_ROOT.'/societe/class/societe.class.php'; -require_once DOL_DOCUMENT_ROOT.'/adherents/class/adherent.class.php'; -require_once DOL_DOCUMENT_ROOT.'/compta/sociales/class/chargesociales.class.php'; -require_once DOL_DOCUMENT_ROOT.'/compta/paiement/class/paiement.class.php'; -require_once DOL_DOCUMENT_ROOT.'/compta/tva/class/tva.class.php'; -require_once DOL_DOCUMENT_ROOT.'/fourn/class/paiementfourn.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.'/accountancy/class/bookkeeping.class.php'; - -// Langs -$langs->load("companies"); -$langs->load("other"); -$langs->load("compta"); -$langs->load("bank"); -$langs->load("accountancy"); - -$date_startmonth = GETPOST('date_startmonth'); -$date_startday = GETPOST('date_startday'); -$date_startyear = GETPOST('date_startyear'); -$date_endmonth = GETPOST('date_endmonth'); -$date_endday = GETPOST('date_endday'); -$date_endyear = GETPOST('date_endyear'); - -// Security check -if ($user->societe_id > 0) - accessforbidden(); - -$action = GETPOST('action'); - -/* - * View - */ - -$year_current = strftime("%Y", dol_now()); -$pastmonth = strftime("%m", dol_now()) - 1; -$pastmonthyear = $year_current; -if ($pastmonth == 0) { - $pastmonth = 12; - $pastmonthyear --; -} - -$date_start = dol_mktime(0, 0, 0, $date_startmonth, $date_startday, $date_startyear); -$date_end = dol_mktime(23, 59, 59, $date_endmonth, $date_endday, $date_endyear); - -if (empty($date_start) || empty($date_end)) // We define date_start and date_end -{ - $date_start = dol_get_first_day($pastmonthyear, $pastmonth, false); - $date_end = dol_get_last_day($pastmonthyear, $pastmonth, false); -} - -$p = explode(":", $conf->global->MAIN_INFO_SOCIETE_COUNTRY); -$idpays = $p[0]; - -$sql = "SELECT b.rowid , b.dateo as do, b.datev as dv, b.amount, b.label, b.rappro, b.num_releve, b.num_chq, b.fk_type, soc.code_compta, ba.courant,"; -$sql .= " soc.code_compta_fournisseur, soc.rowid as socid, soc.nom as name, ba.account_number, bu1.type as typeop"; -$sql .= " FROM " . MAIN_DB_PREFIX . "bank as b"; -$sql .= " JOIN " . MAIN_DB_PREFIX . "bank_account as ba on b.fk_account=ba.rowid"; -$sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "bank_url as bu1 ON bu1.fk_bank = b.rowid AND bu1.type='company'"; -$sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "societe as soc on bu1.url_id=soc.rowid"; - -// Code opération type caisse -$sql .= " WHERE ba.courant = 2"; -if (! empty($conf->multicompany->enabled)) { - $sql .= " AND ba.entity = " . $conf->entity; -} - -if ($date_start && $date_end) - $sql .= " AND b.dateo >= '" . $db->idate($date_start) . "' AND b.dateo <= '" . $db->idate($date_end) . "'"; -$sql .= " ORDER BY b.datev"; - -$object = new Account($db); -$paymentstatic = new Paiement($db); -$paymentsupplierstatic = new PaiementFourn($db); -$societestatic = new Societe($db); -$chargestatic = new ChargeSociales($db); -$paymentvatstatic = new TVA($db); - -dol_syslog("accountancy/journal/cashjournal.php:: sql=" . $sql, LOG_DEBUG); -$result = $db->query($sql); -if ($result) { - - $num = $db->num_rows($result); - // les variables - $cptfour = (! empty($conf->global->ACCOUNTING_ACCOUNT_SUPPLIER) ? $conf->global->ACCOUNTING_ACCOUNT_SUPPLIER : $langs->trans("CodeNotDef")); - $cptcli = (! empty($conf->global->ACCOUNTING_ACCOUNT_CUSTOMER) ? $conf->global->ACCOUNTING_ACCOUNT_CUSTOMER : $langs->trans("CodeNotDef")); - $cpttva = (! empty($conf->global->ACCOUNTING_ACCOUNT_SUSPENSE) ? $conf->global->ACCOUNTING_ACCOUNT_SUSPENSE : $langs->trans("CodeNotDef")); - $cptsociale = (! empty($conf->global->ACCOUNTING_ACCOUNT_SUSPENSE) ? $conf->global->ACCOUNTING_ACCOUNT_SUSPENSE : $langs->trans("CodeNotDef")); - - $tabpay = array (); - $tabbq = array (); - $tabtp = array (); - $tabcompany = array (); - $tabtype = array (); - - $i = 0; - while ( $i < $num ) { - $obj = $db->fetch_object($result); - - // controls - $compta_bank = $obj->account_number; - if ($obj->label == '(SupplierInvoicePayment)') - $compta_soc = (! empty($obj->code_compta_fournisseur) ? $obj->code_compta_fournisseur : $cptfour); - if ($obj->label == '(CustomerInvoicePayment)') - $compta_soc = (! empty($obj->code_compta) ? $obj->code_compta : $cptcli); - if ($obj->typeop == '(BankTransfert)') - $compta_soc = $conf->global->ACCOUNTING_ACCOUNT_TRANSFER_CASH; - - // variable bookkeeping - - $tabpay[$obj->rowid]["date"] = $obj->do; - $tabpay[$obj->rowid]["ref"] = $obj->label; - $tabpay[$obj->rowid]["fk_bank"] = $obj->rowid; - if (preg_match('/^\((.*)\)$/i', $obj->label, $reg)) { - $tabpay[$obj->rowid]["lib"] = $langs->trans($reg[1]); - } else { - $tabpay[$obj->rowid]["lib"] = dol_trunc($obj->label, 60); - } - $links = $object->get_url($obj->rowid); - - foreach ( $links as $key => $val ) { - - $tabtype[$obj->rowid] = $links[$key]['type']; - - if ($links[$key]['type'] == 'payment') { - $paymentstatic->id = $links[$key]['url_id']; - $tabpay[$obj->rowid]["lib"] .= ' ' . $paymentstatic->getNomUrl(2); - } else if ($links[$key]['type'] == 'payment_supplier') { - $paymentsupplierstatic->id = $links[$key]['url_id']; - $paymentsupplierstatic->ref = $links[$key]['url_id']; - $tabpay[$obj->rowid]["lib"] .= ' ' . $paymentsupplierstatic->getNomUrl(2); - } else if ($links[$key]['type'] == 'company') { - - $societestatic->id = $links[$key]['url_id']; - $societestatic->name = $links[$key]['label']; - $tabpay[$obj->rowid]["soclib"] = $societestatic->getNomUrl(1, '', 30); - $tabtp[$obj->rowid][$compta_soc] += $obj->amount; - } else if ($links[$key]['type'] == 'sc') { - - $chargestatic->id = $links[$key]['url_id']; - $chargestatic->ref = $links[$key]['url_id']; - - $tabpay[$obj->rowid]["lib"] .= ' ' . $chargestatic->getNomUrl(2); - if (preg_match('/^\((.*)\)$/i', $links[$key]['label'], $reg)) { - if ($reg[1] == 'socialcontribution') - $reg[1] = 'SocialContribution'; - $chargestatic->lib = $langs->trans($reg[1]); - } else { - $chargestatic->lib = $links[$key]['label']; - } - $chargestatic->ref = $chargestatic->lib; - $tabpay[$obj->rowid]["soclib"] = $chargestatic->getNomUrl(1, 30); - - $sqlmid = 'SELECT cchgsoc.accountancy_code'; - $sqlmid .= " FROM " . MAIN_DB_PREFIX . "c_chargesociales cchgsoc "; - $sqlmid .= " INNER JOIN " . MAIN_DB_PREFIX . "chargesociales as chgsoc ON chgsoc.fk_type=cchgsoc.id"; - $sqlmid .= " INNER JOIN " . MAIN_DB_PREFIX . "paiementcharge as paycharg ON paycharg.fk_charge=chgsoc.rowid"; - $sqlmid .= " INNER JOIN " . MAIN_DB_PREFIX . "bank_url as bkurl ON bkurl.url_id=paycharg.rowid"; - $sqlmid .= " WHERE bkurl.fk_bank=" . $obj->rowid; - dol_syslog("accountancy/journal/cashjournal.php:: sqlmid=" . $sqlmid, LOG_DEBUG); - $resultmid = $db->query($sqlmid); - if ($resultmid) { - $objmid = $db->fetch_object($resultmid); - $tabtp[$obj->rowid][$objmid->accountancy_code] += $obj->amount; - } - } else if ($links[$key]['type'] == 'payment_vat') { - - $paymentvatstatic->id = $links[$key]['url_id']; - $paymentvatstatic->ref = $links[$key]['url_id']; - $tabpay[$obj->rowid]["lib"] .= ' ' . $paymentvatstatic->getNomUrl(2); - $tabtp[$obj->rowid][$cpttva] += $obj->amount; - } else if ($links[$key]['type'] == 'banktransfert') { - $tabpay[$obj->rowid]["lib"] .= ' ' . $paymentvatstatic->getNomUrl(2); - $tabtp[$obj->rowid][$cpttva] += $obj->amount; - } - /*else { - $tabtp [$obj->rowid] [$cptsociale] += $obj->amount; - }*/ - } - $tabbq[$obj->rowid][$compta_bank] += $obj->amount; - - // if($obj->socid)$tabtp[$obj->rowid][$compta_soc] += $obj->amount; - - $i ++; - } -} else { - dol_print_error($db); -} - -/* - * Actions -*/ - -// write bookkeeping -if ($action == 'writeBookKeeping') { - $error = 0; - foreach ( $tabpay as $key => $val ) { - // cash - foreach ( $tabbq[$key] as $k => $mt ) { - $bookkeeping = new BookKeeping($db); - $bookkeeping->doc_date = $val["date"]; - $bookkeeping->doc_ref = $val["ref"]; - $bookkeeping->doc_type = 'cash'; - $bookkeeping->fk_doc = $key; - $bookkeeping->fk_docdet = $val["fk_bank"]; - $bookkeeping->code_tiers = $tabcompany[$key]['code_client']; - $bookkeeping->numero_compte = $k; - $bookkeeping->label_compte = $compte->label; - $bookkeeping->montant = ($mt < 0 ? - $mt : $mt); - $bookkeeping->sens = ($mt >= 0) ? 'D' : 'C'; - $bookkeeping->debit = ($mt >= 0 ? $mt : 0); - $bookkeeping->credit = ($mt < 0 ? - $mt : 0); - $bookkeeping->code_journal = $conf->global->ACCOUNTING_CASH_JOURNAL; - - if ($tabtype[$key] == 'payment') { - - $sqlmid = 'SELECT fac.facnumber'; - $sqlmid .= " FROM " . MAIN_DB_PREFIX . "facture fac "; - $sqlmid .= " INNER JOIN " . MAIN_DB_PREFIX . "paiement_facture as payfac ON payfac.fk_facture=fac.rowid"; - $sqlmid .= " INNER JOIN " . MAIN_DB_PREFIX . "paiement as pay ON payfac.fk_paiement=pay.rowid"; - $sqlmid .= " WHERE pay.fk_bank=" . $key; - dol_syslog("accountancy/journal/cashjournal.php:: sqlmid=" . $sqlmid, LOG_DEBUG); - $resultmid = $db->query($sqlmid); - if ($resultmid) { - $objmid = $db->fetch_object($resultmid); - $bookkeeping->doc_ref = $objmid->facnumber; - } - } else if ($tabtype[$key] == 'payment_supplier') { - - $sqlmid = 'SELECT facf.facnumber'; - $sqlmid .= " FROM " . MAIN_DB_PREFIX . "facture_fourn facf "; - $sqlmid .= " INNER JOIN " . MAIN_DB_PREFIX . "paiementfourn_facturefourn as payfacf ON payfacf.fk_facturefourn=facf.rowid"; - $sqlmid .= " INNER JOIN " . MAIN_DB_PREFIX . "paiementfourn as payf ON payfacf.fk_paiementfourn=payf.rowid"; - $sqlmid .= " WHERE payf.fk_bank=" . $key; - dol_syslog("accountancy/journal/cashjournal.php:: sqlmid=" . $sqlmid, LOG_DEBUG); - $resultmid = $db->query($sqlmid); - if ($resultmid) { - $objmid = $db->fetch_object($resultmid); - $bookkeeping->doc_ref = $objmid->facnumber; - } - } - - $result = $bookkeeping->create(); - if ($result < 0) { - $error ++; - setEventMessage($object->errors, 'errors'); - } - } - // third party - foreach ( $tabtp[$key] as $k => $mt ) { - - $bookkeeping = new BookKeeping($db); - $bookkeeping->doc_date = $val["date"]; - $bookkeeping->doc_ref = $val["ref"]; - $bookkeeping->doc_type = 'cash'; - $bookkeeping->fk_doc = $key; - $bookkeeping->fk_docdet = $val["fk_bank"]; - $bookkeeping->label_compte = $tabcompany[$key]['name']; - $bookkeeping->montant = ($mt < 0 ? - $mt : $mt); - $bookkeeping->sens = ($mt < 0) ? 'D' : 'C'; - $bookkeeping->debit = ($mt < 0 ? - $mt : 0); - $bookkeeping->credit = ($mt >= 0 ? $mt : 0); - $bookkeeping->code_journal = $conf->global->ACCOUNTING_CASH_JOURNAL; - - if ($tabtype[$key] == 'sc') { - $bookkeeping->code_tiers = ''; - $bookkeeping->numero_compte = $k; - } else if ($tabtype[$key] == 'payment') { - - $sqlmid = 'SELECT fac.facnumber'; - $sqlmid .= " FROM " . MAIN_DB_PREFIX . "facture fac "; - $sqlmid .= " INNER JOIN " . MAIN_DB_PREFIX . "paiement_facture as payfac ON payfac.fk_facture=fac.rowid"; - $sqlmid .= " INNER JOIN " . MAIN_DB_PREFIX . "paiement as pay ON payfac.fk_paiement=pay.rowid"; - $sqlmid .= " WHERE pay.fk_bank=" . $key; - dol_syslog("accountancy/journal/cashjournal.php:: sqlmid=" . $sqlmid, LOG_DEBUG); - $resultmid = $db->query($sqlmid); - if ($resultmid) { - $objmid = $db->fetch_object($resultmid); - $bookkeeping->doc_ref = $objmid->facnumber; - } - $bookkeeping->code_tiers = $k; - $bookkeeping->numero_compte = $conf->global->ACCOUNTING_ACCOUNT_CUSTOMER; - } else if ($tabtype[$key] == 'payment_supplier') { - - $sqlmid = 'SELECT facf.facnumber'; - $sqlmid .= " FROM " . MAIN_DB_PREFIX . "facture_fourn facf "; - $sqlmid .= " INNER JOIN " . MAIN_DB_PREFIX . "paiementfourn_facturefourn as payfacf ON payfacf.fk_facturefourn=facf.rowid"; - $sqlmid .= " INNER JOIN " . MAIN_DB_PREFIX . "paiementfourn as payf ON payfacf.fk_paiementfourn=payf.rowid"; - $sqlmid .= " WHERE payf.fk_bank=" . $key; - dol_syslog("accountancy/journal/cashjournal.php:: sqlmid=" . $sqlmid, LOG_DEBUG); - $resultmid = $db->query($sqlmid); - if ($resultmid) { - $objmid = $db->fetch_object($resultmid); - $bookkeeping->doc_ref = $objmid->facnumber; - } - $bookkeeping->code_tiers = $k; - $bookkeeping->numero_compte = $conf->global->ACCOUNTING_ACCOUNT_SUPPLIER; - } else if ($tabtype[$key] == 'company') { - - $sqlmid = 'SELECT fac.facnumber'; - $sqlmid .= " FROM " . MAIN_DB_PREFIX . "facture fac "; - $sqlmid .= " INNER JOIN " . MAIN_DB_PREFIX . "paiement_facture as payfac ON payfac.fk_facture=fac.rowid"; - $sqlmid .= " INNER JOIN " . MAIN_DB_PREFIX . "paiement as pay ON payfac.fk_paiement=pay.rowid"; - $sqlmid .= " WHERE pay.fk_bank=" . $key; - dol_syslog("accountancy/journal/cashjournal.php:: sqlmid=" . $sqlmid, LOG_DEBUG); - $resultmid = $db->query($sqlmid); - if ($resultmid) { - $objmid = $db->fetch_object($resultmid); - $bookkeeping->doc_ref = $objmid->facnumber; - } - $bookkeeping->code_tiers = $k; - $bookkeeping->numero_compte = $conf->global->ACCOUNTING_ACCOUNT_CUSTOMER; - } else { - - $bookkeeping->doc_ref = $k; - $bookkeeping->numero_compte = $conf->global->ACCOUNTING_ACCOUNT_CUSTOMER; - } - - $result = $bookkeeping->create(); - if ($result < 0) { - $error ++; - setEventMessage($object->errors, 'errors'); - } - } - } - - if (empty($error)) { - setEventMessage($langs->trans('Success'), 'mesgs'); - } -} -// Export -if ($action == 'export_csv') { - $sep = $conf->global->ACCOUNTING_EXPORT_SEPARATORCSV; - $cash_journal = $conf->global->ACCOUNTING_CASH_JOURNAL; - - header('Content-Type: text/csv'); - header('Content-Disposition:attachment;filename=journal_caisse.csv'); - - if ($conf->global->ACCOUNTING_EXPORT_MODELCSV == 2) // Model Cegid Expert Export - { - $sep = ";"; - - foreach ( $tabpay as $key => $val ) { - $date = dol_print_date($db->jdate($val["date"]), '%d%m%Y'); - - // Cash - foreach ( $tabbq[$key] as $k => $mt ) { - print $date . $sep; - print $cash_journal . $sep; - print length_accountg(html_entity_decode($k)) . $sep; - print $sep; - print ($mt < 0 ? 'C' : 'D') . $sep; - print ($mt <= 0 ? price(- $mt) : $mt) . $sep; - print $val["type_payment"] . $sep; - print $val["ref"] . $sep; - print "\n"; - } - - // Third party - foreach ( $tabtp[$key] as $k => $mt ) { - if ($mt) { - print $date . $sep; - print $cash_journal . $sep; - if ($val["lib"] == '(SupplierInvoicePayment)') { - print length_accountg($conf->global->ACCOUNTING_ACCOUNT_SUPPLIER) . $sep; - } else { - print length_accountg($conf->global->ACCOUNTING_ACCOUNT_CUSTOMER) . $sep; - } - print length_accounta(html_entity_decode($k)) . $sep; - print ($mt < 0 ? 'D' : 'C') . $sep; - print ($mt <= 0 ? price(- $mt) : $mt) . $sep; - print $val["type_payment"] . $sep; - print $val["ref"] . $sep; - print "\n"; - } - } - } - } else // Model Classic Export - { - foreach ( $tabpay as $key => $val ) { - $date = dol_print_date($db->jdate($val["date"]), 'day'); - - // Cash - foreach ( $tabbq[$key] as $k => $mt ) { - print '"' . $date . '"' . $sep; - print '"' . $val["ref"] . '"' . $sep; - print '"' . length_accountg(html_entity_decode($k)) . '"' . $sep; - print '"' . $langs->trans("Cash") . '"' . $sep; - print '"' . ($mt >= 0 ? price($mt) : '') . '"' . $sep; - print '"' . ($mt < 0 ? price(- $mt) : '') . '"'; - print "\n"; - } - - // Third party - foreach ( $tabtp[$key] as $k => $mt ) { - if ($mt) { - print '"' . $date . '"' . $sep; - print '"' . $val["ref"] . '"' . $sep; - print '"' . length_accounta(html_entity_decode($k)) . '"' . $sep; - print '"' . $langs->trans("ThirdParty") . '"' . $sep; - print '"' . ($mt < 0 ? price(- $mt) : '') . '"' . $sep; - print '"' . ($mt >= 0 ? price($mt) : '') . '"'; - print "\n"; - } - } - } - } -} else { - - $form = new Form($db); - - llxHeader('', $langs->trans("CashJournal"), ''); - - $name = $langs->trans("CashJournal"); - $nomlink = ''; - $periodlink = ''; - $exportlink = ''; - $builddate = time(); - $description = $langs->trans("DescCashJournal") . '
'; - $period = $form->select_date($date_start, 'date_start', 0, 0, 0, '', 1, 0, 1) . ' - ' . $form->select_date($date_end, 'date_end', 0, 0, 0, '', 1, 0, 1); - report_header($name, $nomlink, $period, $periodlink, $description, $builddate, $exportlink, array('action' => '')); - - print ''; - - print ''; - - print ' - '; - - /* - * Show result array - */ - print '

'; - - $i = 0; - print ""; - print ""; - print ""; - print ""; - print ""; - print ""; - print "\n"; - - $var = true; - $r = ''; - - foreach ( $tabpay as $key => $val ) { - $date = dol_print_date($db->jdate($val["date"]), 'day'); - - // Cash - foreach ( $tabbq[$key] as $k => $mt ) { - if (1) { - print ""; - print ""; - print ""; - print ""; - print '"; - print '"; - print ""; - } - } - - // third party - foreach ( $tabtp[$key] as $k => $mt ) { - if ($k != 'type') { - print ""; - - print ""; - print ""; - - print ""; - print '"; - print '"; - } - } - - $var = ! $var; - } - - print "
" . $langs->trans("Date") . "" . $langs->trans("Piece") . ' (' . $langs->trans("InvoiceRef") . ")" . $langs->trans("Account") . "" . $langs->trans("Debit") . "" . $langs->trans("Credit") . "
" . $date . "" . $val["lib"] . "" . length_accountg($k) . "' . ($mt >= 0 ? price($mt) : '') . "' . ($mt < 0 ? price(- $mt) : '') . "
" . $date . "" . $val["soclib"] . "" . length_accounta($k) . "' . ($mt < 0 ? price(- $mt) : '') . "' . ($mt >= 0 ? price($mt) : '') . "
"; - - // End of page - llxFooter(); -} -$db->close(); \ No newline at end of file From fe62e038cadd656ccfefe2f04dd0632fd935a1f0 Mon Sep 17 00:00:00 2001 From: Stephen L Date: Sun, 22 Feb 2015 14:34:51 +0100 Subject: [PATCH 114/287] Fix lastrowid-*table* option when defining imports (fix extrafields fk_object value) Signed-off-by: Stephen L. --- htdocs/core/modules/import/import_csv.modules.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/htdocs/core/modules/import/import_csv.modules.php b/htdocs/core/modules/import/import_csv.modules.php index 14de889d9ce..d487d3f8aef 100644 --- a/htdocs/core/modules/import/import_csv.modules.php +++ b/htdocs/core/modules/import/import_csv.modules.php @@ -354,6 +354,7 @@ class ImportCsv extends ModeleImports } else { + $last_insert_id_array = array(); // store the last inserted auto_increment id for each table, so that dependent tables can be inserted with the appropriate id (eg: extrafields fk_object will be set with the last inserted object's id) // For each table to insert, me make a separate insert foreach($objimport->array_import_tables[0] as $alias => $tablename) { @@ -581,7 +582,7 @@ class ImportCsv extends ModeleImports elseif (preg_match('/^lastrowid-/',$val)) { $tmp=explode('-',$val); - $lastinsertid=$this->db->last_insert_id($tmp[1]); + $lastinsertid=(isset($last_insert_id_array[$tmp[1]]))?$last_insert_id_array[$tmp[1]]:0; $listfields.=preg_replace('/^'.preg_quote($alias).'\./','',$key); $listvalues.=$lastinsertid; //print $key."-".$val."-".$listfields."-".$listvalues."
";exit; @@ -623,6 +624,7 @@ class ImportCsv extends ModeleImports if ($sql) { $resql=$this->db->query($sql); + $last_insert_id_array[$tablename] = $this->db->last_insert_id($tablename); // store the last inserted auto_increment id for each table, so that dependent tables can be inserted with the appropriate id. This must be done just after the INSERT request, else we risk losing the id (because another sql query will be issued somewhere in Dolibarr). if ($resql) { //print '.'; From 4ba095cb5c3a0929ea3e8523e8815c3e72620cfc Mon Sep 17 00:00:00 2001 From: aspangaro Date: Sun, 22 Feb 2015 15:04:18 +0100 Subject: [PATCH 115/287] FIXED: Bankjournal is generated from id_account now --- htdocs/accountancy/journal/bankjournal.php | 178 ++++++++++++++++----- 1 file changed, 139 insertions(+), 39 deletions(-) diff --git a/htdocs/accountancy/journal/bankjournal.php b/htdocs/accountancy/journal/bankjournal.php index b9d3b9209f9..8125f6ef14d 100644 --- a/htdocs/accountancy/journal/bankjournal.php +++ b/htdocs/accountancy/journal/bankjournal.php @@ -103,9 +103,7 @@ $sql .= " FROM " . MAIN_DB_PREFIX . "bank as b"; $sql .= " JOIN " . MAIN_DB_PREFIX . "bank_account as ba on b.fk_account=ba.rowid"; $sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "bank_url as bu1 ON bu1.fk_bank = b.rowid AND bu1.type='company'"; $sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "societe as soc on bu1.url_id=soc.rowid"; -// To isolate the cash of the other accounts -$sql .= " WHERE ba.courant <> 2"; -$sql .= " AND ba.rowid=".$id_accountancy_journal; +$sql .= " WHERE ba.rowid=".$id_accountancy_journal; if (! empty($conf->multicompany->enabled)) { $sql .= " AND ba.entity = " . $conf->entity; } @@ -218,6 +216,7 @@ if ($result) { $sqlmid .= " INNER JOIN " . MAIN_DB_PREFIX . "bank_url as bkurl ON bkurl.url_id=paycharg.rowid"; $sqlmid .= " WHERE bkurl.fk_bank=" . $obj->rowid; + dol_syslog("accountancy/journal/bankjournal.php:: sqlmid=" . $sqlmid, LOG_DEBUG); $resultmid = $db->query($sqlmid); if ($resultmid) @@ -237,6 +236,7 @@ if ($result) { { $paymentsalstatic->id = $links[$key]['url_id']; $paymentsalstatic->ref = $links[$key]['url_id']; + $paymentsalstatic->label = $links[$key]['label']; $tabpay[$obj->rowid]["lib"] .= ' ' . $paymentsalstatic->getNomUrl(2); $tabtp[$obj->rowid][$accountancy_account_salary] += $obj->amount; } @@ -421,6 +421,7 @@ if ($action == 'export_csv') foreach ( $tabpay as $key => $val ) { $date = dol_print_date($db->jdate($val["date"]), '%d%m%Y'); + $companystatic->id = $tabcompany[$key]['id']; $companystatic->name = $tabcompany[$key]['name']; @@ -438,21 +439,44 @@ if ($action == 'export_csv') } // Third party - foreach ( $tabtp[$key] as $k => $mt ) { - if ($mt) { - print $date . $sep; - print $bank_journal . $sep; - if ($val["lib"] == '(SupplierInvoicePayment)') { - print length_accountg($conf->global->ACCOUNTING_ACCOUNT_SUPPLIER) . $sep; - } else { - print length_accountg($conf->global->ACCOUNTING_ACCOUNT_CUSTOMER) . $sep; + if (is_array ( $tabtp[$key])) + { + foreach ( $tabtp[$key] as $k => $mt ) + { + if ($mt) + { + print $date . $sep; + print $bank_journal . $sep; + if ($val["lib"] == '(SupplierInvoicePayment)') { + print length_accountg($conf->global->ACCOUNTING_ACCOUNT_SUPPLIER) . $sep; + } else { + print length_accountg($conf->global->ACCOUNTING_ACCOUNT_CUSTOMER) . $sep; + } + print length_accounta(html_entity_decode($k)) . $sep; + print ($mt < 0 ? 'D' : 'C') . $sep; + print ($mt <= 0 ? price(- $mt) : $mt) . $sep; + print $val["type_payment"] . $sep; + print $val["ref"] . $sep; + print "\n"; + } + } + } + else + { + foreach ( $tabbq[$key] as $k => $mt ) + { + if (1) + { + print $date . $sep; + print $bank_journal . $sep; + print $conf->global->ACCOUNTING_ACCOUNT_SUSPENSE . $sep; + print $sep; + print ($mt < 0 ? 'D' : 'C') . $sep; + print ($mt <= 0 ? price(- $mt) : $mt) . $sep; + print $val["type_payment"] . $sep; + print $val["ref"] . $sep; + print "\n"; } - print length_accounta(html_entity_decode($k)) . $sep; - print ($mt < 0 ? 'D' : 'C') . $sep; - print ($mt <= 0 ? price(- $mt) : $mt) . $sep; - print $val["type_payment"] . $sep; - print $val["ref"] . $sep; - print "\n"; } } } @@ -476,15 +500,35 @@ if ($action == 'export_csv') } // Third party - foreach ( $tabtp[$key] as $k => $mt ) { - if ($mt) { - print '"' . $date . '"' . $sep; - print '"' . $val["type_payment"] . '"' . $sep; - print '"' . length_accounta(html_entity_decode($k)) . '"' . $sep; - print '"' . $companystatic->name . '"' . $sep; - print '"' . ($mt < 0 ? price(- $mt) : '') . '"' . $sep; - print '"' . ($mt >= 0 ? price($mt) : '') . '"'; - print "\n"; + if (is_array ( $tabtp[$key])) + { + foreach ( $tabtp[$key] as $k => $mt ) + { + if ($mt) { + print '"' . $date . '"' . $sep; + print '"' . $val["type_payment"] . '"' . $sep; + print '"' . length_accounta(html_entity_decode($k)) . '"' . $sep; + print '"' . $companystatic->name . '"' . $sep; + print '"' . ($mt < 0 ? price(- $mt) : '') . '"' . $sep; + print '"' . ($mt >= 0 ? price($mt) : '') . '"'; + print "\n"; + } + } + } + else + { + foreach ( $tabbq[$key] as $k => $mt ) + { + if (1) + { + print '"' . $date . '"' . $sep; + print '"' . $val["ref"] . '"' . $sep; + print '"' . $conf->global->ACCOUNTING_ACCOUNT_SUSPENSE . '"' . $sep; + print '"' . $langs->trans("Bank") . '"' . $sep; + print '"' . ($mt < 0 ? price(- $mt) : '') . '"' . $sep; + print '"' . ($mt >= 0 ? price($mt) : '') . '"'; + print "\n"; + } } } } @@ -498,14 +542,54 @@ else llxHeader('', $langs->trans("BankJournal")); $namereport = $langs->trans("BankJournal"); - $namelink = ''; - $periodlink = ''; - $exportlink = ''; - $builddate = time(); - $description = $langs->trans("DescBankJournal") . '
'; + $description = $langs->trans("DescBankJournal"); $period = $form->select_date($date_start, 'date_start', 0, 0, 0, '', 1, 0, 1) . ' - ' . $form->select_date($date_end, 'date_end', 0, 0, 0, '', 1, 0, 1); - report_header($namereport, $namelink, $period, $periodlink, $description, $builddate, $exportlink, array('action' => '')); + // Report + $h=0; + $head[$h][0] = $_SERVER["PHP_SELF"].'?id_account='.$id_accountancy_journal; + $head[$h][1] = $langs->trans("Report"); + $head[$h][2] = 'report'; + + dol_fiche_head($head, $hselected); + + print ''; + print ''; + + // Title + print ''; + print ''; + print ''; + print ''; + print ''; + + // Period report + print ''; + print ''; + if (! $periodlink) print ''; + print ''; + + // Description + print ''; + print ''; + print ''; + print ''; + + print ''; + print ''; + print ''; + + print '
'.$langs->trans("ReportName").''.$namereport.'
'.$langs->trans("ReportPeriod").''; + else print ''; + if ($period) print $period; + if ($periodlink) print ''.$periodlink; + print '
'.$langs->trans("ReportDescription").''.$description.'
'; + + print ''; + + print ''; + // End report + print ''; print ''; @@ -565,20 +649,36 @@ else } // Third party - foreach ( $tabtp[$key] as $k => $mt ) { - if ($k != 'type') { + if (is_array ( $tabtp[$key])) + { + foreach ( $tabtp[$key] as $k => $mt ) { + if ($k != 'type') { + print "
" . $date . "" . $val["soclib"] . "" . length_accounta($k) . "" . $langs->trans('ThirdParty') . " (" . $val['soclib'] . ")" . $val["type_payment"] . "" . ($mt < 0 ? price(- $mt) : '') . "" . ($mt >= 0 ? price($mt) : '') . "
" . $date . "" . $val["soclib"] . "" . length_accounta($k) . "" . $langs->trans('ThirdParty') . " (" . $val['soclib'] . ")" . $val["type_payment"] . "" . $reflabel . "" . $conf->global->ACCOUNTING_ACCOUNT_SUSPENSE . "" . $langs->trans('ThirdParty') . "" . ($mt < 0 ? price(- $mt) : '') . "" . ($mt >= 0 ? price($mt) : '') . "
'; + print $langs->trans('DateDeliveryPlanned'); + print ''; + $usehourmin=0; + if (! empty($conf->global->SUPPLIER_ORDER_USE_HOUR_FOR_DELIVERY_DATE)) $usehourmin=1; + $form->select_date($datelivraison?$datelivraison:-1,'liv_',$usehourmin,$usehourmin,'',"set"); + print '
'; print $langs->trans('IncotermLabel'); print ''; - if ($user->rights->commande->creer) print ''.img_edit().''; + if ($user->rights->propal->creer) print ''.img_edit().''; else print ' '; print '
'; print '
'; + print $form->select_incoterms((!empty($objectsrc->fk_incoterms) ? $objectsrc->fk_incoterms : ''), (!empty($objectsrc->location_incoterms)?$objectsrc->location_incoterms:'')); + print '
'; + print '
'; + print $langs->trans('IncotermLabel'); + print ''; + if ($user->rights->facture->creer) print ''.img_edit().''; + else print ' '; + print '
'; + print '
'; + if ($action != 'editincoterm') + { + print $form->textwithpicto($object->display_incoterms(), $object->libelle_incoterms, 1); + } + else + { + print $form->select_incoterms((!empty($object->fk_incoterms) ? $object->fk_incoterms : ''), (!empty($object->location_incoterms)?$object->location_incoterms:''), $_SERVER['PHP_SELF'].'?id='.$object->id); + } + print '
'; + print $form->select_incoterms((!empty($object->fk_incoterms) ? $object->fk_incoterms : ''), (!empty($object->location_incoterms)?$object->location_incoterms:'')); + print '
'; + print '
'; + print $langs->trans('IncotermLabel'); + print ''; + if ($user->rights->expedition->creer) print ''.img_edit().''; + else print ' '; + print '
'; + print '
'; + if ($action != 'editincoterm') + { + print $form->textwithpicto($object->display_incoterms(), $object->libelle_incoterms, 1); + } + else + { + print $form->select_incoterms((!empty($object->fk_incoterms) ? $object->fk_incoterms : ''), (!empty($object->location_incoterms)?$object->location_incoterms:''), $_SERVER['PHP_SELF'].'?id='.$object->id); + } + print '
'; + print $form->select_incoterms((!empty($object->fk_incoterms) ? $object->fk_incoterms : ''), (!empty($object->location_incoterms)?$object->location_incoterms:'')); + print '
'.$langs->trans('NotePublic').''; $doleditor = new DolEditor('note_public', GETPOST('note_public'), '', 80, 'dolibarr_notes', 'In', 0, false, true, ROWS_3, 70); @@ -1624,7 +1643,30 @@ elseif (! empty($object->id)) print '
'; + print '
'; + print $langs->trans('IncotermLabel'); + print ''; + if ($user->rights->fournisseur->commande->creer) print ''.img_edit().''; + else print ' '; + print '
'; + print '
'; + if ($action != 'editincoterm') + { + print $form->textwithpicto($object->display_incoterms(), $object->libelle_incoterms, 1); + } + else + { + print $form->select_incoterms((!empty($object->fk_incoterms) ? $object->fk_incoterms : ''), (!empty($object->location_incoterms)?$object->location_incoterms:''), $_SERVER['PHP_SELF'].'?id='.$object->id); + } + print '
'; + print $form->select_incoterms((!empty($objectsrc->fk_incoterms) ? $objectsrc->fk_incoterms : ''), (!empty($objectsrc->location_incoterms)?$objectsrc->location_incoterms:'')); + print '
'.$langs->trans('BankAccount').''; @@ -1950,6 +1969,29 @@ else print '
'; + print '
'; + print $langs->trans('IncotermLabel'); + print ''; + if ($user->rights->fournisseur->facture->creer) print ''.img_edit().''; + else print ' '; + print '
'; + print '
'; + if ($action != 'editincoterm') + { + print $form->textwithpicto($object->display_incoterms(), $object->libelle_incoterms, 1); + } + else + { + print $form->select_incoterms((!empty($object->fk_incoterms) ? $object->fk_incoterms : ''), (!empty($object->location_incoterms)?$object->location_incoterms:''), $_SERVER['PHP_SELF'].'?id='.$object->id); + } + print '
'; + print '
'; + print $langs->trans('IncotermLabel'); + print ''; + if ($user->rights->expedition->livraison->creer) print ''.img_edit().''; + else print ' '; + print '
'; + print '
'; + if ($action != 'editincoterm') + { + print $form->textwithpicto($object->display_incoterms(), $object->libelle_incoterms, 1); + } + else + { + print $form->select_incoterms((!empty($object->fk_incoterms) ? $object->fk_incoterms : ''), (!empty($object->location_incoterms)?$object->location_incoterms:''), $_SERVER['PHP_SELF'].'?id='.$object->id); + } + print '
'.$langs->trans("NotePublic").''; diff --git a/htdocs/livraison/class/livraison.class.php b/htdocs/livraison/class/livraison.class.php index e12781d5228..f1e9e3d6ca6 100644 --- a/htdocs/livraison/class/livraison.class.php +++ b/htdocs/livraison/class/livraison.class.php @@ -60,6 +60,10 @@ class Livraison extends CommonObject var $date_valid; var $model_pdf; + //Incorterms + var $fk_incoterms; + var $location_incoterms; + var $libelle_incoterms; //Used into tooltip /** * Constructor @@ -115,6 +119,7 @@ class Livraison extends CommonObject $sql.= ", note_private"; $sql.= ", note_public"; $sql.= ", model_pdf"; + $sql.= ", fk_incoterms, location_incoterms"; $sql.= ") VALUES ("; $sql.= "'(PROV)'"; $sql.= ", ".$conf->entity; @@ -127,6 +132,8 @@ class Livraison extends CommonObject $sql.= ", ".(!empty($this->note_private)?"'".$this->db->escape($this->note_private)."'":"null"); $sql.= ", ".(!empty($this->note_public)?"'".$this->db->escape($this->note_public)."'":"null"); $sql.= ", ".(!empty($this->model_pdf)?"'".$this->db->escape($this->model_pdf)."'":"null"); + $sql.= ", ".(int) $this->fk_incoterms; + $sql.= ", '".$this->db->escape($this->location_incoterms)."'"; $sql.= ")"; dol_syslog("Livraison::create", LOG_DEBUG); @@ -265,8 +272,11 @@ class Livraison extends CommonObject $sql.=" l.total_ht, l.fk_statut, l.fk_user_valid, l.note_private, l.note_public"; $sql.= ", l.date_delivery, l.fk_address, l.model_pdf"; $sql.= ", el.fk_source as origin_id, el.sourcetype as origin"; + $sql.= ', l.fk_incoterms, l.location_incoterms'; + $sql.= ", i.libelle as libelle_incoterms"; $sql.= " FROM ".MAIN_DB_PREFIX."livraison as l"; $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."element_element as el ON el.fk_target = l.rowid AND el.targettype = '".$this->element."'"; + $sql.= ' LEFT JOIN '.MAIN_DB_PREFIX.'c_incoterms as i ON l.fk_incoterms = i.rowid'; $sql.= " WHERE l.rowid = ".$id; dol_syslog(get_class($this)."::fetch", LOG_DEBUG); @@ -295,6 +305,10 @@ class Livraison extends CommonObject $this->origin = $obj->origin; // May be 'shipping' $this->origin_id = $obj->origin_id; // May be id of shipping + //Incoterms + $this->fk_incoterms = $obj->fk_incoterms; + $this->location_incoterms = $obj->location_incoterms; + $this->libelle_incoterms = $obj->libelle_incoterms; $this->db->free($result); if ($this->statut == 0) $this->brouillon = 1; @@ -514,6 +528,10 @@ class Livraison extends CommonObject $this->fk_delivery_address = $expedition->fk_delivery_address; $this->socid = $expedition->socid; $this->ref_customer = $expedition->ref_customer; + + //Incoterms + $this->fk_incoterms = $expedition->fk_incoterms; + $this->location_incoterms = $expedition->location_incoterms; return $this->create($user); } From c45979499949cee7cff50b74c01b3684017f6ade Mon Sep 17 00:00:00 2001 From: phf Date: Mon, 23 Feb 2015 10:36:44 +0100 Subject: [PATCH 125/287] =?UTF-8?q?[CORE]=20gestion=20de=20l'affichage=20d?= =?UTF-8?q?e=20l'incoterm=20sur=20les=20diff=C3=A9rents=20PDF=20de=20base?= =?UTF-8?q?=20(#incoterm).?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- htdocs/comm/propal.php | 2 +- htdocs/core/class/commonobject.class.php | 22 +++++++++++++++- .../commande/doc/pdf_einstein.modules.php | 25 ++++++++++++++++++- .../expedition/doc/pdf_rouget.modules.php | 25 ++++++++++++++++++- .../modules/facture/doc/pdf_crabe.modules.php | 25 ++++++++++++++++++- .../livraison/doc/pdf_typhon.modules.php | 25 ++++++++++++++++++- .../modules/propale/doc/pdf_azur.modules.php | 25 ++++++++++++++++++- .../pdf/pdf_canelle.modules.php | 25 ++++++++++++++++++- .../pdf/pdf_muscadet.modules.php | 25 ++++++++++++++++++- 9 files changed, 190 insertions(+), 9 deletions(-) diff --git a/htdocs/comm/propal.php b/htdocs/comm/propal.php index 57ac3a8bbcd..6132c69c5bb 100644 --- a/htdocs/comm/propal.php +++ b/htdocs/comm/propal.php @@ -998,7 +998,7 @@ if (empty($reshook)) if (GETPOST('model')) { $object->setDocModel($user, GETPOST('model')); } - + // Define output language $outputlangs = $langs; if (! empty($conf->global->MAIN_MULTILANGS)) { diff --git a/htdocs/core/class/commonobject.class.php b/htdocs/core/class/commonobject.class.php index 5f2a3db5fae..8490a5bbe4e 100644 --- a/htdocs/core/class/commonobject.class.php +++ b/htdocs/core/class/commonobject.class.php @@ -2380,7 +2380,7 @@ abstract class CommonObject /** * Return incoterms informations * - * @return string Bank number + * @return string incoterms info */ function display_incoterms() { @@ -2402,6 +2402,26 @@ abstract class CommonObject return $out; } + /** + * Return incoterms informations for pdf display + * + * @return string incoterms info + */ + function getIncotermsForPDF() + { + $sql = 'SELECT code FROM '.MAIN_DB_PREFIX.'c_incoterms WHERE rowid = '.(int)$this->fk_incoterms; + $resql = $this->db->query($sql); + if ($resql) + { + $res = $this->db->fetch_object($resql); + return 'Incoterm : '.$res->code.' - '.$this->location_incoterms; + } + else + { + return false; + } + } + /** * Define incoterms values of current object * diff --git a/htdocs/core/modules/commande/doc/pdf_einstein.modules.php b/htdocs/core/modules/commande/doc/pdf_einstein.modules.php index 510a1bd88a1..f48632a89ce 100644 --- a/htdocs/core/modules/commande/doc/pdf_einstein.modules.php +++ b/htdocs/core/modules/commande/doc/pdf_einstein.modules.php @@ -264,6 +264,29 @@ class pdf_einstein extends ModelePDFCommandes $tab_height = 130; $tab_height_newpage = 150; + // Incoterm + $height_incoterms = 0; + if ($conf->incoterm->enabled) + { + $desc_incoterms = $object->getIncotermsForPDF(); + if ($desc_incoterms) + { + $tab_top = 88; + + $pdf->SetFont('','', $default_font_size - 1); + $pdf->writeHTMLCell(190, 3, $this->posxdesc-1, $tab_top-1, dol_htmlentitiesbr($desc_incoterms), 0, 1); + $nexY = $pdf->GetY(); + $height_incoterms=$nexY-$tab_top; + + // Rect prend une longueur en 3eme param + $pdf->SetDrawColor(192,192,192); + $pdf->Rect($this->marge_gauche, $tab_top-1, $this->page_largeur-$this->marge_gauche-$this->marge_droite, $height_incoterms+1); + + $tab_top = $nexY+6; + $height_incoterms += 4; + } + } + // Affiche notes $notetoshow=empty($object->note_public)?'':$object->note_public; if (! empty($conf->global->MAIN_ADD_SALE_REP_SIGNATURE_IN_NOTE)) @@ -279,7 +302,7 @@ class pdf_einstein extends ModelePDFCommandes } if ($notetoshow) { - $tab_top = 88; + $tab_top = 88 + $height_incoterms; $pdf->SetFont('','', $default_font_size - 1); $pdf->writeHTMLCell(190, 3, $this->posxdesc-1, $tab_top, dol_htmlentitiesbr($notetoshow), 0, 1); diff --git a/htdocs/core/modules/expedition/doc/pdf_rouget.modules.php b/htdocs/core/modules/expedition/doc/pdf_rouget.modules.php index 9c5dada3a72..6982fc0c6cc 100644 --- a/htdocs/core/modules/expedition/doc/pdf_rouget.modules.php +++ b/htdocs/core/modules/expedition/doc/pdf_rouget.modules.php @@ -191,9 +191,32 @@ class pdf_rouget extends ModelePdfExpedition $tab_height = 130; $tab_height_newpage = 150; + // Incoterm + $height_incoterms = 0; + if ($conf->incoterm->enabled) + { + $desc_incoterms = $object->getIncotermsForPDF(); + if ($desc_incoterms) + { + $tab_top = 88; + + $pdf->SetFont('','', $default_font_size - 1); + $pdf->writeHTMLCell(190, 3, $this->posxdesc-1, $tab_top-1, dol_htmlentitiesbr($desc_incoterms), 0, 1); + $nexY = $pdf->GetY(); + $height_incoterms=$nexY-$tab_top; + + // Rect prend une longueur en 3eme param + $pdf->SetDrawColor(192,192,192); + $pdf->Rect($this->marge_gauche, $tab_top-1, $this->page_largeur-$this->marge_gauche-$this->marge_droite, $height_incoterms+1); + + $tab_top = $nexY+6; + $height_incoterms += 4; + } + } + if (! empty($object->note_public) || ! empty($object->tracking_number)) { - $tab_top = 88; + $tab_top = 88 + $height_incoterms; $tab_top_alt = $tab_top; $pdf->SetFont('','B', $default_font_size - 2); diff --git a/htdocs/core/modules/facture/doc/pdf_crabe.modules.php b/htdocs/core/modules/facture/doc/pdf_crabe.modules.php index 06c3df85f4d..62d72ee49d2 100644 --- a/htdocs/core/modules/facture/doc/pdf_crabe.modules.php +++ b/htdocs/core/modules/facture/doc/pdf_crabe.modules.php @@ -318,6 +318,29 @@ class pdf_crabe extends ModelePDFFactures $tab_height = 130; $tab_height_newpage = 150; + // Incoterm + $height_incoterms = 0; + if ($conf->incoterm->enabled) + { + $desc_incoterms = $object->getIncotermsForPDF(); + if ($desc_incoterms) + { + $tab_top = 88; + + $pdf->SetFont('','', $default_font_size - 1); + $pdf->writeHTMLCell(190, 3, $this->posxdesc-1, $tab_top-1, dol_htmlentitiesbr($desc_incoterms), 0, 1); + $nexY = $pdf->GetY(); + $height_incoterms=$nexY-$tab_top; + + // Rect prend une longueur en 3eme param + $pdf->SetDrawColor(192,192,192); + $pdf->Rect($this->marge_gauche, $tab_top-1, $this->page_largeur-$this->marge_gauche-$this->marge_droite, $height_incoterms+1); + + $tab_top = $nexY+6; + $height_incoterms += 4; + } + } + // Affiche notes $notetoshow=empty($object->note_public)?'':$object->note_public; if (! empty($conf->global->MAIN_ADD_SALE_REP_SIGNATURE_IN_NOTE)) @@ -333,7 +356,7 @@ class pdf_crabe extends ModelePDFFactures } if ($notetoshow) { - $tab_top = 88; + $tab_top = 88 + $height_incoterms; $pdf->SetFont('','', $default_font_size - 1); $pdf->writeHTMLCell(190, 3, $this->posxdesc-1, $tab_top, dol_htmlentitiesbr($notetoshow), 0, 1); diff --git a/htdocs/core/modules/livraison/doc/pdf_typhon.modules.php b/htdocs/core/modules/livraison/doc/pdf_typhon.modules.php index e3e9be99411..e2dc1f2376e 100644 --- a/htdocs/core/modules/livraison/doc/pdf_typhon.modules.php +++ b/htdocs/core/modules/livraison/doc/pdf_typhon.modules.php @@ -269,10 +269,33 @@ class pdf_typhon extends ModelePDFDeliveryOrder $tab_height = 130; $tab_height_newpage = 150; + // Incoterm + $height_incoterms = 0; + if ($conf->incoterm->enabled) + { + $desc_incoterms = $object->getIncotermsForPDF(); + if ($desc_incoterms) + { + $tab_top = 88; + + $pdf->SetFont('','', $default_font_size - 1); + $pdf->writeHTMLCell(190, 3, $this->posxdesc-1, $tab_top-1, dol_htmlentitiesbr($desc_incoterms), 0, 1); + $nexY = $pdf->GetY(); + $height_incoterms=$nexY-$tab_top; + + // Rect prend une longueur en 3eme param + $pdf->SetDrawColor(192,192,192); + $pdf->Rect($this->marge_gauche, $tab_top-1, $this->page_largeur-$this->marge_gauche-$this->marge_droite, $height_incoterms+1); + + $tab_top = $nexY+6; + $height_incoterms += 4; + } + } + // Affiche notes if (! empty($object->note_public)) { - $tab_top = 88; + $tab_top = 88 + $height_incoterms; $pdf->SetFont('','', $default_font_size - 1); $pdf->writeHTMLCell(190, 3, $this->posxdesc-1, $tab_top, dol_htmlentitiesbr($object->note_public), 0, 1); diff --git a/htdocs/core/modules/propale/doc/pdf_azur.modules.php b/htdocs/core/modules/propale/doc/pdf_azur.modules.php index 35953b8521f..b3ff4710f1b 100644 --- a/htdocs/core/modules/propale/doc/pdf_azur.modules.php +++ b/htdocs/core/modules/propale/doc/pdf_azur.modules.php @@ -288,6 +288,29 @@ class pdf_azur extends ModelePDFPropales $tab_top_newpage = (empty($conf->global->MAIN_PDF_DONOTREPEAT_HEAD)?42:10); $tab_height = 130; $tab_height_newpage = 150; + + // Incoterm + $height_incoterms = 0; + if ($conf->incoterm->enabled) + { + $desc_incoterms = $object->getIncotermsForPDF(); + if ($desc_incoterms) + { + $tab_top = 88; + + $pdf->SetFont('','', $default_font_size - 1); + $pdf->writeHTMLCell(190, 3, $this->posxdesc-1, $tab_top-1, dol_htmlentitiesbr($desc_incoterms), 0, 1); + $nexY = $pdf->GetY(); + $height_incoterms=$nexY-$tab_top; + + // Rect prend une longueur en 3eme param + $pdf->SetDrawColor(192,192,192); + $pdf->Rect($this->marge_gauche, $tab_top-1, $this->page_largeur-$this->marge_gauche-$this->marge_droite, $height_incoterms+1); + + $tab_top = $nexY+6; + $height_incoterms += 4; + } + } // Affiche notes $notetoshow=empty($object->note_public)?'':$object->note_public; @@ -304,7 +327,7 @@ class pdf_azur extends ModelePDFPropales } if ($notetoshow) { - $tab_top = 88; + $tab_top = 88 + $height_incoterms; $pdf->SetFont('','', $default_font_size - 1); $pdf->writeHTMLCell(190, 3, $this->posxdesc-1, $tab_top, dol_htmlentitiesbr($notetoshow), 0, 1); diff --git a/htdocs/core/modules/supplier_invoice/pdf/pdf_canelle.modules.php b/htdocs/core/modules/supplier_invoice/pdf/pdf_canelle.modules.php index d100a45b828..78d7f42fab2 100644 --- a/htdocs/core/modules/supplier_invoice/pdf/pdf_canelle.modules.php +++ b/htdocs/core/modules/supplier_invoice/pdf/pdf_canelle.modules.php @@ -261,10 +261,33 @@ class pdf_canelle extends ModelePDFSuppliersInvoices $tab_height = 130; $tab_height_newpage = 150; + // Incoterm + $height_incoterms = 0; + if ($conf->incoterm->enabled) + { + $desc_incoterms = $object->getIncotermsForPDF(); + if ($desc_incoterms) + { + $tab_top = 88; + + $pdf->SetFont('','', $default_font_size - 1); + $pdf->writeHTMLCell(190, 3, $this->posxdesc-1, $tab_top-1, dol_htmlentitiesbr($desc_incoterms), 0, 1); + $nexY = $pdf->GetY(); + $height_incoterms=$nexY-$tab_top; + + // Rect prend une longueur en 3eme param + $pdf->SetDrawColor(192,192,192); + $pdf->Rect($this->marge_gauche, $tab_top-1, $this->page_largeur-$this->marge_gauche-$this->marge_droite, $height_incoterms+1); + + $tab_top = $nexY+6; + $height_incoterms += 4; + } + } + // Affiche notes if (! empty($object->note_public)) { - $tab_top = 88; + $tab_top = 88 + $height_incoterms; $pdf->SetFont('','', $default_font_size - 1); $pdf->writeHTMLCell(190, 3, $this->posxdesc-1, $tab_top, dol_htmlentitiesbr($object->note_public), 0, 1); diff --git a/htdocs/core/modules/supplier_order/pdf/pdf_muscadet.modules.php b/htdocs/core/modules/supplier_order/pdf/pdf_muscadet.modules.php index b26b540e5b1..e75475b1dca 100644 --- a/htdocs/core/modules/supplier_order/pdf/pdf_muscadet.modules.php +++ b/htdocs/core/modules/supplier_order/pdf/pdf_muscadet.modules.php @@ -269,10 +269,33 @@ class pdf_muscadet extends ModelePDFSuppliersOrders $tab_height = 130; $tab_height_newpage = 150; + // Incoterm + $height_incoterms = 0; + if ($conf->incoterm->enabled) + { + $desc_incoterms = $object->getIncotermsForPDF(); + if ($desc_incoterms) + { + $tab_top = 88; + + $pdf->SetFont('','', $default_font_size - 1); + $pdf->writeHTMLCell(190, 3, $this->posxdesc-1, $tab_top-1, dol_htmlentitiesbr($desc_incoterms), 0, 1); + $nexY = $pdf->GetY(); + $height_incoterms=$nexY-$tab_top; + + // Rect prend une longueur en 3eme param + $pdf->SetDrawColor(192,192,192); + $pdf->Rect($this->marge_gauche, $tab_top-1, $this->page_largeur-$this->marge_gauche-$this->marge_droite, $height_incoterms+1); + + $tab_top = $nexY+6; + $height_incoterms += 4; + } + } + // Affiche notes if (! empty($object->note_public)) { - $tab_top = 88; + $tab_top = 88 + $height_incoterms; $pdf->SetFont('','', $default_font_size - 1); $pdf->writeHTMLCell(190, 3, $this->posxdesc-1, $tab_top, dol_htmlentitiesbr($object->note_public), 0, 1); From 102d2d9d36c1202d3b3561e0d2f86e54cb2b4cdd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcos=20Garci=CC=81a=20de=20La=20Fuente?= Date: Mon, 23 Feb 2015 10:39:02 +0100 Subject: [PATCH 126/287] Added IE11 test to testGetBrowserInfo --- test/phpunit/FunctionsLibTest.php | 40 ++++++++++++++++++------------- 1 file changed, 24 insertions(+), 16 deletions(-) diff --git a/test/phpunit/FunctionsLibTest.php b/test/phpunit/FunctionsLibTest.php index 0c3995bc7b5..aaaa46527eb 100755 --- a/test/phpunit/FunctionsLibTest.php +++ b/test/phpunit/FunctionsLibTest.php @@ -26,20 +26,20 @@ global $conf,$user,$langs,$db; //define('TEST_DB_FORCE_TYPE','mysql'); // This is to force using mysql driver //require_once 'PHPUnit/Autoload.php'; -require_once dirname(__FILE__).'/../../htdocs/master.inc.php'; -require_once dirname(__FILE__).'/../../htdocs/core/lib/date.lib.php'; - -if (! defined('NOREQUIREUSER')) define('NOREQUIREUSER','1'); -if (! defined('NOREQUIREDB')) define('NOREQUIREDB','1'); -if (! defined('NOREQUIRESOC')) define('NOREQUIRESOC','1'); -if (! defined('NOREQUIRETRAN')) define('NOREQUIRETRAN','1'); -if (! defined('NOCSRFCHECK')) define('NOCSRFCHECK','1'); -if (! defined('NOTOKENRENEWAL')) define('NOTOKENRENEWAL','1'); -if (! defined('NOREQUIREMENU')) define('NOREQUIREMENU','1'); // If there is no menu to show -if (! defined('NOREQUIREHTML')) define('NOREQUIREHTML','1'); // If we don't need to load the html.form.class.php -if (! defined('NOREQUIREAJAX')) define('NOREQUIREAJAX','1'); -if (! defined("NOLOGIN")) define("NOLOGIN",'1'); // If this page is public (can be called outside logged session) - +//require_once dirname(__FILE__).'/../../htdocs/master.inc.php'; +//require_once dirname(__FILE__).'/../../htdocs/core/lib/date.lib.php'; +// +//if (! defined('NOREQUIREUSER')) define('NOREQUIREUSER','1'); +//if (! defined('NOREQUIREDB')) define('NOREQUIREDB','1'); +//if (! defined('NOREQUIRESOC')) define('NOREQUIRESOC','1'); +//if (! defined('NOREQUIRETRAN')) define('NOREQUIRETRAN','1'); +//if (! defined('NOCSRFCHECK')) define('NOCSRFCHECK','1'); +//if (! defined('NOTOKENRENEWAL')) define('NOTOKENRENEWAL','1'); +//if (! defined('NOREQUIREMENU')) define('NOREQUIREMENU','1'); // If there is no menu to show +//if (! defined('NOREQUIREHTML')) define('NOREQUIREHTML','1'); // If we don't need to load the html.form.class.php +//if (! defined('NOREQUIREAJAX')) define('NOREQUIREAJAX','1'); +//if (! defined("NOLOGIN")) define("NOLOGIN",'1'); // If this page is public (can be called outside logged session) +require_once dirname(__FILE__).'/../../htdocs/core/lib/functions.lib.php'; /** * Class for PHPUnit tests @@ -126,12 +126,14 @@ class FunctionsLibTest extends PHPUnit_Framework_TestCase */ public function testGetBrowserInfo() { - $user_agent ='Mozilla/4.0 (compatible; MSIE 5.0; Windows 98; DigExt; KITV4 Wanadoo; KITV5 Wanadoo)'; // MSIE 5.0 + // MSIE 5.0 + $user_agent ='Mozilla/4.0 (compatible; MSIE 5.0; Windows 98; DigExt; KITV4 Wanadoo; KITV5 Wanadoo)'; $tmp=getBrowserInfo($user_agent); $this->assertEquals('ie',$tmp['browsername']); $this->assertEquals('5.0',$tmp['browserversion']); - $user_agent ='Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.5a) Gecko/20030728 Mozilla Firefox/0.9.1'; // Firefox 0.9.1 + // Firefox 0.9.1 + $user_agent ='Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.5a) Gecko/20030728 Mozilla Firefox/0.9.1'; $tmp=getBrowserInfo($user_agent); $this->assertEquals('firefox',$tmp['browsername']); $this->assertEquals('0.9.1',$tmp['browserversion']); @@ -155,6 +157,12 @@ class FunctionsLibTest extends PHPUnit_Framework_TestCase $tmp=getBrowserInfo($user_agent); $this->assertEquals('safari',$tmp['browsername']); $this->assertEquals('533.21.1',$tmp['browserversion']); + + //Internet Explorer 11 + $user_agent = 'Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko'; + $tmp=getBrowserInfo($user_agent); + $this->assertEquals('ie',$tmp['browsername']); + $this->assertEquals('11.0',$tmp['browserversion']); } From 71b98ee82b178cd4af80d7e5816503c7dfbea045 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcos=20Garci=CC=81a=20de=20La=20Fuente?= Date: Mon, 23 Feb 2015 10:42:10 +0100 Subject: [PATCH 127/287] Safari can appear in iPad, iPod, iPhone and future Apple products, it is not fair to attach it to one of them. --- htdocs/core/lib/functions.lib.php | 3 +-- test/phpunit/FunctionsLibTest.php | 6 ++++++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php index fc261bd4290..542763c7065 100644 --- a/htdocs/core/lib/functions.lib.php +++ b/htdocs/core/lib/functions.lib.php @@ -165,8 +165,7 @@ function getBrowserInfo($user_agent) elseif (preg_match('/chrome/i', $user_agent, $reg)) { $name='chrome'; } elseif (preg_match('/iceweasel/i', $user_agent)) { $name='iceweasel'; $version=$reg[2]; } elseif (preg_match('/epiphany/i', $user_agent)) { $name='epiphany'; $version=$reg[2]; } - elseif ((empty($phone) || preg_match('/iphone/i', $user_agent)) && preg_match('/safari(\/|\s)([\d\.]*)/i', - $user_agent, $reg)) { $name='safari'; $version=$reg[2]; } // Safari is often present in string for mobile but its not. + elseif (preg_match('/safari(\/|\s)([\d\.]*)/i', $user_agent, $reg)) { $name='safari'; $version=$reg[2]; } // Safari is often present in string for mobile but its not. elseif (preg_match('/opera(\/|\s)([\d\.]*)/i', $user_agent, $reg)) { $name='opera'; $version=$reg[2]; } elseif (preg_match('/msie(\/|\s)([\d\.]*)/i', $user_agent, $reg)) { $name='ie'; $version=$reg[2]; } // MS products at end diff --git a/test/phpunit/FunctionsLibTest.php b/test/phpunit/FunctionsLibTest.php index aaaa46527eb..fd62a4f345f 100755 --- a/test/phpunit/FunctionsLibTest.php +++ b/test/phpunit/FunctionsLibTest.php @@ -163,6 +163,12 @@ class FunctionsLibTest extends PHPUnit_Framework_TestCase $tmp=getBrowserInfo($user_agent); $this->assertEquals('ie',$tmp['browsername']); $this->assertEquals('11.0',$tmp['browserversion']); + + //iPad + $user_agent = 'Mozilla/5.0 (iPad; CPU OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A5355d Safari/8536.25'; + $tmp=getBrowserInfo($user_agent); + $this->assertEquals('ie',$tmp['browsername']); + $this->assertEquals('11.0',$tmp['browserversion']); } From 52441914dee1fc47a879a5147a0f8f0e9b439d18 Mon Sep 17 00:00:00 2001 From: phf Date: Mon, 23 Feb 2015 10:42:34 +0100 Subject: [PATCH 128/287] =?UTF-8?q?Vas=20avec=20le=20merge=20pr=C3=A9c?= =?UTF-8?q?=C3=A9dent?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- htdocs/commande/class/commande.class.php | 4 ---- 1 file changed, 4 deletions(-) diff --git a/htdocs/commande/class/commande.class.php b/htdocs/commande/class/commande.class.php index 189911c0e77..2246ceaa690 100644 --- a/htdocs/commande/class/commande.class.php +++ b/htdocs/commande/class/commande.class.php @@ -106,10 +106,6 @@ class Commande extends CommonOrder var $lines = array(); - // Pour board - var $nbtodo; - var $nbtodolate; - //Incorterms var $fk_incoterms; var $location_incoterms; From abda67adc2b61eead780b2d4ce64ce93ae9c4f12 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcos=20Garci=CC=81a=20de=20La=20Fuente?= Date: Mon, 23 Feb 2015 10:45:22 +0100 Subject: [PATCH 129/287] Improved testGetBrowserInfo --- test/phpunit/FunctionsLibTest.php | 29 +++++++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/test/phpunit/FunctionsLibTest.php b/test/phpunit/FunctionsLibTest.php index fd62a4f345f..65a97881a78 100755 --- a/test/phpunit/FunctionsLibTest.php +++ b/test/phpunit/FunctionsLibTest.php @@ -131,44 +131,69 @@ class FunctionsLibTest extends PHPUnit_Framework_TestCase $tmp=getBrowserInfo($user_agent); $this->assertEquals('ie',$tmp['browsername']); $this->assertEquals('5.0',$tmp['browserversion']); + $this->assertFalse($tmp['phone']); + $this->assertFalse($tmp['tablet']); + $this->assertEquals('classic', $tmp['layout']); // Firefox 0.9.1 $user_agent ='Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.5a) Gecko/20030728 Mozilla Firefox/0.9.1'; $tmp=getBrowserInfo($user_agent); $this->assertEquals('firefox',$tmp['browsername']); $this->assertEquals('0.9.1',$tmp['browserversion']); + $this->assertFalse($tmp['phone']); + $this->assertFalse($tmp['tablet']); + $this->assertEquals('classic', $tmp['layout']); $user_agent ='Mozilla/3.0 (Windows 98; U) Opera 6.03 [en]'; $tmp=getBrowserInfo($user_agent); $this->assertEquals('opera',$tmp['browsername']); $this->assertEquals('6.03',$tmp['browserversion']); + $this->assertFalse($tmp['phone']); + $this->assertFalse($tmp['tablet']); + $this->assertEquals('classic', $tmp['layout']); $user_agent ='Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.21 (KHTML, like Gecko) Chrome/19.0.1042.0 Safari/535.21'; $tmp=getBrowserInfo($user_agent); $this->assertEquals('chrome',$tmp['browsername']); $this->assertEquals('19.0.1042.0',$tmp['browserversion']); + $this->assertFalse($tmp['phone']); + $this->assertFalse($tmp['tablet']); + $this->assertEquals('classic', $tmp['layout']); $user_agent ='chrome (Mozilla/5.0 (X11; Linux i686) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11)'; $tmp=getBrowserInfo($user_agent); $this->assertEquals('chrome',$tmp['browsername']); $this->assertEquals('17.0.963.56',$tmp['browserversion']); + $this->assertFalse($tmp['phone']); + $this->assertFalse($tmp['tablet']); + $this->assertEquals('classic', $tmp['layout']); $user_agent ='Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_8; de-at) AppleWebKit/533.21.1 (KHTML, like Gecko) Version/5.0.5 Safari/533.21.1'; $tmp=getBrowserInfo($user_agent); $this->assertEquals('safari',$tmp['browsername']); $this->assertEquals('533.21.1',$tmp['browserversion']); + $this->assertFalse($tmp['phone']); + $this->assertFalse($tmp['tablet']); + $this->assertEquals('classic', $tmp['layout']); //Internet Explorer 11 $user_agent = 'Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko'; $tmp=getBrowserInfo($user_agent); $this->assertEquals('ie',$tmp['browsername']); $this->assertEquals('11.0',$tmp['browserversion']); + $this->assertFalse($tmp['phone']); + $this->assertFalse($tmp['tablet']); + $this->assertEquals('classic', $tmp['layout']); //iPad $user_agent = 'Mozilla/5.0 (iPad; CPU OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A5355d Safari/8536.25'; $tmp=getBrowserInfo($user_agent); - $this->assertEquals('ie',$tmp['browsername']); - $this->assertEquals('11.0',$tmp['browserversion']); + $this->assertEquals('safari',$tmp['browsername']); + $this->assertEquals('8536.25',$tmp['browserversion']); + $this->assertEquals('ios',$tmp['browseros']); + $this->assertEquals('tablet',$tmp['layout']); + $this->assertEquals('iphone',$tmp['phone']); + $this->assertTrue($tmp['phone']); } From 7e07638fba33b28b97a43ab03005ca5019f65141 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcos=20Garci=CC=81a=20de=20La=20Fuente?= Date: Mon, 23 Feb 2015 10:51:43 +0100 Subject: [PATCH 130/287] Little refactor --- htdocs/core/lib/functions.lib.php | 29 ++++++++++++++++++----------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php index 542763c7065..85690ac7c12 100644 --- a/htdocs/core/lib/functions.lib.php +++ b/htdocs/core/lib/functions.lib.php @@ -135,24 +135,31 @@ function getBrowserInfo($user_agent) $name='unknown'; $version=''; $os='unknown'; + $phone = 'unknown'; $detectmobile = new MobileDetect(null, $user_agent); - $phone = ''; $tablet = $detectmobile->isTablet(); if ($detectmobile->isMobile()) { // If phone/smartphone, we set phone os name. - if ($detectmobile->is('AndroidOS')) { $os=$phone='android'; } - elseif ($detectmobile->is('BlackBerryOS')) { $os=$phone='blackberry'; } - elseif ($detectmobile->is('iOS')) { $os='ios'; $phone='iphone'; } - elseif ($detectmobile->is('PalmOS')) { $os=$phone='palm'; } - elseif ($detectmobile->is('SymbianOS')) { $os='symbian'; $phone='unknown'; } - elseif ($detectmobile->is('webOS')) { $os='webos'; $phone='unknown'; } - elseif ($detectmobile->is('MaemoOS')) { $os='maemo'; $phone='unknown'; } - // MS products at end - elseif ($detectmobile->is('WindowsMobileOS') || $detectmobile->is('WindowsPhoneOS')) { - $os='windows'; $phone='unkown'; + if ($detectmobile->is('AndroidOS')) { + $os = $phone = 'android'; + } elseif ($detectmobile->is('BlackBerryOS')) { + $os = $phone = 'blackberry'; + } elseif ($detectmobile->is('iOS')) { + $os = 'ios'; + $phone = 'iphone'; + } elseif ($detectmobile->is('PalmOS')) { + $os = $phone = 'palm'; + } elseif ($detectmobile->is('SymbianOS')) { + $os = 'symbian'; + } elseif ($detectmobile->is('webOS')) { + $os = 'webos'; + } elseif ($detectmobile->is('MaemoOS')) { + $os = 'maemo'; + } elseif ($detectmobile->is('WindowsMobileOS') || $detectmobile->is('WindowsPhoneOS')) { + $os = 'windows'; } } From 11a0624e393fddc1575022bc911acefa18b73f97 Mon Sep 17 00:00:00 2001 From: phf Date: Mon, 23 Feb 2015 11:19:00 +0100 Subject: [PATCH 131/287] [CORE] FIX Travis phpcs (#incoterm). --- htdocs/core/class/commonobject.class.php | 2 +- htdocs/core/class/html.form.class.php | 13 ++++++++----- htdocs/core/modules/modIncoterm.class.php | 2 -- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/htdocs/core/class/commonobject.class.php b/htdocs/core/class/commonobject.class.php index 5830c1d4041..28361a58c02 100644 --- a/htdocs/core/class/commonobject.class.php +++ b/htdocs/core/class/commonobject.class.php @@ -2418,7 +2418,7 @@ abstract class CommonObject */ function getIncotermsForPDF() { - $sql = 'SELECT code FROM '.MAIN_DB_PREFIX.'c_incoterms WHERE rowid = '.(int)$this->fk_incoterms; + $sql = 'SELECT code FROM '.MAIN_DB_PREFIX.'c_incoterms WHERE rowid = '.(int) $this->fk_incoterms; $resql = $this->db->query($sql); if ($resql) { diff --git a/htdocs/core/class/html.form.class.php b/htdocs/core/class/html.form.class.php index b4334814385..6473d8ea210 100644 --- a/htdocs/core/class/html.form.class.php +++ b/htdocs/core/class/html.form.class.php @@ -561,11 +561,14 @@ class Form /** * Return select list of incoterms * - * @param string $selected Id or Code of preselected incoterm - * @param string $htmlname Name of html select object - * @param string $htmloption Options html on select object - * @param string $maxlength Max length for labels (0=no limit) - * @return string HTML string with select + * @param string $selected Id or Code of preselected incoterm + * @param string $location_incoterms Value of input location + * @param string $page Defined the form action + * @param string $htmlname Name of html select object + * @param string $htmloption Options html on select object + * @param int $forcecombo Force to use combo box + * @param array $events Event options to run on change. Example: array(array('method'=>'getContacts', 'url'=>dol_buildpath('/core/ajax/contacts.php',1), 'htmlname'=>'contactid', 'params'=>array('add-customer-contact'=>'disabled'))) + * @return string HTML string with select and input */ function select_incoterms($selected='', $location_incoterms='', $page='',$htmlname='incoterm_id',$htmloption='', $forcecombo=0, $events=array()) { diff --git a/htdocs/core/modules/modIncoterm.class.php b/htdocs/core/modules/modIncoterm.class.php index 1d4f869b853..4501e0f174c 100644 --- a/htdocs/core/modules/modIncoterm.class.php +++ b/htdocs/core/modules/modIncoterm.class.php @@ -138,5 +138,3 @@ class modIncoterm extends DolibarrModules return $this->_remove($sql, $options); } } - -?> From ae8d090ebe4862ff037ccf64acc297d2b399d82f Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 23 Feb 2015 11:43:38 +0100 Subject: [PATCH 132/287] Fix No default filter by default, we miss data --- htdocs/projet/element.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/projet/element.php b/htdocs/projet/element.php index d43af94ee71..6860ff1479f 100644 --- a/htdocs/projet/element.php +++ b/htdocs/projet/element.php @@ -1,6 +1,6 @@ - * Copyright (C) 2004-2014 Laurent Destailleur + * Copyright (C) 2004-2015 Laurent Destailleur * Copyright (C) 2005-2010 Regis Houssin * Copyright (C) 2012 Juanjo Menent * @@ -57,7 +57,7 @@ $dates=dol_mktime(0, 0, 0, GETPOST('datesmonth'), GETPOST('datesday'), GETPOST(' $datee=dol_mktime(23, 59, 59, GETPOST('dateemonth'), GETPOST('dateeday'), GETPOST('dateeyear')); if (empty($dates) && ! empty($datesrfc)) $dates=dol_stringtotime($datesrfc); if (empty($datee) && ! empty($dateerfc)) $datee=dol_stringtotime($dateerfc); -if (! isset($_POST['datesrfc']) && ! isset($_POST['datesday'])) +if (! isset($_POST['datesrfc']) && ! isset($_POST['datesday']) && ! empty($conf->global->PROJECT_LINKED_ELEMENT_DEFAULT_FILTER_YEAR)) { $new=dol_now(); $tmp=dol_getdate($new); From 9eed66d9981d1fa840074e255a691b84829e2cae Mon Sep 17 00:00:00 2001 From: phf Date: Mon, 23 Feb 2015 11:46:39 +0100 Subject: [PATCH 133/287] [CORE] FIX : Travis phptest (#incoterm). --- htdocs/compta/facture/class/facture.class.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/htdocs/compta/facture/class/facture.class.php b/htdocs/compta/facture/class/facture.class.php index 2bfb0b6f4eb..fd5494ad4cd 100644 --- a/htdocs/compta/facture/class/facture.class.php +++ b/htdocs/compta/facture/class/facture.class.php @@ -3238,6 +3238,8 @@ class Facture extends CommonInvoice $this->note_public='This is a comment (public)'; $this->note_private='This is a comment (private)'; $this->note='This is a comment (private)'; + $this->fk_incoterms=0; + $this->location_incoterms=''; if (empty($option) || $option != 'nolines') { From 0c531215531b7b262034fbd30419021b2a758983 Mon Sep 17 00:00:00 2001 From: Alexis Algoud Date: Mon, 23 Feb 2015 12:19:19 +0100 Subject: [PATCH 134/287] - use incdec into virtual product definition. - improve screen of virtual product --- htdocs/langs/en_US/products.lang | 3 + htdocs/product/class/product.class.php | 49 +++++++++++- htdocs/product/composition/card.php | 75 +++++++++++++++---- .../stock/class/mouvementstock.class.php | 3 +- 4 files changed, 110 insertions(+), 20 deletions(-) diff --git a/htdocs/langs/en_US/products.lang b/htdocs/langs/en_US/products.lang index 30db4bf232f..3efd24778ad 100755 --- a/htdocs/langs/en_US/products.lang +++ b/htdocs/langs/en_US/products.lang @@ -250,3 +250,6 @@ PriceExpressionEditorHelp3=In both product/service and supplier prices there are PriceExpressionEditorHelp4=In product/service price only: #supplier_min_price#
In supplier prices only: #supplier_quantity# and #supplier_tva_tx# PriceMode=Price mode PriceNumeric=Number +ComposedProductDecreaseStock=Decrease Stock for sub-product +ComposedProduct=Sub-product +MinSupplierPrice=Minimun supplier price diff --git a/htdocs/product/class/product.class.php b/htdocs/product/class/product.class.php index 3f3786016e5..fe67938766d 100755 --- a/htdocs/product/class/product.class.php +++ b/htdocs/product/class/product.class.php @@ -2306,6 +2306,40 @@ class Product extends CommonObject } } + /** + * Modify composed product + * + * @param int $id_pere Id of master product + * @param int $id_fils Id of linked product + * @param int $qty Quantity + * @param int $incdec increase/descrease stock or not + * * @return int < 0 if KO, > 0 if OK + */ + function update_sousproduit($id_pere, $id_fils,$qty, $incdec=1) + { + // Clean parameters + if (! is_numeric($id_pere)) $id_pere=0; + if (! is_numeric($id_fils)) $id_fils=0; + if (! is_numeric($incdec)) $incdec=1; + if (! is_numeric($qty)) $qty=1; + + $sql = 'UPDATE '.MAIN_DB_PREFIX.'product_association SET '; + $sql.= 'qty='.$qty; + $sql.= ',incdec='.$incdec; + $sql .= ' WHERE fk_product_pere='.$id_pere.' AND fk_product_fils='.$id_fils; + + if (!$this->db->query($sql)) + { + dol_print_error($this->db); + return -1; + } + else + { + return 1; + } + + } + /** * Retire le lien entre un sousproduit et un produit/service * @@ -2633,6 +2667,8 @@ class Product extends CommonObject $nb=(! empty($desc_pere[1]) ? $desc_pere[1] :''); $type=(! empty($desc_pere[2]) ? $desc_pere[2] :''); $label=(! empty($desc_pere[3]) ? $desc_pere[3] :''); + $incdec=!empty($desc_pere[4]) ? $desc_pere[4] : 0; + if ($multiply < 1) $multiply=1; //print "XXX We add id=".$id." - label=".$label." - nb=".$nb." - multiply=".$multiply." fullpath=".$compl_path.$label."\n"; @@ -2649,7 +2685,8 @@ class Product extends CommonObject 'fullpath'=>$compl_path.$label, // Label 'type'=>$type, // Nb of units that compose parent product 'desiredstock'=>$this->desiredstock, - 'level'=>$level + 'level'=>$level, + 'incdec'=>$incdec ); // Recursive call if there is childs to child @@ -2798,7 +2835,7 @@ class Product extends CommonObject */ function getChildsArbo($id) { - $sql = "SELECT p.rowid, p.label as label, pa.qty as qty, pa.fk_product_fils as id, p.fk_product_type"; + $sql = "SELECT p.rowid, p.label as label, pa.qty as qty, pa.fk_product_fils as id, p.fk_product_type, pa.incdec"; $sql.= " FROM ".MAIN_DB_PREFIX."product as p"; $sql.= ", ".MAIN_DB_PREFIX."product_association as pa"; $sql.= " WHERE p.rowid = pa.fk_product_fils"; @@ -2812,7 +2849,13 @@ class Product extends CommonObject $prods = array(); while ($rec = $this->db->fetch_array($res)) { - $prods[$rec['rowid']]= array(0=>$rec['id'],1=>$rec['qty'],2=>$rec['fk_product_type'],3=>$this->db->escape($rec['label'])); + $prods[$rec['rowid']]= array( + 0=>$rec['id'], + 1=>$rec['qty'], + 2=>$rec['fk_product_type'], + 3=>$this->db->escape($rec['label']), + 4=>$rec['incdec'] + ); //$prods[$this->db->escape($rec['label'])]= array(0=>$rec['id'],1=>$rec['qty'],2=>$rec['fk_product_type']); //$prods[$this->db->escape($rec['label'])]= array(0=>$rec['id'],1=>$rec['qty']); $listofchilds=$this->getChildsArbo($rec['id']); diff --git a/htdocs/product/composition/card.php b/htdocs/product/composition/card.php index 12553ada59a..b7c6ad45dc5 100644 --- a/htdocs/product/composition/card.php +++ b/htdocs/product/composition/card.php @@ -109,6 +109,19 @@ $cancel <> $langs->trans("Cancel") && exit; } } +else if($action==='save_composed_product') { + + $TProduct = GETPOST('TProduct', 'array'); + if(!empty($TProduct)) { + + foreach ($TProduct as $id_product => $row) { + $product->update_sousproduit($id, $id_product,$row['qty'], isset($row['incdec']) ? 1 : 0 ); + } + + } + + +} if ($cancel == $langs->trans("Cancel")) { @@ -215,7 +228,7 @@ if ($id > 0 || ! empty($ref)) { print '
'; print ''.$langs->trans("ProductAssociationList").'
'; - print ''; + print ''; foreach($prods_arbo as $value) { $productstatic->id=$value['id']; @@ -246,7 +259,7 @@ if ($id > 0 || ! empty($ref)) print ''; - } - - // Number of parent virtual products - print ''; - - if (count($prodsfather) > 0) - { - print ''; - } - - print "
'; print ''.$langs->trans("ProductParentList").'
'; print ''; - foreach($prodsfather as $value) + foreach($prodnbsfather as $value) { $idprod= $value["id"]; $productstatic->id=$idprod;// $value["id"]; @@ -333,20 +346,43 @@ if ($id > 0 || ! empty($ref)) $atleastonenotdefined=0; print ''; } // Number of parent virtual products - print ''; diff --git a/htdocs/product/stock/class/mouvementstock.class.php b/htdocs/product/stock/class/mouvementstock.class.php index 4cea2b7621c..39dd2ff5f67 100644 --- a/htdocs/product/stock/class/mouvementstock.class.php +++ b/htdocs/product/stock/class/mouvementstock.class.php @@ -341,8 +341,7 @@ class MouvementStock extends CommonObject $sql = "SELECT fk_product_pere, fk_product_fils, qty"; $sql.= " FROM ".MAIN_DB_PREFIX."product_association"; $sql.= " WHERE fk_product_pere = ".$idProduct; - // TODO Select only subproduct with incdec tag - //$sql.= " AND incdec = 1"; + $sql.= " AND incdec = 1"; dol_syslog(get_class($this)."::_createSubProduct", LOG_DEBUG); $resql=$this->db->query($sql); From 29e5b89352ee42dd2844175fd9032ac2c8604be1 Mon Sep 17 00:00:00 2001 From: Alexis Algoud Date: Mon, 23 Feb 2015 12:26:27 +0100 Subject: [PATCH 135/287] erase some comments --- htdocs/product/composition/card.php | 91 ----------------------------- 1 file changed, 91 deletions(-) diff --git a/htdocs/product/composition/card.php b/htdocs/product/composition/card.php index b7c6ad45dc5..9efa7772cb0 100644 --- a/htdocs/product/composition/card.php +++ b/htdocs/product/composition/card.php @@ -188,97 +188,6 @@ dol_fiche_head($head, 'subproduct', $titre, 0, $picto); if ($id > 0 || ! empty($ref)) { -/* if ($result) - { - if ($action <> 'edit' && $action <> 'search' && $action <> 're-edit') - { - // mode visu - - print '
'; print $langs->trans("ProductAssociationList").'
'; - print ''; + + print ''; + print ''; + print ''; + + print '
'; + + print ''; + foreach($prods_arbo as $value) { $productstatic->id=$value['id']; $productstatic->type=$value['type']; - //print '
'.$productstatic->ref.'
'; - //print $productstatic->getNomUrl(1).'
'; - //var_dump($value); - print ''; + + $class=($class=='impair')?'pair':'impair'; + + print ''; if ($value['level'] <= 1) { $notdefined=0; $productstatic->ref=$value['fullpath']; - print ''; + $nb_of_subproduct = $value['nb']; + + print ''; + + if($user->rights->produit->creer || $user->rights->service->creer) { + print ''; + print ''; + + } + else{ + print ''; + print ''; + } + + + print ''; - print ''; + print ''; + print ''; + print ''; // Real stock } print ''; } - print ''; - print ''; + print ''; - print ''; + print ''; if (! empty($conf->stock->enabled)) print ''; print ''; print '
'.$langs->trans('ComposedProduct').''.$langs->trans('Qty').''.$langs->trans('ComposedProductDecreaseStock').''.$langs->trans('MinSupplierPrice').''.$langs->trans('Price').''.$langs->trans('Stock').'
'.$productstatic->getNomUrl(1,'composition').' ('.$value['nb'].')'.$productstatic->getNomUrl(1,'composition').''.$nb_of_subproduct.''.($value['incdec']==1?'x':'' ).''; if ($product_fourn->find_min_price_product_fournisseur($productstatic->id) > 0) { @@ -367,26 +403,35 @@ if ($id > 0 || ! empty($ref)) { print '     '; } - print $productstatic->getNomUrl(1,'composition').' ('.$value['nb'].')'; - print ''; + print $productstatic->getNomUrl(1,'composition').''.$value['nb'].'  '; + print ' '; if (! empty($conf->stock->enabled)) print '
'.$langs->trans("TotalBuyingPriceMin").': '; + print '
'.$langs->trans("TotalBuyingPriceMin").': '; if ($atleastonenotdefined) print $langs->trans("Unknown").' ('.$langs->trans("SomeSubProductHaveNoPrices").')'; print ''.($atleastonenotdefined?'':price($total,'','',0,0,-1,$conf->currency)).''.($atleastonenotdefined?'':price($total,'','',0,0,-1,$conf->currency)).' 
'; + + if($user->rights->produit->creer || $user->rights->service->creer) { + print '
'; + } + + print ''; + print '
'.$langs->trans("ParentProductsNumber").''; + print '
'.$langs->trans("ParentProductsNumber").''; print $form->textwithpicto(count($prodsfather), $langs->trans('IfZeroItIsNotUsedByVirtualProduct')); print '
'; - - print ""; - - $nblignes=6; - if ($product->isproduct() && ! empty($conf->stock->enabled)) $nblignes++; - if ($product->isservice()) $nblignes++; - - // Reference - print ''; - - // Libelle - print ''; - print ''; - - // Number of subproducts - $prodsfather = $product->getFather(); // Parent Products - $product->get_sousproduits_arbo(); - $prods_arbo=$product->get_arbo_each_prod(); - $nbofsubproducts=count($prods_arbo); - print ''; - - dol_fiche_end(); - - - // List of products into this virtual product - if (count($prods_arbo) > 0) - { - print ''; - //print ''; - print ''; - if (! empty($conf->stock->enabled)) print ''; - print ''; - } - print '
'.$langs->trans("Ref").''; - print $form->showrefnav($product,'ref','',1,'ref'); - print '
'.$langs->trans("Label").''.$product->libelle.'
'.$langs->trans("AssociatedProductsNumber").''; - print $form->textwithpicto($nbofsubproducts, $langs->trans('IfZeroItIsNotAVirtualProduct')); - print '
'; - print ''.$langs->trans("ProductAssociationList").'
'; - print ''; - foreach($prods_arbo as $value) - { - $productstatic->id=$value['id']; - $productstatic->type=$value['type']; - $productstatic->ref=$value['fullpath']; - if (! empty($conf->stock->enabled)) $productstatic->load_stock(); - //var_dump($value); - //print '
'.$productstatic->ref.'
'; - //print $productstatic->getNomUrl(1).'
'; - //print $value[0]; // This contains a tr line. - print '
'.$productstatic->getNomUrl(1,'composition').' ('.$value['nb'].($value['nb_total'] > $value['nb']?'->'.$value['nb_total']:'').')    '.$productstatic->getNomUrl(1,'composition').' ('.$value['nb'].')    '.$langs->trans("Stock").' : '.$productstatic->stock_reel.'
'; - print '
'.$langs->trans("ParentProductsNumber").''; - print $form->textwithpicto(count($prodsfather), $langs->trans('IfZeroItIsNotUsedByVirtualProduct')); - print '
'; - print ''.$langs->trans("ProductParentList").'
'; - print ''; - foreach($prodnbsfather as $value) - { - $idprod= $value["id"]; - $productstatic->id=$idprod;// $value["id"]; - $productstatic->type=$value["fk_product_type"]; - $productstatic->ref=$value['label']; - print ''; - print '';; - print ''; - } - print '
'.$productstatic->getNomUrl(1,'composition').'
'; - print '
\n"; - - dol_fiche_end(); - } - } -*/ /* * Fiche en mode edition */ From 570194b4b9a615f6870068fb73023e1662a59626 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 23 Feb 2015 13:10:18 +0100 Subject: [PATCH 136/287] Fix validation of email when there is a comma separator. --- htdocs/admin/notification.php | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/htdocs/admin/notification.php b/htdocs/admin/notification.php index 14aeba65c29..695174f3303 100644 --- a/htdocs/admin/notification.php +++ b/htdocs/admin/notification.php @@ -33,6 +33,7 @@ $langs->load("orders"); $langs->load("propal"); $langs->load("bills"); $langs->load("errors"); +$langs->load("mails"); // Security check if (!$user->admin) @@ -76,7 +77,9 @@ if ($action == 'setvalue' && $user->admin) * View */ -llxHeader(); +$form=new Form($db); + +llxHeader('',$langs->trans("NotificationSetup")); $linkback=''.$langs->trans("BackToModuleList").''; print_fiche_titre($langs->trans("NotificationSetup"),$linkback,'setup'); @@ -132,9 +135,19 @@ foreach($listofnotifiedevents as $notifiedevent) print '
'.$elementLabel.''.$notifiedevent['code'].''.$label.''; $param='NOTIFICATION_FIXEDEMAIL_'.$notifiedevent['code']; - print ''; - if (! empty($conf->global->$param) && ! isValidEmail($conf->global->$param)) print ' '.img_warning($langs->trans("ErrorBadEMail")); + $value=GETPOST($param)?GETPOST($param,'alpha'):$conf->global->$param; + $s=''; // Do not use type="email" here, we must be able to enter a list of email with , separator. + $arrayemail=explode(',',$value); + $showwarning=0; + foreach($arrayemail as $key=>$valuedet) + { + $valuedet=trim($valuedet); + if (! empty($valuedet) && ! isValidEmail($valuedet)) $showwarning++; + } + if ((! empty($conf->global->$param)) && $showwarning) $s.=' '.img_warning($langs->trans("ErrorBadEMail")); + print $form->textwithpicto($s,$langs->trans("YouCanUseCommaSeparatorForSeveralRecipients")); print '
'; + // If the user can view prospects other than his' + $moreforfilter=''; + if ($user->rights->societe->client->voir || $socid) + { + $langs->load("commercial"); + $moreforfilter.=$langs->trans('ThirdPartiesOfSaleRepresentative'). ': '; + $moreforfilter.=$formother->select_salesrepresentatives($search_sale,'search_sale',$user); + $moreforfilter.='       '; + } + + if ($moreforfilter) + { + print ''; + print ''; + } + print ''; $param='&search_contract='.$search_contract; $param.='&search_name='.$search_name; $param.='&search_ref_supplier='.$search_ref_supplier; + $param.='&search_sale=' .$search_sale; + print_liste_field_titre($langs->trans("Ref"), $_SERVER["PHP_SELF"], "c.rowid","","$param",'',$sortfield,$sortorder); print_liste_field_titre($langs->trans("RefCustomer"), $_SERVER["PHP_SELF"], "c.ref_supplier","","$param",'',$sortfield,$sortorder); print_liste_field_titre($langs->trans("Company"), $_SERVER["PHP_SELF"], "s.nom","","$param",'',$sortfield,$sortorder); + print_liste_field_titre($langs->trans("SalesRepresentative"), $_SERVER["PHP_SELF"], "","","$param",'',$sortfield,$sortorder); //print_liste_field_titre($langs->trans("DateCreation"), $_SERVER["PHP_SELF"], "c.datec","","$param",'align="center"',$sortfield,$sortorder); print_liste_field_titre($langs->trans("DateContract"), $_SERVER["PHP_SELF"], "c.date_contrat","","$param",'align="center"',$sortfield,$sortorder); //print_liste_field_titre($langs->trans("Status"), $_SERVER["PHP_SELF"], "c.statut","","$param",'align="center"',$sortfield,$sortorder); @@ -150,7 +184,7 @@ if ($resql) print ''; print ''; //print ''; - print '\n"; @@ -167,6 +201,43 @@ if ($resql) print ''; print ''; //print ''; + + // Sales Rapresentatives + print ''; + + print ''; //print ''; print ''; From be3fd5529a1b9586aceec23c4793125ac229631c Mon Sep 17 00:00:00 2001 From: aspangaro Date: Mon, 23 Feb 2015 20:31:44 +0100 Subject: [PATCH 141/287] FIXED: Module Expense Report - Correct init --- htdocs/core/modules/modExpenseReport.class.php | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/htdocs/core/modules/modExpenseReport.class.php b/htdocs/core/modules/modExpenseReport.class.php index c82de294008..5083aae5ad6 100755 --- a/htdocs/core/modules/modExpenseReport.class.php +++ b/htdocs/core/modules/modExpenseReport.class.php @@ -336,13 +336,12 @@ class modExpenseReport extends DolibarrModules { global $conf; + // Remove permissions and default values $this->remove($options); - $result=$this->_load_tables('/deplacement/sql/'); - $sql = array( - "DELETE FROM ".MAIN_DB_PREFIX."document_model WHERE nom = 'teclib' AND entity = ".$conf->entity, - "INSERT INTO ".MAIN_DB_PREFIX."document_model (nom, type, entity) VALUES('teclib','deplacement',".$conf->entity.")" + "DELETE FROM ".MAIN_DB_PREFIX."document_model WHERE nom = 'standard' AND entity = ".$conf->entity, + "INSERT INTO ".MAIN_DB_PREFIX."document_model (nom, type, entity) VALUES('standard','deplacement',".$conf->entity.")" ); return $this->_init($sql,$options); @@ -362,6 +361,4 @@ class modExpenseReport extends DolibarrModules return $this->_remove($sql,$options); } - -} - +} \ No newline at end of file From 9dadd16724b265c1a77647a69e6f27f06fd36324 Mon Sep 17 00:00:00 2001 From: aspangaro Date: Mon, 23 Feb 2015 21:44:33 +0100 Subject: [PATCH 142/287] FIXED: Correct problem field with note - Add note_private & use wysiwyg editor --- htdocs/expensereport/card.php | 74 ++++++++++++++----- .../class/expensereport.class.php | 17 +++-- 2 files changed, 66 insertions(+), 25 deletions(-) diff --git a/htdocs/expensereport/card.php b/htdocs/expensereport/card.php index 8cbb25fcc53..51be7a7f3d8 100755 --- a/htdocs/expensereport/card.php +++ b/htdocs/expensereport/card.php @@ -112,7 +112,8 @@ if ($action == 'add' && $user->rights->expensereport->creer) $object->fk_c_expensereport_statuts = 1; $object->fk_c_paiement = GETPOST('fk_c_paiement','int'); $object->fk_user_validator = GETPOST('fk_user_validator','int'); - $object->note = GETPOST('note'); + $object->note_public = GETPOST('note_public'); + $object->note_private = GETPOST('note_private'); if ($object->periode_existe($user,$object->date_debut,$object->date_fin)) { @@ -156,7 +157,8 @@ if ($action == 'update' && $user->rights->expensereport->creer) } $object->fk_c_paiement = GETPOST('fk_c_paiement','int'); - $object->note = GETPOST('note'); + $object->note_public = GETPOST('note_public'); + $object->note_private = GETPOST('note_private'); $result = $object->update($user); if ($result > 0) @@ -1133,21 +1135,36 @@ if ($action == 'create') print ''; print ''; } + + // Public note print ''; - print ''; - print ''; - print ''; + print ''; + print ''; + + // Private note + if (empty($user->societe_id)) { + print ''; + print ''; + print ''; + } + print ''; print '
'; + print $moreforfilter; + print '
  '; + print ''; print ''; print "
'.$obj->ref_supplier.''.img_object($langs->trans("ShowCompany"),"company").' '.$obj->name.''.dol_print_date($obj->datec).''; + if($obj->socid) + { + $socstatic->fetch($obj->socid); + $listsalesrepresentatives=$socstatic->getSalesRepresentatives($user); + $nbofsalesrepresentative=count($listsalesrepresentatives); + if ($nbofsalesrepresentative > 3) // We print only number + { + print ''; + print $nbofsalesrepresentative; + print ''; + } + else if ($nbofsalesrepresentative > 0) + { + $userstatic=new User($db); + $j=0; + foreach($listsalesrepresentatives as $val) + { + $userstatic->id=$val['id']; + $userstatic->lastname=$val['lastname']; + $userstatic->firstname=$val['firstname']; + print $userstatic->getNomUrl(1); + $j++; + if ($j < $nbofsalesrepresentative) print '
'; + } + } + else print $langs->trans("NoSalesRepresentativeAffected"); + } + else + { + print ' '; + } + print '
'.dol_print_date($db->jdate($obj->date_contrat)).''.$staticcontrat->LibStatut($obj->statut,3).''.($obj->nb_initial>0?$obj->nb_initial:'').'
'.$langs->trans("Note").''; - print ''; - print '
' . $langs->trans('NotePublic') . ''; + + $doleditor = new DolEditor('note_public', $note_public, '', 80, 'dolibarr_notes', 'In', 0, false, true, ROWS_3, 70); + print $doleditor->Create(1); + print '
' . $langs->trans('NotePrivate') . ''; + + $doleditor = new DolEditor('note_private', $note_private, '', 80, 'dolibarr_notes', 'In', 0, false, true, ROWS_3, 70); + print $doleditor->Create(1); + print '
'; dol_fiche_end(); - print '
'; + print '
'; print ''; - print '     '; - print '
'; + print '     '; + print ''; print ''; } @@ -1271,19 +1288,34 @@ else print '
'.$langs->trans("Note").''; - print ''; - print '
' . $langs->trans('NotePublic') . ''; + + $doleditor = new DolEditor('note_public', $note_public, '', 80, 'dolibarr_notes', 'In', 0, false, true, ROWS_3, 70); + print $doleditor->Create(1); + print '
' . $langs->trans('NotePrivate') . ''; + + $doleditor = new DolEditor('note_private', $note_private, '', 80, 'dolibarr_notes', 'In', 0, false, true, ROWS_3, 70); + print $doleditor->Create(1); + print '
'; dol_fiche_end(); print '
'; - print '     '; - print ''; + print ''; + print '     '; print '
'; print ''; @@ -1370,8 +1402,12 @@ else print '
'.$object->getLibStatut(4).'
'.$langs->trans("Note").''.$object->note.''.$langs->trans("NotePublic").''.$object->note_public.'
'.$langs->trans("NotePrivate").''.$object->note_private.'
'.$langs->trans("AmountHT").'
'; $linkback = ''.$langs->trans("BackToList").''; @@ -1295,7 +1293,7 @@ else print ''; print ''; @@ -1305,7 +1303,7 @@ else print ''; print ''; } From 15aac509d24d371841aa66dac99c442778c831ee Mon Sep 17 00:00:00 2001 From: aspangaro Date: Mon, 23 Feb 2015 22:36:26 +0100 Subject: [PATCH 146/287] NEW: Add button to purge search criteria into list --- htdocs/expensereport/list.php | 39 +++++++++++++++++++++-------------- 1 file changed, 24 insertions(+), 15 deletions(-) diff --git a/htdocs/expensereport/list.php b/htdocs/expensereport/list.php index d71a9410c9f..e24674b6760 100755 --- a/htdocs/expensereport/list.php +++ b/htdocs/expensereport/list.php @@ -37,8 +37,24 @@ $socid = $_GET["socid"]?$_GET["socid"]:''; if ($user->societe_id) $socid=$user->societe_id; $result = restrictedArea($user, 'expensereport','',''); -$search_ref=GETPOST('search_ref'); +$search_ref = GETPOST('search_ref'); +$search_user = GETPOST('search_user','int'); +$search_state = GETPOST('search_state','int'); +$month_start = GETPOST("month_start","int"); +$year_start = GETPOST("year_start","int"); +$month_end = GETPOST("month_end","int"); +$year_end = GETPOST("year_end","int"); +if (GETPOST("button_removefilter_x") || GETPOST("button_removefilter")) // Both test must be present to be compatible with all browsers +{ + $search_ref=""; + $search_user=""; + $search_state=""; + $month_start=""; + $year_start=""; + $month_end=""; + $year_end=""; +} /* * View @@ -53,15 +69,6 @@ llxHeader('', $langs->trans("ListOfExpenseReports")); $max_year = 5; $min_year = 5; -$month_start = $_GET['month_start']; -$year_start = $_GET['year_start']; -$month_end = $_GET['month_end']; -$year_end = $_GET['year_end']; - -$search_ref = GETPOST('search_ref'); -$search_user = GETPOST('search_user','int'); -$search_state = GETPOST('search_state','int'); - $sortorder = $_GET["sortorder"]; $sortfield = $_GET["sortfield"]; $page = $_GET["page"]; @@ -183,10 +190,10 @@ if ($resql) print_liste_field_titre($langs->trans("TotalVAT"),$_SERVER["PHP_SELF"],"d.total_tva","",$param,'align="right"',$sortfield,$sortorder); print_liste_field_titre($langs->trans("TotalTTC"),$_SERVER["PHP_SELF"],"d.total_ttc","",$param,'align="right"',$sortfield,$sortorder); print_liste_field_titre($langs->trans("Statut"),$_SERVER["PHP_SELF"],"","",$param,'align="right"',$sortfield,$sortorder); - print_liste_field_titre(); + print ''; print "\n"; - // FILTRES + // Filters print ''; print ''; - print '"; + + print ''; print "\n"; From 0a5c3e1fa81b6d1d2b1d35e258b7933bd414b9f6 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 23 Feb 2015 23:15:41 +0100 Subject: [PATCH 147/287] Fix price must be hidden if context is not on sell --- htdocs/product/list.php | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/htdocs/product/list.php b/htdocs/product/list.php index a5cc97defa7..c060ef424e6 100644 --- a/htdocs/product/list.php +++ b/htdocs/product/list.php @@ -456,8 +456,11 @@ else if (empty($conf->global->PRODUIT_MULTIPRICES)) { print ''; } @@ -465,7 +468,7 @@ else if ($user->rights->fournisseur->lire) { print ''; print ''; - + //Only show price mode and expression selector if module is enabled if (! empty($conf->dynamicprices->enabled)) { // Price mode selector @@ -755,8 +755,11 @@ if ($action == 'edit_price' && ($user->rights->produit->creer || $user->rights-> print ''; print '
'; - } else { - for($i = 1; $i <= $conf->global->PRODUIT_MULTIPRICES_LIMIT; $i ++) { + } + else + { + for($i = 1; $i <= $conf->global->PRODUIT_MULTIPRICES_LIMIT; $i ++) + { print ''; print ''; print ''; @@ -823,10 +826,12 @@ $sql .= " ORDER BY p.date_price DESC, p.price_level ASC"; // $sql .= $db->plimit(); $result = $db->query($sql); -if ($result) { +if ($result) +{ $num = $db->num_rows($result); - if (! $num) { + if (! $num) + { $db->free($result); // Il doit au moins y avoir la ligne de prix initial. @@ -837,9 +842,12 @@ if ($result) { $num = $db->num_rows($result); } - if ($num > 0) { + if ($num > 0) + { print '
'; + if (! empty($conf->global->PRODUIT_CUSTOMER_PRICES)) print_fiche_titre($langs->trans("DefaultPrice"),'',''); + print '
' . $langs->trans('NotePublic') . ''; - $doleditor = new DolEditor('note_public', $note_public, '', 80, 'dolibarr_notes', 'In', 0, false, true, ROWS_3, 70); + $doleditor = new DolEditor('note_public', $object->note_public, '', 80, 'dolibarr_notes', 'In', 0, false, true, ROWS_3, 70); print $doleditor->Create(1); print '
' . $langs->trans('NotePrivate') . ''; - $doleditor = new DolEditor('note_private', $note_private, '', 80, 'dolibarr_notes', 'In', 0, false, true, ROWS_3, 70); + $doleditor = new DolEditor('note_private', $object->note_private, '', 80, 'dolibarr_notes', 'In', 0, false, true, ROWS_3, 70); print $doleditor->Create(1); print '
 
'; print ''; @@ -224,9 +231,11 @@ if ($resql) print ''; select_expensereport_statut($search_state,'search_state'); print ''; - print ' '; - print "'; + print ''; + print ''; + print '
'; - if ($objp->price_base_type == 'TTC') print price($objp->price_ttc).' '.$langs->trans("TTC"); - else print price($objp->price).' '.$langs->trans("HT"); + if ($objp->tosell) + { + if ($objp->price_base_type == 'TTC') print price($objp->price_ttc).' '.$langs->trans("TTC"); + else print price($objp->price).' '.$langs->trans("HT"); + } print ''; - if ($objp->minsellprice != '') + if ($objp->tobuy && $objp->minsellprice != '') { //print price($objp->minsellprice).' '.$langs->trans("HT"); if ($product_fourn->find_min_price_product_fournisseur($objp->rowid) > 0) From bbc82e829bcbb132071fad2d5719196f986e2468 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 23 Feb 2015 23:28:55 +0100 Subject: [PATCH 148/287] Fix bad sql request --- htdocs/fourn/class/fournisseur.product.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/fourn/class/fournisseur.product.class.php b/htdocs/fourn/class/fournisseur.product.class.php index 1955d9787d2..8e70461e5da 100755 --- a/htdocs/fourn/class/fournisseur.product.class.php +++ b/htdocs/fourn/class/fournisseur.product.class.php @@ -262,7 +262,7 @@ class ProductFournisseur extends Product $sql.= " ".$availability.","; $sql.= " ".$newnpr.","; $sql.= $conf->entity.","; - $sql.= $this->delivery_time_days; + $sql.= $delivery_time_days; $sql.=")"; dol_syslog(get_class($this)."::update_buyprice", LOG_DEBUG); From eb4eededbd37a2689b438b85ae9774834e3409ef Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 24 Feb 2015 11:19:47 +0100 Subject: [PATCH 149/287] Add class to manage table commande_fournisseur_dispatch --- .../fournisseur.commande.dispatch.class.php | 545 ++++++++++++++++++ htdocs/fourn/commande/dispatch.php | 23 +- .../install/mysql/migration/3.6.0-3.7.0.sql | 2 +- .../install/mysql/migration/3.7.0-3.8.0.sql | 2 +- 4 files changed, 562 insertions(+), 10 deletions(-) create mode 100644 htdocs/fourn/class/fournisseur.commande.dispatch.class.php diff --git a/htdocs/fourn/class/fournisseur.commande.dispatch.class.php b/htdocs/fourn/class/fournisseur.commande.dispatch.class.php new file mode 100644 index 00000000000..370b61de881 --- /dev/null +++ b/htdocs/fourn/class/fournisseur.commande.dispatch.class.php @@ -0,0 +1,545 @@ + + * Copyright (C) 2014 Juanjo Menent + * + * 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 3 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, see . + */ + +/** + * \file dev/skeletons/commandefournisseurdispatch.class.php + * \ingroup fournisseur stock + * \brief This file is an example for a CRUD class file (Create/Read/Update/Delete) + * Initialy built by build_class_from_table on 2015-02-24 10:38 + */ + +// Put here all includes required by your class file +require_once(DOL_DOCUMENT_ROOT."/core/class/commonobject.class.php"); +//require_once(DOL_DOCUMENT_ROOT."/societe/class/societe.class.php"); +//require_once(DOL_DOCUMENT_ROOT."/product/class/product.class.php"); + + +/** + * Class to manage table commandefournisseurdispatch + */ +class CommandeFournisseurDispatch extends CommonObject +{ + var $db; //!< To store db handler + var $error; //!< To return error code (or message) + var $errors=array(); //!< To return several error codes (or messages) + var $element='commandefournisseurdispatch'; //!< Id that identify managed objects + var $table_element='commande_fournisseur_dispatch'; //!< Name of table without prefix where object is stored + + var $id; + + var $fk_commande; + var $fk_product; + var $fk_commandefourndet; + var $qty; + var $fk_entrepot; + var $fk_user; + var $datec=''; + var $comment; + var $status; + var $tms=''; + var $batch; + var $eatby=''; + var $sellby=''; + + + + + /** + * Constructor + * + * @param DoliDb $db Database handler + */ + function __construct($db) + { + $this->db = $db; + + // List of language codes for status + $this->statuts[0] = 'Received'; + $this->statuts[1] = 'Approved'; + $this->statuts[2] = 'Denied'; + $this->statutshort[0] = 'Received'; + $this->statutshort[1] = 'Approved'; + $this->statutshort[2] = 'Denied'; + + return 1; + } + + + /** + * Create object into database + * + * @param User $user User that creates + * @param int $notrigger 0=launch triggers after, 1=disable triggers + * @return int <0 if KO, Id of created object if OK + */ + function create($user, $notrigger=0) + { + global $conf, $langs; + $error=0; + + // Clean parameters + + if (isset($this->fk_commande)) $this->fk_commande=trim($this->fk_commande); + if (isset($this->fk_product)) $this->fk_product=trim($this->fk_product); + if (isset($this->fk_commandefourndet)) $this->fk_commandefourndet=trim($this->fk_commandefourndet); + if (isset($this->qty)) $this->qty=trim($this->qty); + if (isset($this->fk_entrepot)) $this->fk_entrepot=trim($this->fk_entrepot); + if (isset($this->fk_user)) $this->fk_user=trim($this->fk_user); + if (isset($this->comment)) $this->comment=trim($this->comment); + if (isset($this->status)) $this->status=trim($this->status); + if (isset($this->batch)) $this->batch=trim($this->batch); + + + + // Check parameters + // Put here code to add control on parameters values + + // Insert request + $sql = "INSERT INTO ".MAIN_DB_PREFIX.$this->table_element."("; + + $sql.= "fk_commande,"; + $sql.= "fk_product,"; + $sql.= "fk_commandefourndet,"; + $sql.= "qty,"; + $sql.= "fk_entrepot,"; + $sql.= "fk_user,"; + $sql.= "datec,"; + $sql.= "comment,"; + $sql.= "status,"; + $sql.= "batch,"; + $sql.= "eatby,"; + $sql.= "sellby"; + + + $sql.= ") VALUES ("; + + $sql.= " ".(! isset($this->fk_commande)?'NULL':"'".$this->fk_commande."'").","; + $sql.= " ".(! isset($this->fk_product)?'NULL':"'".$this->fk_product."'").","; + $sql.= " ".(! isset($this->fk_commandefourndet)?'NULL':"'".$this->fk_commandefourndet."'").","; + $sql.= " ".(! isset($this->qty)?'NULL':"'".$this->qty."'").","; + $sql.= " ".(! isset($this->fk_entrepot)?'NULL':"'".$this->fk_entrepot."'").","; + $sql.= " ".(! isset($this->fk_user)?'NULL':"'".$this->fk_user."'").","; + $sql.= " ".(! isset($this->datec) || dol_strlen($this->datec)==0?'NULL':"'".$this->db->idate($this->datec)."'").","; + $sql.= " ".(! isset($this->comment)?'NULL':"'".$this->db->escape($this->comment)."'").","; + $sql.= " ".(! isset($this->status)?'NULL':"'".$this->status."'").","; + $sql.= " ".(! isset($this->batch)?'NULL':"'".$this->db->escape($this->batch)."'").","; + $sql.= " ".(! isset($this->eatby) || dol_strlen($this->eatby)==0?'NULL':"'".$this->db->idate($this->eatby)."'").","; + $sql.= " ".(! isset($this->sellby) || dol_strlen($this->sellby)==0?'NULL':"'".$this->db->idate($this->sellby)."'").""; + + + $sql.= ")"; + + $this->db->begin(); + + dol_syslog(__METHOD__, LOG_DEBUG); + $resql=$this->db->query($sql); + if (! $resql) { $error++; $this->errors[]="Error ".$this->db->lasterror(); } + + if (! $error) + { + $this->id = $this->db->last_insert_id(MAIN_DB_PREFIX.$this->table_element); + + if (! $notrigger) + { + // Uncomment this and change MYOBJECT to your own tag if you + // want this action calls a trigger. + + //// Call triggers + //$result=$this->call_trigger('MYOBJECT_CREATE',$user); + //if ($result < 0) { $error++; //Do also what you must do to rollback action if trigger fail} + //// End call triggers + } + } + + // Commit or rollback + if ($error) + { + foreach($this->errors as $errmsg) + { + dol_syslog(__METHOD__." ".$errmsg, LOG_ERR); + $this->error.=($this->error?', '.$errmsg:$errmsg); + } + $this->db->rollback(); + return -1*$error; + } + else + { + $this->db->commit(); + return $this->id; + } + } + + + /** + * Load object in memory from the database + * + * @param int $id Id object + * @param string $ref Ref + * @return int <0 if KO, >0 if OK + */ + function fetch($id,$ref='') + { + global $langs; + $sql = "SELECT"; + $sql.= " t.rowid,"; + + $sql.= " t.fk_commande,"; + $sql.= " t.fk_product,"; + $sql.= " t.fk_commandefourndet,"; + $sql.= " t.qty,"; + $sql.= " t.fk_entrepot,"; + $sql.= " t.fk_user,"; + $sql.= " t.datec,"; + $sql.= " t.comment,"; + $sql.= " t.status,"; + $sql.= " t.tms,"; + $sql.= " t.batch,"; + $sql.= " t.eatby,"; + $sql.= " t.sellby"; + + + $sql.= " FROM ".MAIN_DB_PREFIX.$this->table_element." as t"; + if ($ref) $sql.= " WHERE t.ref = '".$ref."'"; + else $sql.= " WHERE t.rowid = ".$id; + + dol_syslog(get_class($this)."::fetch"); + $resql=$this->db->query($sql); + if ($resql) + { + if ($this->db->num_rows($resql)) + { + $obj = $this->db->fetch_object($resql); + + $this->id = $obj->rowid; + + $this->fk_commande = $obj->fk_commande; + $this->fk_product = $obj->fk_product; + $this->fk_commandefourndet = $obj->fk_commandefourndet; + $this->qty = $obj->qty; + $this->fk_entrepot = $obj->fk_entrepot; + $this->fk_user = $obj->fk_user; + $this->datec = $this->db->jdate($obj->datec); + $this->comment = $obj->comment; + $this->status = $obj->status; + $this->tms = $this->db->jdate($obj->tms); + $this->batch = $obj->batch; + $this->eatby = $this->db->jdate($obj->eatby); + $this->sellby = $this->db->jdate($obj->sellby); + + + } + $this->db->free($resql); + + return 1; + } + else + { + $this->error="Error ".$this->db->lasterror(); + return -1; + } + } + + + /** + * Update object into database + * + * @param User $user User that modifies + * @param int $notrigger 0=launch triggers after, 1=disable triggers + * @return int <0 if KO, >0 if OK + */ + function update($user, $notrigger=0) + { + global $conf, $langs; + $error=0; + + // Clean parameters + + if (isset($this->fk_commande)) $this->fk_commande=trim($this->fk_commande); + if (isset($this->fk_product)) $this->fk_product=trim($this->fk_product); + if (isset($this->fk_commandefourndet)) $this->fk_commandefourndet=trim($this->fk_commandefourndet); + if (isset($this->qty)) $this->qty=trim($this->qty); + if (isset($this->fk_entrepot)) $this->fk_entrepot=trim($this->fk_entrepot); + if (isset($this->fk_user)) $this->fk_user=trim($this->fk_user); + if (isset($this->comment)) $this->comment=trim($this->comment); + if (isset($this->status)) $this->status=trim($this->status); + if (isset($this->batch)) $this->batch=trim($this->batch); + + + + // Check parameters + // Put here code to add a control on parameters values + + // Update request + $sql = "UPDATE ".MAIN_DB_PREFIX.$this->table_element." SET"; + + $sql.= " fk_commande=".(isset($this->fk_commande)?$this->fk_commande:"null").","; + $sql.= " fk_product=".(isset($this->fk_product)?$this->fk_product:"null").","; + $sql.= " fk_commandefourndet=".(isset($this->fk_commandefourndet)?$this->fk_commandefourndet:"null").","; + $sql.= " qty=".(isset($this->qty)?$this->qty:"null").","; + $sql.= " fk_entrepot=".(isset($this->fk_entrepot)?$this->fk_entrepot:"null").","; + $sql.= " fk_user=".(isset($this->fk_user)?$this->fk_user:"null").","; + $sql.= " datec=".(dol_strlen($this->datec)!=0 ? "'".$this->db->idate($this->datec)."'" : 'null').","; + $sql.= " comment=".(isset($this->comment)?"'".$this->db->escape($this->comment)."'":"null").","; + $sql.= " status=".(isset($this->status)?$this->status:"null").","; + $sql.= " tms=".(dol_strlen($this->tms)!=0 ? "'".$this->db->idate($this->tms)."'" : 'null').","; + $sql.= " batch=".(isset($this->batch)?"'".$this->db->escape($this->batch)."'":"null").","; + $sql.= " eatby=".(dol_strlen($this->eatby)!=0 ? "'".$this->db->idate($this->eatby)."'" : 'null').","; + $sql.= " sellby=".(dol_strlen($this->sellby)!=0 ? "'".$this->db->idate($this->sellby)."'" : 'null').""; + + + $sql.= " WHERE rowid=".$this->id; + + $this->db->begin(); + + dol_syslog(__METHOD__); + $resql = $this->db->query($sql); + if (! $resql) { $error++; $this->errors[]="Error ".$this->db->lasterror(); } + + if (! $error) + { + if (! $notrigger) + { + // Uncomment this and change MYOBJECT to your own tag if you + // want this action calls a trigger. + + //// Call triggers + //$result=$this->call_trigger('MYOBJECT_MODIFY',$user); + //if ($result < 0) { $error++; //Do also what you must do to rollback action if trigger fail} + //// End call triggers + } + } + + // Commit or rollback + if ($error) + { + foreach($this->errors as $errmsg) + { + dol_syslog(__METHOD__." ".$errmsg, LOG_ERR); + $this->error.=($this->error?', '.$errmsg:$errmsg); + } + $this->db->rollback(); + return -1*$error; + } + else + { + $this->db->commit(); + return 1; + } + } + + + /** + * Delete object in database + * + * @param User $user User that deletes + * @param int $notrigger 0=launch triggers after, 1=disable triggers + * @return int <0 if KO, >0 if OK + */ + function delete($user, $notrigger=0) + { + global $conf, $langs; + $error=0; + + $this->db->begin(); + + if (! $error) + { + if (! $notrigger) + { + // Uncomment this and change MYOBJECT to your own tag if you + // want this action calls a trigger. + + //// Call triggers + //$result=$this->call_trigger('MYOBJECT_DELETE',$user); + //if ($result < 0) { $error++; //Do also what you must do to rollback action if trigger fail} + //// End call triggers + } + } + + if (! $error) + { + $sql = "DELETE FROM ".MAIN_DB_PREFIX.$this->table_element; + $sql.= " WHERE rowid=".$this->id; + + dol_syslog(__METHOD__); + $resql = $this->db->query($sql); + if (! $resql) { $error++; $this->errors[]="Error ".$this->db->lasterror(); } + } + + // Commit or rollback + if ($error) + { + foreach($this->errors as $errmsg) + { + dol_syslog(__METHOD__." ".$errmsg, LOG_ERR); + $this->error.=($this->error?', '.$errmsg:$errmsg); + } + $this->db->rollback(); + return -1*$error; + } + else + { + $this->db->commit(); + return 1; + } + } + + + + /** + * Load an object from its id and create a new one in database + * + * @param int $fromid Id of object to clone + * @return int New id of clone + */ + function createFromClone($fromid) + { + global $user,$langs; + + $error=0; + + $object=new Commandefournisseurdispatch($this->db); + + $this->db->begin(); + + // Load source object + $object->fetch($fromid); + $object->id=0; + $object->statut=0; + + // Clear fields + // ... + + // Create clone + $result=$object->create($user); + + // Other options + if ($result < 0) + { + $this->error=$object->error; + $error++; + } + + if (! $error) + { + + + } + + // End + if (! $error) + { + $this->db->commit(); + return $object->id; + } + else + { + $this->db->rollback(); + return -1; + } + } + + + + /** + * Return label of the status of object + * + * @param int $mode 0=long label, 1=short label, 2=Picto + short label, 3=Picto, 4=Picto + long label, 5=short label + picto + * @return string Label + */ + function getLibStatut($mode=0) + { + return $this->LibStatut($this->status,$mode); + } + + /** + * Return label of a status + * + * @param int $statut Id statut + * @param int $mode 0=Long label, 1=Short label, 2=Picto + Short label, 3=Picto, 4=Picto + Long label, 5=Short label + Picto + * @return string Label of status + */ + function LibStatut($statut,$mode=0) + { + global $langs; + $langs->load('orders'); + + if ($mode == 0) + { + return $langs->trans($this->statuts[$statut]); + } + if ($mode == 1) + { + return $langs->trans($this->statutshort[$statut]); + } + if ($mode == 2) + { + return $langs->trans($this->statuts[$statut]); + } + if ($mode == 3) + { + if ($statut==0) return img_picto($langs->trans($this->statuts[$statut]),'statut0'); + if ($statut==1) return img_picto($langs->trans($this->statuts[$statut]),'statut1'); + if ($statut==2) return img_picto($langs->trans($this->statuts[$statut]),'statut3'); + if ($statut==3) return img_picto($langs->trans($this->statuts[$statut]),'statut5'); + } + if ($mode == 4) + { + if ($statut==0) return img_picto($langs->trans($this->statuts[$statut]),'statut0').' '.$langs->trans($this->statuts[$statut]); + if ($statut==1) return img_picto($langs->trans($this->statuts[$statut]),'statut1').' '.$langs->trans($this->statuts[$statut]); + if ($statut==2) return img_picto($langs->trans($this->statuts[$statut]),'statut3').' '.$langs->trans($this->statuts[$statut]); + if ($statut==3) return img_picto($langs->trans($this->statuts[$statut]),'statut5').' '.$langs->trans($this->statuts[$statut]); + } + if ($mode == 5) + { + if ($statut==0) return ''.$langs->trans($this->statutshort[$statut]).' '.img_picto($langs->trans($this->statuts[$statut]),'statut0'); + if ($statut==1) return ''.$langs->trans($this->statutshort[$statut]).' '.img_picto($langs->trans($this->statuts[$statut]),'statut1'); + if ($statut==2) return ''.$langs->trans($this->statutshort[$statut]).' '.img_picto($langs->trans($this->statuts[$statut]),'statut3'); + if ($statut==3) return ''.$langs->trans($this->statutshort[$statut]).' '.img_picto($langs->trans($this->statuts[$statut]),'statut5'); + } + } + + + /** + * Initialise object with example values + * Id must be 0 if object instance is a specimen + * + * @return void + */ + function initAsSpecimen() + { + $this->id=0; + + $this->fk_commande=''; + $this->fk_product=''; + $this->fk_commandefourndet=''; + $this->qty=''; + $this->fk_entrepot=''; + $this->fk_user=''; + $this->datec=''; + $this->comment=''; + $this->status=''; + $this->tms=''; + $this->batch=''; + $this->eatby=''; + $this->sellby=''; + + + } + +} diff --git a/htdocs/fourn/commande/dispatch.php b/htdocs/fourn/commande/dispatch.php index b60914cb7d1..7f4237224b5 100644 --- a/htdocs/fourn/commande/dispatch.php +++ b/htdocs/fourn/commande/dispatch.php @@ -32,6 +32,7 @@ require_once DOL_DOCUMENT_ROOT.'/core/modules/supplier_order/modules_commandefou require_once DOL_DOCUMENT_ROOT.'/product/stock/class/entrepot.class.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/fourn.lib.php'; require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.commande.class.php'; +require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.commande.dispatch.class.php'; if (! empty($conf->projet->enabled)) require_once DOL_DOCUMENT_ROOT.'/projet/class/project.class.php'; $langs->load('orders'); @@ -106,6 +107,7 @@ if ($_POST["action"] == 'dispatch' && $user->rights->fournisseur->commande->rece $qty = "qty_".$reg[1]."_".$reg[2]; $ent = "entrepot_".$reg[1]."_".$reg[2]; $pu = "pu_".$reg[1]."_".$reg[2]; + $fk_commandefourndet = "fk_commandefourndet_".$reg[1]."_".$reg[2]; $lot = "lot_number_".$reg[1]."_".$reg[2]; $dDLUO = dol_mktime(12, 0, 0, $_POST['dluo_'.$reg[1]."_".$reg[2].'month'], $_POST['dluo_'.$reg[1]."_".$reg[2].'day'], $_POST['dluo_'.$reg[1]."_".$reg[2].'year']); $dDLC = dol_mktime(12, 0, 0, $_POST['dlc_'.$reg[1]."_".$reg[2].'month'], $_POST['dlc_'.$reg[1]."_".$reg[2].'day'], $_POST['dlc_'.$reg[1]."_".$reg[2].'year']); @@ -129,7 +131,7 @@ if ($_POST["action"] == 'dispatch' && $user->rights->fournisseur->commande->rece } else { - $result = $commande->dispatchProduct($user, GETPOST($prod,'int'), GETPOST($qty), GETPOST($ent,'int'), GETPOST($pu), GETPOST("comment"), $dDLC, $dDLUO, GETPOST($lot)); + $result = $commande->dispatchProduct($user, GETPOST($prod,'int'), GETPOST($qty), GETPOST($ent,'int'), GETPOST($pu), GETPOST("comment"), $dDLC, $dDLUO, GETPOST($lot, 'alpha'), GETPOST($fk_commandefourndet, 'int')); if ($result < 0) { setEventMessages($commande->error, $commande->errors, 'errors'); @@ -173,6 +175,11 @@ if ($_POST["action"] == 'dispatch' && $user->rights->fournisseur->commande->rece * View */ +$form = new Form($db); +$warehouse_static = new Entrepot($db); +$supplierorderdispatch = new CommandeFournisseurDispatch($db); + + $help_url='EN:CommandeFournisseur'; if (!empty($conf->productbatch->enabled)) { @@ -183,9 +190,6 @@ else llxHeader('',$langs->trans("OrderCard"),$help_url); } -$form = new Form($db); -$warehouse_static = new Entrepot($db); - $now=dol_now(); $id = GETPOST('id','int'); @@ -282,7 +286,7 @@ if ($id > 0 || ! empty($ref)) print ''; print ''; - // Set $products_dispatched with qty dispatech for each product id + // Set $products_dispatched with qty dispatched for each product id $products_dispatched = array(); $sql = "SELECT l.rowid, cfd.fk_product, sum(cfd.qty) as qty"; $sql.= " FROM ".MAIN_DB_PREFIX."commande_fournisseur_dispatch as cfd"; @@ -421,6 +425,7 @@ if ($id > 0 || ! empty($ref)) print ''; print ''; @@ -441,8 +446,8 @@ if ($id > 0 || ! empty($ref)) print ''; } diff --git a/htdocs/install/mysql/migration/3.6.0-3.7.0.sql b/htdocs/install/mysql/migration/3.6.0-3.7.0.sql index dc912be4286..2efb6996993 100755 --- a/htdocs/install/mysql/migration/3.6.0-3.7.0.sql +++ b/htdocs/install/mysql/migration/3.6.0-3.7.0.sql @@ -1161,4 +1161,4 @@ ALTER TABLE llx_product ADD CONSTRAINT fk_product_barcode_type FOREIGN KEY (fk_b UPDATE llx_bank_url set url = REPLACE( url, 'fiche.php', 'card.php'); -- Add id commandefourndet in llx_commande_fournisseur_dispatch to correct /fourn/commande/dispatch.php display when several times same product in supplier order -ALTER TABLE llx_commande_fournisseur_dispatch ADD COLUMN fk_commandefourndet INT(11) NOT NULL DEFAULT '0' AFTER fk_product; +ALTER TABLE llx_commande_fournisseur_dispatch ADD COLUMN fk_commandefourndet INTEGER NOT NULL DEFAULT 0 AFTER fk_product; diff --git a/htdocs/install/mysql/migration/3.7.0-3.8.0.sql b/htdocs/install/mysql/migration/3.7.0-3.8.0.sql index fb644e5b9a7..289d9dae36b 100755 --- a/htdocs/install/mysql/migration/3.7.0-3.8.0.sql +++ b/htdocs/install/mysql/migration/3.7.0-3.8.0.sql @@ -22,7 +22,7 @@ ALTER TABLE llx_commande_fournisseur MODIFY COLUMN date_livraison datetime; -- Add id commandefourndet in llx_commande_fournisseur_dispatch to correct /fourn/commande/dispatch.php display when several times same product in supplier order -ALTER TABLE llx_commande_fournisseur_dispatch ADD COLUMN fk_commandefourndet INT(11) NOT NULL DEFAULT '0' AFTER fk_product; +ALTER TABLE llx_commande_fournisseur_dispatch ADD COLUMN fk_commandefourndet INTEGER NOT NULL DEFAULT 0 AFTER fk_product; -- Remove menu entries of removed or renamed modules From 9842e816d08272475f029ab8ce91108d5c0cd6c8 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 24 Feb 2015 11:24:15 +0100 Subject: [PATCH 150/287] Fix bad sql type Fix no input outside tr-td --- htdocs/fourn/commande/dispatch.php | 45 ++++++++++++------- .../install/mysql/migration/3.6.0-3.7.0.sql | 2 +- 2 files changed, 30 insertions(+), 17 deletions(-) diff --git a/htdocs/fourn/commande/dispatch.php b/htdocs/fourn/commande/dispatch.php index d5ace69a09f..c88886de649 100644 --- a/htdocs/fourn/commande/dispatch.php +++ b/htdocs/fourn/commande/dispatch.php @@ -347,28 +347,41 @@ if ($id > 0 || ! empty($ref)) print ''; print ''; - if ( !(empty($conf->productbatch->enabled)) && $objp->tobatch==1) { - print ''; + if (! empty($conf->productbatch->enabled) && $objp->tobatch==1) + { + print ''; // Dispatch column + print ''; // Warehouse column print ''; - print ''; - print ''; - } else { - print ''; + + print ''; + print ''; + + print ''; + print ''; + print ''; + print ''; // Qty ordered + qty already dispatached } // Dispatch - print ''; + print ''; // Warehouse print '
'; + print ''; print ''; print ''; print ''; if (empty($conf->productbatch->enabled) || $objp->tobatch!=1) { - print ''; print ''; + print ''; print ''; } print ''; @@ -578,8 +583,10 @@ if ($id > 0 || ! empty($ref)) // Status if (! empty($conf->global->SUPPLIER_ORDER_USE_DISPATCH_STATUS)) { - print ''; - print $objp->status; + print ''; + $supplierorderdispatch->status = (empty($objp->status)?0:$objp->status); + //print $supplierorderdispatch->status; + print $supplierorderdispatch->getLibStatut(5); print ''.$objp->qty.''.$products_dispatched[$objp->rowid].''.img_picto_common($langs->trans('AddDispatchBatchLine'),'treemenu/plustop2.gif','onClick="AddLineBatch('.$i.')"').''.img_picto($langs->trans('AddDispatchBatchLine'),'split.png','onClick="addLineBatch('.$i.')"').'
'; - print ''; - print ''; - print ''; - $form->select_date('','dlc'.$suffix,'','',1,""); - print ''; - $form->select_date('','dluo'.$suffix,'','',1,""); - print ''; - print ''; - print ' 
'; print ''; + print ''; print ''; + print ''; + $form->select_date('','dlc'.$suffix,'','',1,""); + print ''; + $form->select_date('','dluo'.$suffix,'','',1,""); + print ''; + print ''; + print ' '; + if (empty($conf->productbatch->enabled) || $objp->tobatch!=1) + { + print ''; + print ''; + print ''; + } + print ''; + print ''; diff --git a/htdocs/install/mysql/migration/3.6.0-3.7.0.sql b/htdocs/install/mysql/migration/3.6.0-3.7.0.sql index dc912be4286..2efb6996993 100755 --- a/htdocs/install/mysql/migration/3.6.0-3.7.0.sql +++ b/htdocs/install/mysql/migration/3.6.0-3.7.0.sql @@ -1161,4 +1161,4 @@ ALTER TABLE llx_product ADD CONSTRAINT fk_product_barcode_type FOREIGN KEY (fk_b UPDATE llx_bank_url set url = REPLACE( url, 'fiche.php', 'card.php'); -- Add id commandefourndet in llx_commande_fournisseur_dispatch to correct /fourn/commande/dispatch.php display when several times same product in supplier order -ALTER TABLE llx_commande_fournisseur_dispatch ADD COLUMN fk_commandefourndet INT(11) NOT NULL DEFAULT '0' AFTER fk_product; +ALTER TABLE llx_commande_fournisseur_dispatch ADD COLUMN fk_commandefourndet INTEGER NOT NULL DEFAULT 0 AFTER fk_product; From cae82104caaeaa3bea923c239f9248241bde11ee Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 24 Feb 2015 12:44:12 +0100 Subject: [PATCH 151/287] Clean tool to generate checksum file --- build/generate_filecheck_xml.php | 45 +- build/makepack-dolibarr.pl | 74 +- htdocs/install/filelist.xml | 12451 +++++++++++++++++++++++++++++ 3 files changed, 12535 insertions(+), 35 deletions(-) create mode 100644 htdocs/install/filelist.xml diff --git a/build/generate_filecheck_xml.php b/build/generate_filecheck_xml.php index 47b15f4dec0..9d5aa6f289e 100644 --- a/build/generate_filecheck_xml.php +++ b/build/generate_filecheck_xml.php @@ -1,13 +1,50 @@ +#!/usr/bin/php + * + * 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 3 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, see . + */ + +/** + * \file build/generate_filecheck_xml.php + * \ingroup dev + * \brief This script create a xml checksum file + */ + +$sapi_type = php_sapi_name(); +$script_file = basename(__FILE__); +$path=dirname(__FILE__).'/'; + +// Test if batch mode +if (substr($sapi_type, 0, 3) == 'cgi') { + echo "Error: You are using PHP for CGI. To execute ".$script_file." from command line, you must use PHP for CLI mode.\n"; + exit; +} + + +// Main parse_str($argv[1]); -$fp = fopen(dirname(__FILE__).'/../htdocs/core/filelist-'.$release.'.xml','w'); +#$outputfile=dirname(__FILE__).'/../htdocs/install/filelist-'.$release.'.xml'; +$outputfile=dirname(__FILE__).'/../htdocs/install/filelist.xml'; +$fp = fopen($outputfile,'w'); fputs($fp, ''."\n"); fputs($fp, ''."\n"); fputs($fp, ''."\n"); $dir_iterator = new RecursiveDirectoryIterator(dirname(__FILE__).'/../htdocs/'); $iterator = new RecursiveIteratorIterator($dir_iterator); // need to ignore document custom etc -$files = new RegexIterator($iterator, '#^(?:[A-Z]:)?(?:/(?!(?:custom|documents|conf|install))[^/]+)+/[^/]+\.(?:php|html|js|json|tpl|jpg|png|gif|sql|lang)$#i'); +$files = new RegexIterator($iterator, '#^(?:[A-Z]:)?(?:/(?!(?:custom|documents|conf|install|nltechno))[^/]+)+/[^/]+\.(?:php|css|html|js|json|tpl|jpg|png|gif|sql|lang)$#i'); $dir=''; $needtoclose=0; foreach ($files as $file) { @@ -27,3 +64,7 @@ fputs($fp, ''."\n"); fputs($fp, ''."\n"); fputs($fp, ''."\n"); fclose($fp); + +print "File ".$outputfile." generated\n"; + +exit(0); diff --git a/build/makepack-dolibarr.pl b/build/makepack-dolibarr.pl index 3de531902f4..ecdf371dc6f 100755 --- a/build/makepack-dolibarr.pl +++ b/build/makepack-dolibarr.pl @@ -204,10 +204,10 @@ else { my $NUM_SCRIPT; my $cpt=0; while (! $found) { - $cpt=-1; - printf(" %2d - %-14s (%s)\n",$cpt,"XML Filecheck","Done in all case"); $cpt=0; - printf(" %2d - %-14s (%s)\n",$cpt,"ALL (1..9)","Need ".join(",",values %REQUIREMENTTARGET)); + printf(" %2d - %-14s (%s)\n",$cpt,"ALL (1..10)","Need ".join(",",values %REQUIREMENTTARGET)); + $cpt++; + printf(" %2d - %-14s\n",$cpt,"Generate check file"); foreach my $target (@LISTETARGET) { $cpt++; printf(" %2d - %-14s (%s)\n",$cpt,$target,"Need ".$REQUIREMENTTARGET{$target}); @@ -218,7 +218,7 @@ else { printf(" %2d - %-14s (%s)\n",$cpt,"SF (publish)","Need ".join(",",values %REQUIREMENTPUBLISH)); # Ask which target to build - print "Choose one package number or several separated with space (0 - ".$cpt."): "; + print "Choose one target number or several separated with space (0 - ".$cpt."): "; $NUM_SCRIPT=; chomp($NUM_SCRIPT); if ($NUM_SCRIPT !~ /^[0-9\s]+$/) @@ -235,30 +235,30 @@ else { if ($NUM_SCRIPT eq "98") { $CHOOSEDPUBLISH{"ASSO"}=1; } - else - { - if ($NUM_SCRIPT eq "99") { - $CHOOSEDPUBLISH{"SF"}=1; + elsif ($NUM_SCRIPT eq "99") { + $CHOOSEDPUBLISH{"SF"}=1; + } + elsif ($NUM_SCRIPT eq "0") { + $CHOOSEDTARGET{"-CHKSUM"}=1; + foreach my $key (@LISTETARGET) { + if ($key ne 'SNAPSHOT' && $key ne 'ASSO' && $key ne 'SF') { $CHOOSEDTARGET{$key}=1; } } - else { - if ($NUM_SCRIPT eq "0") { - foreach my $key (@LISTETARGET) { - if ($key ne 'SNAPSHOT' && $key ne 'ASSO' && $key ne 'SF') { $CHOOSEDTARGET{$key}=1; } - } - } - else { - foreach my $num (split(/\s+/,$NUM_SCRIPT)) { - $CHOOSEDTARGET{$LISTETARGET[$num-1]}=1; - } - } + } + elsif ($NUM_SCRIPT eq "1") { + $CHOOSEDTARGET{"-CHKSUM"}=1 + } + else { + foreach my $num (split(/\s+/,$NUM_SCRIPT)) { + $CHOOSEDTARGET{$LISTETARGET[$num-2]}=1; } } } + # Test if requirement is ok #-------------------------- $atleastonerpm=0; -foreach my $target (keys %CHOOSEDTARGET) { +foreach my $target (sort keys %CHOOSEDTARGET) { if ($target =~ /RPM/i) { if ($atleastonerpm && ($DESTI eq "$SOURCE/build")) @@ -300,20 +300,32 @@ foreach my $target (keys %CHOOSEDTARGET) { print "\n"; +# Build xml check file +#----------------------- +if ($CHOOSEDTARGET{'-CHKSUM'}) +{ + print 'Create xml check file with md5 checksum with command php '.$SOURCE.'/build/generate_filecheck_xml.php release='.$MAJOR.'.'.$MINOR.'.'.$BUILD."\n"; + $ret=`php $SOURCE/build/generate_filecheck_xml.php release=$MAJOR.$MINOR.$BUILD`; + print $ret."\n"; +} + + +#print join(',',sort keys %CHOOSEDTARGET)."\n"; + # Check if there is at least one target to build #---------------------------------------------- $nboftargetok=0; $nboftargetneedbuildroot=0; $nbofpublishneedtag=0; -foreach my $target (keys %CHOOSEDTARGET) { +foreach my $target (sort keys %CHOOSEDTARGET) { if ($CHOOSEDTARGET{$target} < 0) { next; } - if ($target ne 'EXE' && $target ne 'EXEDOLIWAMP') + if ($target ne 'EXE' && $target ne 'EXEDOLIWAMP' && $target ne '-CHKSUM') { $nboftargetneedbuildroot++; } $nboftargetok++; } -foreach my $target (keys %CHOOSEDPUBLISH) { +foreach my $target (sort keys %CHOOSEDPUBLISH) { if ($CHOOSEDPUBLISH{$target} < 0) { next; } if ($target eq 'ASSO') { $nbofpublishneedtag++; } if ($target eq 'SF') { $nbofpublishneedtag++; } @@ -322,12 +334,6 @@ foreach my $target (keys %CHOOSEDPUBLISH) { if ($nboftargetok) { - # Build xml check file - #----------------------- - print 'Create xml check file with md5 checksum'."\n"; - $FULLDIRECTORY = cwd(); - $ret=`php $FULLDIRECTORY/generate_filecheck_xml.php release=$MAJOR.$MINOR.$BUILD`; - # Update CVS if required #----------------------- if ($nbofpublishneedtag) @@ -483,10 +489,11 @@ if ($nboftargetok) { # Build package for each target #------------------------------ - foreach my $target (keys %CHOOSEDTARGET) + foreach my $target (sort keys %CHOOSEDTARGET) { if ($CHOOSEDTARGET{$target} < 0) { next; } - + if ($target eq '-CHKSUM') { next; } + print "\nBuild package for target $target\n"; if ($target eq 'SNAPSHOT') @@ -988,7 +995,7 @@ if ($nboftargetok) { # Publish package for each target #-------------------------------- - foreach my $target (keys %CHOOSEDPUBLISH) + foreach my $target (sort keys %CHOOSEDPUBLISH) { if ($CHOOSEDPUBLISH{$target} < 0) { next; } @@ -1071,7 +1078,8 @@ if ($nboftargetok) { } print "\n----- Summary -----\n"; -foreach my $target (keys %CHOOSEDTARGET) { +foreach my $target (sort keys %CHOOSEDTARGET) { + if ($target eq '-CHKSUM') { print "Checksum was generated"; next; } if ($CHOOSEDTARGET{$target} < 0) { print "Package $target not built (bad requirement).\n"; } else { diff --git a/htdocs/install/filelist.xml b/htdocs/install/filelist.xml new file mode 100644 index 00000000000..64e33442297 --- /dev/null +++ b/htdocs/install/filelist.xml @@ -0,0 +1,12451 @@ + + + + +d41d8cd98f00b204e9800998ecf8427e +94822b20c6bafece49439fa57f655e66 + + +46f56dc7dfff82250816df2bd2db313c +67798229e915f5841274ee70487feec4 +8d61cfa815ca3bb981582bcc7db0a6bd + + +d41d8cd98f00b204e9800998ecf8427e +02efb4c46ded7ea01801b8b6419e204c + + +d41d8cd98f00b204e9800998ecf8427e +91885edae345ea489237442ebe3c8304 + + +706b9f915c400211b1c85c6ca6c11060 +4f72962320b42bab18deef783febd12b +6fe0eb8de0e5c45c09845bb8242fcb1c +dacb01d46e370bb3bcc9574cd082f464 + + +380f6dea14e777f43fe4d2a5603f8e99 +e96ac27ffffd6c056faada99f2238a59 +f2dec5bab910432d81d0314c916dfc66 + + +6d57fc3e3529573832640f2d8f5431fa +d41d8cd98f00b204e9800998ecf8427e +8aab867ba0d3ae540ed3ba143a9ac209 +441a6eda734c5b5275784b0feddd4f4a +af84e26d495c27b0132cf3b565c756a7 +0edc7dc4e4eca0cf7e2a016ea4fc38a4 +cec7bbbcd81cb1fe36e5b49ee36b7dea +757aa607cbcd1616ced5a336e56b0e6c +c3da79f5f54f904a89becbfdd77d0dd0 +8fa68d2c3cdb23a8cd4e5b43fc1d9dcb +c27047f9fee70ff22fd43c59f4b9a612 +765552dbd7152ea2877eec94be358555 +c0be7fe422ce8bfec720d2e0dba045b5 +83168a773a55c95c061c4f8e0acfd1a0 +c6274cd0dfefaab01570605b5175d36e +1faa9edc4b6caae44e72683642199927 +6877820eee61e7159f1b50d17b63c2df + + +76a34fc34fe2844982e0e7c8a639aea5 +6c5b043b72d32408f4002090e802d6e8 +f994d768919712c348a9f4018c6d4ee5 +e7a0c91845d001672e8238f4f4b608c7 +6151a7c4134040854886bc5006a0f7c9 +73e54239e073c5e776f0c9b0318ba330 +6471ec07cf574132fbdbde8d506b71b2 +78f3bac5801105879cebaeb0bdcbb03b +313274ccfbc6586080382c481cd00264 +a7288deb697b6946baff286db59b738d +5a997d9395e71eda78b87efd73564cc0 +7b2ad6fb7dc44d8a84517cd164a3883d +4aed9d2cb22a7353d72fc8355de5342d + + +de36a72317540bb861c69aa3aa246a29 +483f308232887be35deb15f53edf9bdc +a6cb8bb24917bffd0f35616699e30bc7 + + +d41d8cd98f00b204e9800998ecf8427e +09889ea5df64284a0e7753cbdf134a53 + + +d41d8cd98f00b204e9800998ecf8427e +d80628560310197b51451941990f41a5 + + +7620d3c593e0756c6a52a14be719fa4a +9f008f58c3338ecfd47392eaa38db8d9 + + +d41d8cd98f00b204e9800998ecf8427e +c189a2f2ccb19c0e0dd0aebb2f1b5bcf +55e86eae4b7fbef8587a5253bbce78db + + +bc640abf203b20a3e9d3e3d456b44f3b +9526e47774ea9c97832d4bb5fe000376 + + +d41d8cd98f00b204e9800998ecf8427e +5d68acdb6ae4bf3482f00202007ceb6a + + +68f0a32904f0ff877cb2c2820b38dc9b +083d2c1c63007a5a3487ec43bdd926d1 +08194ccdf2c8801e9ce4acd3fc6a8829 + + +66a88729f0af41a466b40b1430f229f7 +772b9a692d9998d6e7d8fd6e28ccb042 +1f2562ebcb87267a49e9c8ec11f92d90 +1e47fc4e62453875065109ef46259108 +e8f85ee5f1ce535b1a6933f18ed09ba0 +e047fd0ab0886550203c49269e7ad1ca +5f6244d1e0c7f706ccaed8c71240fc35 +4f7695bf300da817cbee7feffaa21508 +10b05107d83798c17e2de027dfa923e6 +fb72e6073af1b2f0763f9edfb4394d6c +942423fa65f36d20685e565e76434771 + + +e4d3f7fc63934f317f14dfac5ced7bbf +b5952d80732558fb9d8ec7835ac8647b +efb759421cf7af30d38c8ba28068d04e +562a2ca70bcb19565d7b3b6f8421a55f +8c881ed6898d96ad95b90cfa2c50ae90 +f40d8a85b086be3e17f1f8ff08d5ea0e +d553d9d0831894a4e9d6fa12e8baf6f9 +edb2a9815e3bd84c108ce8402f8b0361 +6b60f598e3cb5d1c1bc8cf2f99ce9ddf + + +160320f871272af75ca3826e1400239f + + +5403d220d2de9cc98862fdd5db840084 +40740d08bf47c6ed2b06c54450350450 +4c098f7e7751f35b9f534917f09f0431 + + +0a3515245bb3d4e69adc2abdc367c65d +90662aecd9eb51bf87b91f76d452381e +35b24d3c1592ad0e60c99c81a94be6b9 +773f9a324037de24ba20edfa4f69099d +858f4d351d6a865bccffef7fa262d99b +42b9d3d703feb637b4babe11190adb52 +7f6bef974f62fb589b0c2d193750d714 +1308090d5cc23d9ba152a9a56c2fe219 +1ea47e3f2a830596d139ec65f559a508 +2067170df6bc861d12d11a277986747a +c1be7df4483ccc0e3b2ee08f977d911b +5f00bbdd645ef9bbf53ea25feeeac3f3 +4489937620fe0ce4998a18b327a79cfa +b447c8a39fa7d8217dfa5519af90e911 +967aa7e79415181dfb2963777a90720d +c5ffee75e8c1246cfb6f85738560233b +6623f7b88310af04446f1fc03c15f793 +92fc4c52f6b3dc513b79c023996a1a6b +e60d49837ddec39bc0a3c3678846d69f + + +41afb11aefb73a16398bd906a0201864 +ef51c84433eab6197f43d0559f22fd4b +01cacadfbda4293ab21e779e06146085 +e79892f863bfba42a2658e43a2e8546b +978cfbff83d963db5c848161fc3ab286 +69a64091740dccdfd8bd2f61df53fba3 +dcce80148d3ea055836f7f38ab71f0c1 +89a36b8dd5d33e53b92b491bc3edddfe +8b3806e68b169d4cd2c1320a5ab6fe8f +5abcc5736ddd1748f943313023e76de6 +937159f009bc845bd67dda6fc8c86b77 +a08eb617d4122bc3972c2c04da32cb70 +bf729609f42e090aed2a970401930e6d +2a6afbab650385179de02fe9205455d7 +3c789d0f23ee478dbbd5e66123e8fcb9 +32320718dca589c661f0b456442a09f3 + + +83b13b749d0fecfd2a003f191a27218f +2cf90126aba2b06f593f838a592ed66a +69be8c3d12533054535cbebb7d7efd07 +0c89a620fdc2487c3cf242fa34acbfd6 +77a59143907052032b136e6883a0e1c2 +381ef356a676703edf225c3a56071002 +19e39ed2f2ac92ccec072d8d3d741104 +0b3730d08a8d573f9195b07f58ccf09f +448ed84f8c692dae865030fdadfabb3e +a15a84422ae741b74da10e8a0e2edd72 +edcd9c936456f8945c9e05797b68a0c3 +6ff462498bec936a81e4762d3fdbf31f +849d81f9f23ca9b07ea52367b4a666f5 +e549c764f41502093e349cd471306f3c +80f1b4396367b316403e0a81ae68c9ac +cbafb5e0cfab93c9964b37d5c90b049c +f075b322db82ca5a1082e18033cea0f6 +a1ce81dd3436a5f87396dbc8213500d7 +7b09d4f614806db46728a2fcf577f388 +5343a79284c9127377a8827395d5b204 +279237196a58800aabe4b99d572eb653 +95b144da8ce3ec2fb644f2e76af8634c +4319bac47de1f786312d238dfd731820 +82b37046e061e6b9037410d6f4a33721 +1ac98104d83b70d49e94c367174bc797 +7d5356e01799df3255d499f215396934 +0987559b12f37ae2490c1a5f5dd83076 +32769f39902632408013c5860b088804 +b3bf4266b0325db6ed8d9cd310cd2ef6 +a377699a88d8e920c8860ebb24aeacf2 +e62424215546778bde995edfa9692ca0 +4bdf86d2111c1a361549dbb6523edb65 +105fea1b3cecab53fca1d10fde1a8823 +2887d01ae3349dff6c04d5902a5d6e5e +6a605a7186f129ee54393898a6d9f4b0 +5813003639fb8751dc574567dbf90989 +114d8997f2920c105be850fc6ca8cdc1 +39d49ba7c06cf79caa00531b355e754a + + +d41d8cd98f00b204e9800998ecf8427e +6281217d898f4f4b066633b4de211374 + + +066af2db95d9a1cfc73bfc347f68d154 + + +d41d8cd98f00b204e9800998ecf8427e +638b941ae4b6d882194e84b826fe80d5 + + +d41d8cd98f00b204e9800998ecf8427e + + +d41d8cd98f00b204e9800998ecf8427e +766631fe2113061598cf2b70c4367da1 + + +d41d8cd98f00b204e9800998ecf8427e +f3759ed275b1a7bc355abf219ddfc20a +296b5b4000a78d2b6641d6f87b54b1d5 + + +d41d8cd98f00b204e9800998ecf8427e +b3557974ee09698bf75f5908dce5ede1 + + +d41d8cd98f00b204e9800998ecf8427e +1170a4d844bb0b829cf85f02e29e2cfc +3e693506b63ac541c1463b20ac446350 + + +c8159d7f239eab452f238023b0b11392 +1798725090e74dd4d13d14a8a5533455 + + +d41d8cd98f00b204e9800998ecf8427e +4490cf4f1c7d53a2562bcced23e2b880 + + +22cb27adf9a761ca0cb76e0e54b71890 +3d9cc4ec66df38298e16365e009dfe66 +26c66f78f5db62e9af07cb11280afc24 +368d57ca80f31c58192581ec7ca7f649 +5c25310c78417e37fd75c8769e3c172f + + +d41d8cd98f00b204e9800998ecf8427e +120b660df099ef9207e084810b95643b +a0765816715c1bbe18e9f87846a2b710 +28d24390fb0fc34b881439a3e1fde041 +f180d27636c3a69c402e244791499c59 + + +d41d8cd98f00b204e9800998ecf8427e + + +0d772a38306fde52cab75b8a42b45688 +b829e1c2687849a67387ad8e4c55404f + + +d41d8cd98f00b204e9800998ecf8427e +ef1cf954f3d42f0812e26142a6704e0c + + +aace231a5cfec37aceaf64e87a6985e4 +562e10fdf9aceb3c277f6d9b13d98fc1 + + +4c09ead3612beefe457740591551f103 +05a2e51b59ec243e96c710c5a05462f6 + + +a05ff7085b07193b2c2e8222b4a049b5 +6ddc99ed13c9297a09bd1dbebc2685b8 +3ce8b7b6c087edc1b162861dcf29ee60 +7fe43f107fd4873f0b7a4750888b0e7d +618e818af8dea17de322d782157dce72 +1e0c1dc858a4dc5d57c6f5dc4beff437 +bd499cdcff25d83aefa453d16327fb31 +bfa0bba21e124aa73b63eae9b9a6c47f +4be815e975625b73ee6e925d97b9d1cf + + +1736b2041754ba66b0f078d8e1abaff2 +669da5a688185e4b472e7c0d8166d149 + + +b2b0dd629761bfc7fd5b8d2d3ed167f7 +5d74f87d9094023a958641957469a45a +432ce2e547c5e3f33850a064c373ffec +829b1540f684e2828f877e3e4d551734 + + +1559f68beb136775818d5ea6002cb2fa +5eeefef845922b742f3c8948728d93d2 +53f705a8191c09c9a14ba304d1ab46ac + + +9a756c5551ae9339d6e1d852c17174be +ad61a40e5452254cc2c0984b68f3100c +16af6f6d04e4cd2180690cfcab4a7f9d +f0c7e782bd7bba13c9662714c7b8b08f +538514e549d114f3d68b1d54200857a2 +5c8369ba5b6db0212bd4430bf2dfcfd7 + + +449b52d23d51c23ed29877609090963b + + +1761c41741b70f05925340d5506387e9 + + +4f196e19ed8ad0fdd14cb73c93fee1ab +2f0f661518f1dbda9eedda2b6bee734e +060e9e0bb5a4e5dc1fe0d2fb20b2c801 +dde71309b78bdb3b366654446adea123 +6c65bfeac7e5b5b28af498f2d757f3f0 +2c56066f59944c0167a8e4321f193913 +5a24be2dbcae65e78db23bf732ae39fd +b4f2152a14d790847565aa176161acab +198d39094c81152155f8f35108845bbe +05e8b4037cfbb469f9ddc37e8fc9e970 +5468e59e8840a0a6799d6db5d36733dc + + +778f8940843f53dc769d8058c68ab83f +70dd831c761a20467a6ba9e5ae736f91 + + +6318d2b6f7fc79b4ed0404ffbc2dac1e + + +66be5c2031ea52e84d32950433ab9e1e +80cf4a974ffe1a69b6d6b85abb391d6f + + +59caae8ab95b2eeba9444ba219446c75 + + +af5ab9d4a4d612302de8ec9585c2490a + + +c1f4b71c61e227690c2a91f5e22ee912 + + +028b01567cdbe95028d6badc35611592 +6602994ed72d4352ecbb2c9850146b09 +a3db8a782df812506b9d6cad27f8e954 +473ca9e5542894f994dede38e28066b0 +d89a7e86895762a2607e598caedc34db +3e013fd6dc388618a30da7a3f1b5a8ed +dae7a05de8492aabf5292e1627843166 +fc565819ba9a958ea560b84032c25423 +0034ffb7a27471f3eb757631582f87b8 +2b84890e6b3235715348b30628a7d988 +0ffe86a454e9a2e570b96610e0a3555f +cd35055300e57f0671b50fc9c387efd8 +7535a09b90cebdabf4dfb79035e945c2 +7e6e4fe81e0ec0764125e763e637c8dc +0a9ebc5aee36ab0a70d52a64cbc6a8d0 +b745e148ae7a29be55d3b468c02358d5 +1f0a736e423e47f3d8227b20a1af8a86 +a2edf8c5e77fa7790cedb28ea673adfe +d5dff411425653893b2da14d14eec340 +a22482d39c2459c642da4302f3a8e1b0 +014d8d796b91bbcd60b3eedbc75863c6 +e12203a069336f9295ba7dc2799db8e0 +a34665a76b93875acb85a2aa370f3607 +920f3546842878108f3e2b6ee8ce5257 +b96a4e2d85b9f8c0b9eedc62d7c4eebe +7786d1011b89d457e8e6b93e84cd82cc +ff5ee012df7e6eb1b184496b487b502a +8e807cf3b227b692047cefa6853a6d94 +3dae2c76a373126a1e0f557be13388e7 +819fa45bca5f27217ba7548bd5a7f845 +cac02cb00571d77e1e4c5b43d255304d +0865eb4eba2e849d7a0695907ab9cef9 +6e549c4c7afb8a58163c09b4cb05b9a1 +763755c2a64da8d115345fe9efdc29e3 +c91d55c71290f701def881a2ac4c187f +b46ae112d32a7bf573e91e1a5317b1ae +7a9603c07c7c3e954696f19521a15d73 +214546da09bc6e0308a2ad20b6b3044f +0ba05d36d4770ee2b157a429247fdadb +5f826dc572e1c8dcd3c558d780ec0063 +c034d80005cbbe505d978c18200358d5 +daaf526c37518f8f8ab2f3e94ad484ea +4f2197b4ce860bf58a77fa2b3d13cac3 +7df68de6ef4b2321ad1fbd2b99a17a40 +4351922fd2f520fda06d12a2b2289b3b + + +befacdcc4c5bf6a333b8c82fbebe282c + + +278509efbcd2e9f657549d42026b8bf5 + + +96e717a4a3dc49d675258c5f28825006 + + +77404b5590596de508a542979f3cda84 + + +a35562e7cdd0b804bd17ada24f7ce67a +7acea37f626cfe23c2ffaaa2238b9199 +f6cf516b7a668b636bce3c5d02f4761b +3b0a4f3b0163c594c2edf81e74c5376b +a2429a31fdd47c1041ce0251c2134293 +d0e3fb63def4c4ab3adb6106526084ee +0db27eb29d36875409041464d20c7ebb +d2a8d93b1fce8d3f7d94c48f5b09a8b1 +5b06bd221c347124078cb9f718c9833b +9c3dee5474541512a47b8f597fe8ced5 +c0f621725c1a854f5883923c10774c78 +83bcea63258aa7e2ba9b84c363e1dcab +96a11168844b45dd2fca97f0bc837143 +38022cf76ca5323acb76f40157455a33 +f1c004946d7ce517f2404c1503ee9743 +90266c6f598dbc6cf93a656778f8b187 +19179da170c46f684b02f761b92d1105 +20706e57cf4f66b384e1c97f4d979ec8 +ddd8c57cac45d04eccbaa0fcf34bb16c +32b424542cabc58cd1b48d03faedd6f0 +9ad8c1b6a3a1090ef1e9ca2cc4011dc0 +927571178a7bc2392ddf51ed9c7671fc +d3302c5817c5e14efadaf79f8e60289d +7249a77c5170e115f8cf2708e549183d +3fd47d203a4b3cc1b81dfee881147e25 +80559b296b0e6a9d5bf8c874f87926d7 +b58fca4a93a1198c875274945f654449 +d9fc51a5f9cbee44a00ac11d054be3d3 +d8f1f839d819e5a5422e19c9d846a26f +4776bad83eddbd7ca0b0bf9ab1268a4a +73b48a65098d2479d6d17599d2325eb1 +d223d3a210dae0c8c4450d2d767bc0f8 +80d1206a9520fc1d5c0514bb5a5f96fe +82b2d5fec7e2ddff86d3c5317793ce5d +311ae2c1c1e88e46f811fbdb1aa0959a +7aff809832eb6487d3c2032d3e42ca84 +c779d67662315aae394469c636e9a503 +191fcb39e7ebd469b742960329e960f2 +4504e1996db85389682d7494173f52b4 +c5893d068b103ca774c452f53231f2d1 +6657d900bfc5bc7e17b7d3e59f0bf5f0 +1628c9d5dd6258b71e6b29f1828ec052 +ea8f05f3e2dc69ff98dc16cd23b3a88e +fe101b83892261f6d154031e760dc8b0 +1dbd2d84c6c8de8fbb57cd9bdc36c6a7 +f62d66d8f69ade8f9ce8813ef1478415 +4b458e4a1c672b1b46f0527067f5591b +8d7e4124317ef382bf6d0a287be4c46b +973f3cbbd4b28320f06640b6f6863f6f +830de31b0ab7362c161f3bb33321dbd0 +b76dfbee5e2d20e8f8dfe1acca2eb3ef +953b41e51544b16e28af08c8036ec664 +7f73d5e04aab56c6a59cb8ca9b49b3dd +fe4e06252d5ce74ffc29c7f7f5478e77 +9e11c7384ac4b7e6123e18c918719a2d + + +fe6176c431b43e26a961ab3920734dbf + + +af95de23736bb1eafad749b899ac4d40 + + +2da765d2b1a8e8992a48a676b956db7c + + +952e216a7803312fa67ee61c06f3c532 + + +a39f2e668c624cb0b7298c633486caec + + +17093167095a9ea2f4d7015fcf1c039b + + +4ab54cbceb647be525aab443e86249a2 +6d10783b288fe54b3e50f828992d0745 +1415a98b14e5cb9afe748c674bae25af +030c9387085c667ce9014f8f17dc0908 +a19b5c291ea2495e2432a27a54353606 +25b67ef8c30f1bd5520742c943025538 +1805943c3c41a0aece435f873cb86703 +95cffdc2b1e72e9b8baae9e00aff08ec +e38d30e0053468a2789af17d38f9c444 +457178c3e1e5a10eeab9f0f920df8926 +93e6fff7bffc55153d9c2859ac28e48b +ae7676fbfbf82586f79479b56756cce1 +11510868ce8e8ed585a6ad563ee22a9d +0813f938cc098ddc751cbef6bdecf7cd +3d403bb930953d625b0a771484cc85e9 +e24a05f22bf8f9d91fb17899c3ac56fd +94ac3c915312d3e4445343bc99be0c54 +0c7f9b9d0824505bd03fa82b4cc753a3 +a23c0a40efc09de6a7640b5d0d9f4bb7 +14eaed2d73022fca3bebfae0052b0c6b +c4b9c95d9f742081196beb6e72ded20f +a1fef4cefd9e43603349f8e4d9775029 +f3f0b68b3af528ca89254103743c048e +166b5085bfb3eaa3d73326a8829a34b3 +640883a64b98eca9219958f0c9a3c777 +1b3f37880568ec36e07297ddc71e2baa +9683369b3890d4830e9e0ba0e65743f3 +5da336a24e940842244ba5365f8f391a +fbcb93b073c2737f2238a68e0e8d173f +bd17ba6ddc0c45fa6b7b7dd3704a88d7 +a8642b488c4247b15aa815bd0fb20c3b +a0bc93f53f35404900f567504449f73f +b1f0a29724f70701011af095dccf9da6 +68b71eb39de968b214aee59c7aee63f2 +746058795a92d2278489bdac1c9eb850 +82f4dcbc8b788985f547dccef636c95e +10c1c4d475f9050f55a4f30d321f68c8 +3bfda8ed81210d7473e60dfd1c5fb2b9 +a6472d528369b797a46bfb37d6ed972c +6d10783b288fe54b3e50f828992d0745 +166b5085bfb3eaa3d73326a8829a34b3 +58d03455e940b51010a2a56a8cb04ef8 +e9421d09d8e14616be9571c92125933c +71a6cf09e9f6d0f95ada2ec5d99b3865 + + +8ed32273f32368492ee999ecd0aabe32 + + +df3e567d6f16d040326c7a0ea29a4f41 + + +bfa0bba21e124aa73b63eae9b9a6c47f +16af6f6d04e4cd2180690cfcab4a7f9d + + +6105439c866957299f095b3d7846bc23 + + +271a12927f090ebc5287e8b0b5e9d9e6 +fa289af1974267e9531614663efea272 + + +b61cb3c36c0363df2b0ebf91a8b814a0 + + +5ff2733687ed023674151563277f9606 + + +2cdcde2cc55e76e3bbf24d02cf0d5edb +800020de3c5e41aa2e1887c2fca17095 +b2b5a3ec23189f079c587821b665d271 +87d3ebf2feaa2b176b4eebbac3c088c4 +3627aa8209fbb1c672443bc6bdce8923 +4869bcd4fb1502311f94519cda884950 +b7a2f3050293050b58a79bca2cd9833e +7674233880679083e8ff7a23695679d4 + + +c724101436b085bf318e695fd784d658 + + +5fa3923b76e77bd28b072bf20bb0acf2 + + +ce2c91ad6dfd86639dbd6fad1fbef509 +31f3882cc425568f4276987a0aba2b0d +272ead8eec497be617cc3d390c427477 +fd9e4859f8b774b936461669096cdf31 +b340ddf06546f0c481260cf31af607f0 +2cab0bd74fdd7b997aba318b7c90eed5 + + +4fd58f34401bd65ac6e428a695289076 + + +02087b98d2508beeff533581d41c148d +502ec066ce17658bc228175aa6d2bb51 + + +8a4d45166ebeef73e222270a8113d66f +fc667c4366fe133c30ab122fe2ee7f20 +b8650f06582ac88ece68948bac1bf734 + + +ea413228af8c99c7afe67a10acb0ae39 + + +a6191ed337fb956171397255b5b256e2 + + +e9ac9384237d8d1cdaab68d31a22005d + + +8c10865beddd7b64913db21f12059c64 + + +d009e5dbfe5f3a20be203586165c6567 + + +cb682e94976a833702918c30350cdf92 + + +26de1f4efdbea90dc07b2d66d9e98f3e +33dfb82a79bfd5cd05b336e1c9d7e972 +0826365fe3595c15372b8aacbe0a050d +a86fe4f29f0b81bba412d2d443538282 +f5774b1f9313dd43fd39a7c1e2c49c98 +f2fe25865fb26d8a60799cbb700aec31 +3a16d03720c344ace88ac9f4557e5da6 +dd52c331a81417dfa817ae740317e839 +726f61ec81224067b92d3b5c8c66d16d +89fe2062ff820aa1cfe0d73fcd75b8a0 +83e4d18f829b194bfeda62d7374a7706 +87f8ce4d8fe767f9ad78c76b54dcbe63 +7bd02886e8a02672e68d7f9ca82989f0 +c8cb9e2990d4823212d9adbd3904d612 +135c15c8da02cbddabd2830ff17f1f90 +673d347d114623bc685bd6960a975b98 +b0262a6867fa221fe3d1d1cfcd0c55ca +6f906400cf7764ee9b99c5f062284a33 +f7a43d21c05827078185dfd3f1898a0f +c11a232f8789d4c81cc7b99ed6a5a6b7 +be80996f8def6c9a756f99e2d6ab063d +f687c08e85b9c6d3b98ea103e274285e +36cf39ebed632539610e00972d066d66 +c84baa08f37224a274adeff9b38857d8 +3e77aa1c3743a9e66ad430d565d5bba9 +d197d53598e59e38d6b53e4493878a37 +3bf26c69a67bba08b33ab9a1cfa913ab +7260e1fef9a19946b0b9997f0835d28c +1ad9babe1124b8ce470d94369c466cc6 +34ace00de3d8f572a795b92afd8182e1 +1dd9c8b444e2c6bcde222d7480a789c6 +3a05dda84962024153be0c897f7fce74 +b35cabdd2609ed64c6aacfcc62de2d1b +d96b9150972b45c9d342d631733e2adb +d61f773d2fb9d3c45fa3696dbac3c9bd +7090962dff4fc5fea54bf747f9762cb4 +27269177df2db78584bc130e8da427b9 +ccd660c0e96ac3a5bad8c55c57c171e3 +a379a744cf64f76e44191fd83ae5660c +dcc4141b642e5b91722db9fc5641c3ff +c404a5cb3e2d0c7dd3560e6db70dc0af +e76061a42101f521a01031aef0759b24 +158e329a2f7aed3469479f8f9ca4017e +43d892662422c27d6d6da3ea4a84ea14 +7da25cffe11482c608af3eead69e9a72 +512f8fb3042cca9b5492906df80c8d1c +294600d0d52d86683cf6b17fedfc1794 +97e9ad68e43dd571ee2dd32453b579e5 +659a267cde3be07c1b3ef6388ca5b034 +f4e01b5d04b992dbdf05a536386e43ae +9b1fa0f7b10bb71d25926e108bd33a7c +194a664f4110062a5e5fc61e4c41d380 +99042f7adff906f9933d08a02d6d87f6 +7302e05f5eba2dc64003cd74e1c3fefa +a4e35b5662f37aa780b2b665625e9e3d +38062f6727bd12537a6434bc070d633c +b77d5b396676b9018dbbb98dfa3540dc +764fb4541826961d8b07302fdfa19855 +31fa16bfc0c36de373ac2aa9eb44147a +e817fb4adea53ff6fec6fe9fded710dc +09fb96e516325be267b5253ed86ddcc8 +aae28f0dcc80ea5771e96fa2b85384b2 +dab061d0b54998d4b61de139a368c9dd +1596278a679167aeccfa3ad3ce84ef5e +49af03a5a811b6c74ef0b1db74b0ce55 + + +33a20a15ff624caf095a70d941844501 +86414fd484ecf3d234ed74d44a654a12 + + +e66e9eb7cbfabb44ab0ad0907e78bbcb +5d71f443ff4a119b970d1446eb9e4331 +9ba3289e9a9cbcb00ad24cf05ee61052 +f85c610b97db0d0c6d9a4a080f4fe72b +1248dd3c3036921f8dfc9a029acea033 +f03fa5a7df87681274d6d7bd6d450ced +da32c073db3a1981a3ee939f99b49285 +fad40b8184678de95bb0ba0b81fec208 +edf0938b11cc3848f8084b68a31355f9 + + +56c557bdd702896e8e076c3081e473b2 +50997d9fb65b02489760c78eae407edc +3fd7cce0383f0a53942f944e744bfb2b +c2e66f879f8c7063b30ca7e69f31f1b0 +c45eaec9eb14a27da49011c02adf3a51 +a11dff5fe4e86ecc62be49088ffea855 +4cf6cd7a6e0d99a58e3b1745aeb27199 +7b32bb71dbde86104e8a2651a0f678fd +c9a17a1c85b85d5d306f529c8a3adf46 +319963e6815ba4311bf548ca102ee6f5 +8f34c8654f8e475af529e3bb7459f54e +c0e04a4fddc99fd59f7597b5596ce974 +86b708daa84d59d331682bee9892e85f +1241ba263a9be7c581f875fb4d1fa7c5 +339da1ab31dc9cccbcf13e19787f32cb +0bdc181700120677a20a475a986713c5 +7ec2d1bc85219648e666a51798ee852b +16845ff77ddf90cc0ecdb71b56af8ee8 +69703c2680a20175e0f6ff614ac78058 +5e1923144f861d00820902f847f2eb85 +e6db5f2f060d5f9043679494dac018b2 +c5ca42e5b9a303dd6af35b105346e4af +e871685a98946ca4c8b69a788445f1ce +03ab5f4dee17c243959ab547318f253b +884910e45e2af8b06310473028b89efc +5b9638d72c2e3da6f9f2f3065f0bb838 +e0b821fb1bd51698f9605a5f10c412ae +1aa7a4d31b327012f0d82767b1d3c2eb +87414ee7df77d4c9d1fe67d5f1cedb57 +6aab61a89be474d3834ace048aee8215 +c0cf1619503636f2e510a4ad4b5ddfe8 +e80d05e8f07bc7a9c28bad9218fc3065 +aad095174c7048e4a69870115ad6b31c +db3c9c925a27a7b21639195b99f8e4a7 +7226d89117fc5ac6857b99c8be92bcc8 +8a8b1be3faf887f79648add1f27e1b27 +29a83e90e646d322fc5927f85d4852f4 +db06b5525d74d001f4d5f0cc6b34a12d +7d75e3b46ecc1a8e9127999c2b395343 +5f346f8ec0669638b98d39313d395af1 +cefe770c34e74c464ecfc1d631e1ca7d +a7d644a48b076360087a7a79ef16eb15 +019d661924ad0e08fba33d4640062948 +a9e4f979c124b66bcef17fe804848dee +db7179a1e24cbacb8e38d9aa20649e91 +91e614515ba574d4070c122565883a73 +519bf115c5c9e778efca8d4c102d5047 +76f78ddf57c04618eeaf91bececf5070 +b66742d49c03112fdddc0f124674eda9 +2c93bd8b0859a6063fc46e9936349be4 +89da62f432454d38e9d390c6755045de +339da1ab31dc9cccbcf13e19787f32cb +91f86050486e00b05570c05a19fc19ae +01255ebdaee025b76aba812ac120a8ac +74f64a752fe2e6ae40410c0cc8c6409f +0672e3b38e39e2da6b12396046b2937c +0016a818ba0e5e80338f772d496b029e +cceafae6cc15d9f207d1343abb1ff87a +a34ab3d3db924dd1d886b28355b7175e +a9534f82f0bdee1b54ec994cd1983701 +3b4fa04dc11a6e53545ef0477ac5183a +234f6edca3b318e354044327427104c5 +68b62695aa7282666496e8e717d50d9c +75e036f626780dbeb1dad742acf50799 +49be3f76782716d636811a5ec6ca04b1 +a71bbb5349e4cf1e586f57a3d561bb69 +d70d0fc33efbe51901ad0d0ea441d086 +1fb4d036eff2822c256cb5fa0d23d220 +91c5d82c8305a0e3e21d16b1eb375660 +a733db7d8ef9106107b0810d2d0bdba9 +b62825ff9f9334fd7f805a5a4fe8d5cb +22643a84c533ce44120c10fb36eab40e +5b94dbe7748b69a93e0773d961faf144 +212ec409cb0cf752f27376cc5cafaf9f +10335c5cbc53b01da174fb889eb182f7 +4fc646f85aedd3f6f2875a164839e864 +6cd7b0f700ef9c8a4f198075bad202cd +74ed6ef670b00441f37e64c157720ff8 +1666e8c4705830acd13ee691a4741d55 +1f30aa3f9407a10e4f703b1af6b16f85 +db621a89d6126c8926c2674d68701e4c +e80d05e8f07bc7a9c28bad9218fc3065 +248aa4981a7cde501e58f84acb3877cc +a11dff5fe4e86ecc62be49088ffea855 + + +d0027d668c71a7ad863ee8acce1f91b7 +d6045b65dbb2ba38a4f113f9aacde587 +5358770d6c46d49d3e8bd54f426e6699 +3b0b4802fad7a92aeba2b1e308afed38 +feb97272d66c597cd9edac65acdaaba4 + + +1736b2041754ba66b0f078d8e1abaff2 +669da5a688185e4b472e7c0d8166d149 + + +b2b0dd629761bfc7fd5b8d2d3ed167f7 +5d74f87d9094023a958641957469a45a +432ce2e547c5e3f33850a064c373ffec +829b1540f684e2828f877e3e4d551734 + + +1559f68beb136775818d5ea6002cb2fa +5eeefef845922b742f3c8948728d93d2 +53f705a8191c09c9a14ba304d1ab46ac + + +9db06a7d00754a56a880b0b2840c7206 +9307f277c8eca3d6aadb747e0488590f +877fc4512a836590d97afd52a061a8b9 +0bfbf3d7aca8183b21df3d3e89a5fe8e +e55c1d03dec8ed13c5d3dc07b475a6f6 +03aa90b73362c9ea7992ddebe0c05a76 +8bbcfb26c88be66b335615ace22a13b8 +181cd7e0c4e3aee620bb6b1419143c4a + + +74b6ecca3710147d87712eafb36462c3 + + +7f4d91d401913000068e27694421094c +8e3cffa1da8be98668c562421fc859f4 + + +406082d01ab1415f333b23bceecb9e2c +6cd8f5c9f1717ee73ceba5683d9a8a8e + + +a99cbc0f37a87adc024e1b73c90f020b +f7d3b25b8383affe405ccc7d5520a037 +697a2829a99eb956dbd10748c117cc78 +00f978d26f57a925cbb25655a8611582 +a5dbc5478b058344cab126fe37e81205 +ae24380f9d45f4b7bac2050ce8dfb3c8 +ae79a19f64be5aea70c115f8255dd835 +441cdfd7ba1feb089bc3a423d068f9e0 +baf082b9e90e7e4d6812bbf0373cc607 +e2cf998acb9c8017f3ceeff4f583593e +a46fcde339e4260686e19c1074ea006a +9fe7f36dd10f438653ed48ca9373137a +d3134c6c9a847c3459c89ac6a7e29ad3 +3dadee4718b9777aef137e589260ef71 +9e574aa8ef5742657d4761ea590bcc02 +b3b6cc0f994d14e8a62103c8bfc21882 +df20aeaa69ef080a06060eba30d1e658 +58c4b49556ec3db5e02b1cbccc70b5b3 +e2983c0de2b9fb5cd06f1b5811e7adc5 +6363f698668a40602f462850d4c25f12 +e3b9a6128f379e070c4b5899707a0602 +9baadd2aa9e1de012fddc697c09cad3f +57d4381904bcc9a1447b416b782637e0 +98ae0c9ccdbeb50ba601b98bf67cf6d8 +e304041ed01654e365947acc9fb1d14c +b928bdce0d72bed17fe44576c42982e4 +46a3b08d3faf5bb3625bc38218d47d3e +cc19e43dd168d6be5e21701a6ed7e32a +3a5f3bf957587a46b9a704956ff1481a +deef6c173ca516df1dc003198865ef82 +213a4fcd11e4b256bea106c5b270ceb8 +fd3527c05093fddefcbf6211d2894c2c +193d4af6e0e6712b7a209fd67e93abf3 +7603a607972637b1c0ff71e2596527ca +9f4c93b61a1c68dd9bd30039a29add31 +82b7ec40dda186fb73fe7cd1ac4fc1db +d1204c1552417abbd0552a30f9518329 +3a004ec9782fe8641061c737bcc4c5b4 +11116f8d3cf5c4ef1be973f9e6abd134 +3251760626952fcae88770155112e9a5 +9edbcb7c5c4a7302017327b91b101a0d +85145018ad16e0ab05c8f50f61e0794e +0539ca2a10f92b1f7e2d2ae8d8c8033c +90a818a12527d815dde625cc0cde03d8 +28daa476010b8e6e78cbaaa8568a6611 +4271b68296af1b267b960df4e1794fe3 +69ce2bbcad4a3ebab718ee1dd8d712d3 +4d167ba23f487bb71f7c8d2cbec38864 +1b1c432b9dae46e45d8bb8f59a93b0fa +ea27fc1a059305edd6a37bdde556eceb +2ca3a315405f31ee3b8964a3a46989c4 +d10483f203f2d03ca7c2d05b87ae7bbb +8439670b64da2645d451a6b7fa17a75f +390d090c861a2fb31df9cc8b61ccd3b8 +7833b5dbb1acb30e57e3c6b041b21f2c +eb2bd9a3a7ac1a61a4f6bcdf81ec67b3 +dc4cd9fc4b1168633b3795cc782a5321 +d60b5ff021116b6d23a72201fd71fae6 +f804896363c3c3fa6efe77015da7f7b5 +8ba7cf9afe2511eab38617b27953a20b +e43a69585d1b9a065c06fdc43bf05e9b +0b600c49e6886b114468455404dfedab +f679ac711c84e892be1c2e6360661ea3 +6159fdae83bd1af5e503ced6c485d7f9 +5b50d480029b579c532f51bf70375b3d + + +69093bdaa5daeae6c38aaff4fd56889a + + +2b250cf01dc18e37e2193a957ea8d4f3 + + +00f9e6921782590db265fabe0385a000 + + +5c2000762f2496f6dea7c85d5e76394b + + +2e0fc091488364fa5dce78e28935f772 + + +d033e4f6d584e6c005ab98b75cfdc791 +d033e4f6d584e6c005ab98b75cfdc791 +016f786cfe21feb1af8ef4139fff7b90 + + +ba0b6ffcbfe503f0b4af39f6d292042b +ba0b6ffcbfe503f0b4af39f6d292042b +03654d950ab0ad4ad32a5586f3ab7617 +03654d950ab0ad4ad32a5586f3ab7617 +f832060d1857f1e4faf65d15d687ab43 +f832060d1857f1e4faf65d15d687ab43 + + +016f786cfe21feb1af8ef4139fff7b90 +a73b8885237ec16124ec960c5ec5af11 +a73b8885237ec16124ec960c5ec5af11 + + +e105f20bcf593d08b574d666a4659fdc +b288b09cbe915f05d94f37b402547e1e +a91c20099677f7cdeada8fd1a0fe90f5 +d6293a67d76f33b7fd8a479847589517 +4d90073c0ff78733556c5d39b861581c +59a0fd9ecd7de0b42d8295fa58e0c2bf +91ab25c960808374d8c43cde798d271b +b49063e50418e2d19b5566e588e661e8 +f4b4691d1e7a01e3b662bea34e79bee2 +9c4b83283c96a6ae1f63a556933c9d98 +5737b4aa9ebec80710fd46a3920822b5 +329247bb2a92a2fcaba89e7ec980eaaf +1f07177e6539cb5747d29ae51b867669 +944f5bfde4920dc5075164b83475e264 +9187a95d9a20180f3f520d6a4dc17107 +f57ea9c530cebc193afab16022342a49 +810f1f8ff19faaeffff0c4738db008f2 +bfe22db4f51e8a452666d894c43b78c7 +96f101af9311167f4ecabf15f2215b34 +8a781f7bb83695ba35c4db1a77a575d8 +00c41ccb3dbf4b9f5320aa0b07ca6c03 +67a2b6cac6b5c64a2cfd977d2262a736 +f03f9ba07ede1347f117cd6c47de68b5 +c897a6579efde9449f38572c02968ea2 +7ecf64cf4c33beb7f731a2acd0ac509f +9bccc0d5f26adc27cd1d2ad25da2b340 +5a78236713f3d2c88291eb069ec7b0cc +b744a252a876b7ff3cf19d8fee208f9e +6992f9b3ce6856117513bc470b021e23 +56a003fe558d2e69229d2dd6ab5db6cc +c7ed58416f23cb2060943c032f5fd713 +8d395ecfd1534bc52f2697ede733558c +554aafd4e41fbdfe81d88310ebeb8259 +776d3e7b0b45496e666d0c222d2895ec +6e27b0b67f03b2b7e9e27c6f73bb40da +cdbf2f00cc40173559dba34b0407ec91 +9a02ce2013a481c64f2ab5323ef9b377 +3f7ec71ce8bf00af32d17edada11ab81 +8c98501f49d11930cd11018f5b67516c +e4ae0100bc2dd1dfa8f9f9792e5f3c9c +3f61d424e62d222059e3d9b114e54573 +3e9bb121320670472c99be79df37ad4a +878398701d2b4f92a79366adece358f8 +a31bcd82061c1d29aea61767fb4d9534 +6e6992107277cb5d6c7dae437de22a71 +5ca808111551091c45a6c6b91a6db684 +f628f08b549f90df6f9332a24a097a14 +22bbf1056712b882fcb0e3712b8500bf +c701b5d076dec29b96566f6f5ed4cdf8 +41fb79fb13d479fc297555e981ef296a +ecb65a697fd592b4149e4c0a56fc6f37 +e429800cc74245f0343705f19db80032 +c3e33c1816e058858501bdcc32914525 +4f69cb8660473547df5a50ac5b16d106 +750372f7968345d08f8e03f99d085fc7 +3a74a2e94211f9966f39701c25c24d24 +f67b3160455accad85fb4082d15b90a8 +83d7d646a25b170a42992a58ac9feddc +1d1a12787536f6c18207a29abe45310c +3a536e553fae15137a315e22d602eb01 +90a78dc63d3bcfece5d0d02e19941e5e +f759e454f73d38cebd808908be3ab19b +d1c6fd4dd062fa5f23531e9f99f7d943 +5a41fe6909b58519b84ed41047c87a75 +79cdbd1a21e1a76da2cde3c44e94cb87 + + +7a60f63f2ed6ce4b34b69ae8a12b9e7c + + +3c101adddca552fe762857dd51514b05 + + +abb18e4402964d4a3e2e90a1227b57ca + + +8d810500e27b8e755b654caa4df91702 +aee2edefb32ae7de72e8bc2e3a835f05 +17ebed1965f283a0e355a911e67cdd42 +8ae64e6251b4a32ef73969486c6bc677 +d783e773a5632ec96cf785b34c790224 +63edb5dfe58fe647b48fb10076b80cd3 +a28d1de5cbbd5c1feafd57333316bad6 +7f4bcf9651de4dfe4d8bc7396fd3ced6 +fe73f93158162bb96eeb52086e15eef9 +4a6e5690adc1eb3c04cb5a83e1213a0f +b33774833944d2a851d7b6e423109647 +be417aaadad9434b5e779d589dfb83d2 +e07c074f8deba3734bd30033b8a4e80a +1105672b1e2eb65c7548c15007eb4304 +ccf3ef03ed707f213f3ff9134cf0d312 +edbed6795ec27dc155a46ae5f959ee9c +928d3512a0c9d91b855ea5481abd507f +e9ea3271dd2ab50e653772d4175c2fb1 +e296aa6685367e788d30a2837597d450 +54bec3f653978661367752c9e628d22e +426d8c4e93926b42afdf63888639786b +236c8471ed1afffaa68f6c57a5976a28 +665aad81deacfc0a1b9c6f89ad0585ea +08cf5c523fd24adecf802dca245e233f +3a5a60ab0e5491fcce784f387d083302 +0fc4802635927cae7f21af301cce1f77 +0924932b2c03a76ac238c31e55644cbf +7971ee68c1f857464a8ad7dac20985d4 +faa918ba3cbf5c46dde471bf3ff2a8aa +7354ea435851364c370985d7d24d4497 +133f1492dcedd08ffcd818e991172213 +6949d9e4ff130f69e1e9dce9c7bc5f64 +a30e49c6818076ad738baf78e91da858 +19404b76a93672eefa7c381cbd687a1b +851d2b6d36a195c9d2da8810880c3a82 +875e429bf3e3dfc2f53e81d60e6c41ce +ca699b3cf1848166fa4a572ae1dcb392 +b4e13aaa01146c08f44e6fbce5b655d5 +15ca0e1c397ecb962a119f83b0e0d77f +0a07296598fce745fb340b4f226e0362 +9e066557cf677056fb9e51d6a8318b1e +ef4bc9523da3115da39359c6f8a63e10 +07e0d0321008a117336147347ea5dfed +c2a132b937c15f5568baed293770487a +9337c147a195beb432386401d6bfe2f0 +5672b4a1646cd83c8caf4ffeafcac103 +e89f87e3fe4be3c381427546c046f2e2 +e7d5b939c4d10f2fa257cbeb76a5fb0f +5b1c345ae0af8a8b746531f4481a8e34 +f38372dd7ec12c6371bfc69a9f3441bf +1fca6974e13ca098896e13990a5b2702 +9ed5fb2c7a78a2b99198bc9ea8ff36fb +6081d09eaba74eabe94d543b16f41a1d +bbe779c69c7c34db6137c6615d59c714 +ffa8b499248bd19862899b718ee06032 +ad870aab20024333f5f00dafb69035e9 +fbea47a45ccf651d66b9773af098dd96 +7f278921f0a176026439244bc1e17f99 +55499dfa3ca8c63dac57c659336eccb1 +f492346b0c82d7f7963b0ed24c452144 +9c6a59f403e1912a41fa839067582b5b +4effc64ea261d49cb41ef4eea26c009a +fd4ca56fa36bc5b6eb5dd7027e564994 +d6a0c9838da7670e7e0e743749adf31e +c3d392446f6ba7187b33bb74a79adf3a + + +7916791c506e6d9ba5c997b4b139500a + + +b02b670044deb0d0c6c7c0e08e158d9c + + +b1e7296ca42039d382ed5a4af666a4c1 + + +46b2c579d215b307ea6f519c47682639 +f0d86983e280b6364b2ded29791ce93b +7ee09d2d39cebe9aab818ded8825d6aa +8b118d141b8b3e5083cb8522796d00a6 +812e0b0be7cc0485057a51d49f3d3110 +ff320977a1116935f37ac576fd1a0018 +473c75604c49b3ce9e6ef0c0cac85744 +ec2e4850337430bd8922868931c315b8 +66f920be1d1805e448d468eaddebb4d5 +d34dec52f1645063a35e7ea06631d1df +7f52a8c1446a8b39f3b2184b4779cf78 +a5a9b42f09fc50663bae6a30866a85c9 +879a8b36a6862a9f3d16cbde68ef2b12 +7b9bb98354bfa0cb4c6da385185af33a +6191751d51da5bb0c0e50115607c263a +fc5f2424dc2629f1fd66cce3583c0a5d +e21236622a913d00b91329f253b16cb7 +e9ece6086374f3b96f30d83685c43866 +c532162792df71becfe1b557e4615ec9 +0f0bde0a6e9b373263ee14b02668160d +20a6e8978c06ff0d0c8ba10e62b70567 +ad3b074f50b800059b97ca1ba186daba +61a80b1c45bdf47187acd4a303731128 +ae174e3c3923d123da4ed97c38206b7c +7e4a4f85bd80b6d27ebee757f00d1161 +5213815c80ab888e913dac33e2cf49de +73ed303d1baa66412a591394baaceeb8 +fd1e90e63ce563ecbfc3e86d51c9f959 +24c29902d209ca376efbdb43b313d288 +a33c54dafb734391d511d72fce28f535 +27b25332e3538ee896152374d3d0cd8f +96d7eea17d0c1c8137b4b6011173f6a5 +09d56d5a100b0cdf0a6c0a0a4b2d7be7 +8bd60a8db03080080ddd3db86db612a2 +0c283c2fedca38ac515c9c38d0d9833e +cb73adf02a7a885af1fff21930af635b +648b8ee67b57a2131a1681e7a085d1f0 +a7c255677fa6ddae2000a54d99967c35 +73c2cf52c013db3a34407199cd61e01c +bf2c298ae86ac9a9017315f0efc062cb +38b6b214ec3c08716a4df82ba842f5f2 +79f24d886bce41f691dff2a4181a58be +bcfbb9bbeba0d02466f2c3e0dbe5d5a7 +26698969f814885f602a6e98cc0ab33e +a6567409e398eb1be6c22e9e7d825a30 +9fe7697855378c903fd6ca477e39ac3c +560784bf56f8e13f2cc6704ea91a10ac +4d064d20d107427da0985e39c268dc16 +13adeb185bc4da1f790d1799c57a4e5c +9a67c1100d37fd7f8e6d516b4526f06e +294a361cb7917e4ad72720426d48f2e4 +f8e786710ced1bbb94a512a87a729245 +cef0502cc3063495cf0ed8589d5faa1d +01449c67cbeaa2a8cb389717019120f6 +2ac6e19f28ff7a279f44dac7b403cad9 +a702e1d81f743786d0584078dae74555 +03d5b8f6a7e05fe561af8bbbe3b39b9a +dfd26c7ff7fbcc37780eb8bcbce4b853 +67d575f4441b2cac67961b696b77e08d +49592f24b459f9672bad02c559382454 +ddbc03e4643c8edc265269203e1aba65 +98bc9064118e90da2c3b75b6b1c18d70 +159f965140bec8fa865543d98ff658b0 +b985d77653ca5153e9173b5414df5c72 +a9a21e63f4c04330c72b8a79100996cd + + +505d35a020c3e95a860024c7a5eb9eaf + + +f1d0fbc57f779f34414f4f0849c51b17 + + +0f8445add9c19fc76f727d3d9974f129 + + +85567169f77de390688e544d315fbdfe +d2f6e04c2f462935d7ac0a39202459b9 +584db3452b60853ae62fbec4f3fed0df +3b54b00adc7f1dd61b7b72846d01a12c +511c1450b8c4affa475c9a72dcfb2219 +e96b8982f3eecd354b8a1309fbf53c21 +f923cf394a3ec09acf5c0be0d09c71f7 +b52d9b6ab6397921ca48c51fe9b920e3 +283ff80aa9ea29624fbc8a47c5256dda +9b4e5f878b7ff58d19bc9048403e3fa8 +6711f6af3acea07893ca4de7062e96fd +e03f6d88bd7d5a73bba6ff78d837ed85 +0839098d2866e61089ba2206d9acc7b0 +22e6d79b5c0256b97859ac2c458678da +792f359a06a98ad61be97c1e04294f60 +eaaa62b79cf78d85b17e3050e642ea83 +c27bb791493a8c3a0897910d1bead0f3 +513f126be06516dc462279e7fc9da953 +9ef16638b24be7b644483ff0be3f6894 +6664f632ec2794f87f873a98f0d3b8eb +7256da17ff5fcd51b04e54cae58b2f51 +18ae75b486d291f425e4358f06c1c9b1 +88e4f96a6a9c6a5add80985a71fda711 +176a4677cbea19ae22bd04e4a5a1a26c +5af78d27eda0614b17a6bfe05ebe8770 +0d9e8f2c93d3e69899463f78329cfeff +e671c0cbdb2cfa50c3b403f61dd50eae +364a82d644f2efbfa3c54e8be3027e3e +8085b21104a2f32acdfa8e54327f6677 +2cf657d8a3c0a51709ce088c4c52b14a +e5e8e4897f6f5255da586d938398f581 +efaf2fa0bd52d1c8a35c5a11c0a8ee58 +d0076e1e08b4f3a04ec3fa787d426d8c +aa6fdf4784b2fb7553ed0b282ef65f6f +d7adfcc1c4d0dd457ce1ea7a83e984f3 +f77e45491b3ae5618b5637bd047ff332 +af30de7a70be80c51c68a7daf1480bca +6fa6584fadd3b270d8ed14c28b5b5e6a +2340ef6647c8df3ca993f5c3bfd3eadf +fbc8855c1dd6e97c844ff6a464be8e0d +3c477a25498dba0e4115a57a385c214f +941ca059e613fbd1beda1950b55bfa68 +8ec7f7b6e8122fb21950c9e2790cbc84 +0ef9eb4728101b352a0e54130bacfae1 +b87d24561d1041809379e63c5b5c13cc +1297339260b5a08aaabd804f5ff9f08b +0bad9c2320033f0a681748c49b6fabe7 +f739d7e5aa72c55076ba3907c51567cf +ee7ed9d0a9fe0111a84861ba65c79a0b +0cb648977481b1608eb0fd2d35cdda0c +2434e9f7a150296dc220efe0f96cc5dd +2d2f350f9332044aba8fd6517ff6548e +403107806865932700a494ddd0026a76 +7c93196f6b6b371a45d1ccac761b54e6 +66fb99008c0aa47890a26ae11e67ade2 +3584fbcd77e1e3a5698778f7941b42f0 +d062b919dbb47927c94473ae74a48422 +2df4268d6719d7d641eb8545149ba74e +a83e83cf3f03aa946ee59ea77e332c96 +098c9cee2e2276d519a41596b29dac38 +b496233cebe3c0ea2e07a31630f3f4e0 +38ba9d33755a22dedac3eb54515e3fff +5a9470926a65242e34cbd5494397f338 +0e585d336d1a97d13cd85969e086daaa +313b3aa8af39eaeba70f90adc54dcfd4 + + +c315400a45f06b307e2a928b8bb0d22e + + +ca4f96b00022fc21773cdc793807b331 + + +8bc05b4906a79fb95d8bc5c3779bea61 + + +4e4f5d0da4f9b323484843d730dd5f05 +77f7069c17acbe7583a7aaa54863a953 +e0da0accd9d3e1cb5601745cb3118848 +97e401958b087b42ee41d47fcbd7cddb +df7cd4654d5e8a6887e89cdfc3e5c15b +e271da98e1b48ffa8f0faba1f52be339 +d63db58d5ca04922822ac7fec1b06be3 +36b928fc1c67ff216aa85b2319b7851d +abd481d000b9ddae6e5bc9f40c052315 +4b5ba2f72d862062688cd8503d709b54 +5d1693d8228a6cc01dd1e3c64bce7791 +314c95d0d44e1daef3fa171cef5a6db9 +6b31066076cd62ac7a2b21039b100476 +bf10a795f02fdf2f7db0b5929ab6987f +e86a3509c0ed5311507200951f740416 +d931f108ba25d7871cbe3b0fd0c9bc3c +0fc4288e8f885df3f3bbd3edc352a884 +1b448fc80ec12b58abb098e95b09e2af +6b90f91d18afaddee24e541942d9e398 +ff4301f1bf0e3c03caf0c022e946cf3d +f8c4707f3a9b67471054b852801dafd5 +3e941d9d249ab568e5845b3dfdad7593 +acf6bad57e64e8fbedff8d3fde78a1de +9b761532aa571c82ee562b49d53dcdc6 +92d4dd57c6280c63cc50e3f7bd38d781 +ac81a7901da6ff5571a817dd995e9c9e +d8208897922ceb99afb95ee77e2d0573 +0c50df79d516083f267b0f43ce5c5eed +483f187ad80c6e7e52dd3ce33a4a3f1e +17115d818e0353a7d69f242dd1e040ec +9c7343768397776cf10dc721ba55f628 +a28a99fba3dbaf91ebb70a304ee3d452 +a0afc5a40edde3c60bec05f463c86c56 +1b228d54f552e0b977a9b104197266f2 +fcfac9ce265a497d4907c6e0fd3f691b +5a4f4e8a830cc5617aa08644b5868457 +dd2a9d6b3bb61736a607d397bb44bec7 +1f2b6042f028cf2f74fa22f5a9628400 +3a4e981e7337eb3ba0d6716b259b43cd +332a892dec0dbd682378267dd6ac9810 +1f58792f47090b2316e7ab8dff0b757b +e2f187970c63bc88bed835c845a08fab +70f1d1179fa35286c0fb1aea8018ad39 +ae26c4a7ad8db871be1c1ffac8f5d4c3 +b6ac82f9c20dde42d1a15dae34d685f5 +09e47f0f49bf06d35d87ca4fb49509f7 +f6a1fe00173e7197d4fbcc1f8bec1bb5 +c2db9127a4bf89e27540dab11f6cffff +8168a4c9369b3daf558cfd0e10f40b37 +155a8ee4906fa6ed322e5038f3ac35ff +b20cb322d689f54ddf4261b5a0c388cf +e88f7e7dc83fbd428ad39d1d0e424138 +2103aaa2430bdf15cb322b18ab97f65f +5e3a5eef3e1966f6c7fef066bd0c5ff3 +a5caddfcff2cb3196b67f25e388a920f +6b019c23817ebe1fd5023547cd978dc2 +7e0672ab53134d15a0630f82428a895a +d5ea0e5b3f4ee59c2da697975cf66fd3 +b494b4e3bd52dd6b2017848004442d87 +589b91350a270fb1e1d415b8c01e45fb +e0689485d20b3d89ad7ada7fba1483d7 +7bb2bb7484870d2f8a1b808587ee8622 +85dbf65b7873a5b8e16a7be35350618f +a18e8625095eb56f92a155905d353847 +d841ddfcf69249b6fea7dad27cff5547 + + +1559ed2016dfa0857648f982d552e2f8 + + +c5a13380a70c3d942c9f47bc9c66f105 +54b267b28293967140a526badcc79467 + + +da21b5ee018be5687a12c5a5de31c237 +133ff41644a3702f60d7a2c6bf429c5f + + +33eb9d37aac780309bedbd367dfa7b9d +f43b829530596e7a7ca5686a2e0c8dd5 +099547d733b446bf5576a9d98e61f6a8 +3225616065c4d6800742c4198d01fc34 +92268d20daa8335e3888b244e34f1621 +a26643c93a91237ce4f902269437aae4 +00fc8d87b30b91f6c7b53f7b07b4aff3 +4f4bad87986619b74e512fa04524cc65 +55ff6a279099f13a30c64dd90d25e448 +6a5b84a20b5d6744c8b378ef774356bc +d672c7ac1364a6c1ae768a8726298e43 +83db029d3e555ba20c33026096385d22 +7771aa687808cb57e8f1ca9b82f9cc49 +b1f7c3f8a3e263904850213e499ec2c1 +3be72ba54273b69970f4deb1c765f2be +7fee923b4bce3c354ed833635fcc25f8 +3cd6621cb7ebf8b18f9c545970472c18 +ff91c33a9497542a3c7d613e71d68cdd +fdb72fb5d64b1d884a8b4f8bfc48e4b2 +b6b19a1f5c8565fa5fd147955c37f425 +37835a005599a339eecccf470297ebd8 +41e8f0fdd4ee766f84ddb8ce2ee8689e +d70fc51a1be7e17a7676400a4cc0e327 +49fb15445f366f40756933f3a7f4a33d +ddda6421482133fc6ebf760e7740e270 +4cd817a326c70db4b25c865d715c9e4b +050efb47569d68b89fdda0728718b41d +2d0c78c2f6c18aa1b6d39647734b743e +e95ccf0083061be790bf0a4c5bc7596a +ca8d3ec0716ce3a9dc106f49163bd2b9 +a4828e471c2d89ad6117658ac6d4baf2 +10dc04fefa6c077eb0fc9d4cf6b08976 +264d5915e61d0d70c292457555a0362f +1ce8c0fb4e668c71b60bca1b713d2246 +36177571aafbbc7b748a6ac7f88c7f8c +a1261ee684ed9c5180b6eeb47c432e80 +74e1dadce9a1bbc6ad0278613b08277d +695f3984b4470225a5b28f73ec31e9c5 +3162dff0d73c0e11d364e83a257d59af +d471282b57726f2e8ebf9a73d1d61132 +cff140b6cd011f3ed1b2b8515dacd71d +2eff43c00544e8d108ac301b7baf06b3 +22744e9c76554e1b64204da77f9df1ba +38e7547ca4ed955bfbf37ad9904d15f4 +b10b22cd5e94f18ac574d0717987d7ff +4aa01ab70881c0b058766bf9a120435d +f2ca8754e05addac7f5608956e99cc04 +d93d0b2e8b8ceee14deba51bba71a8fd +8d3b04e9380f76ce10432e1145e5bb40 +fe259e0af5af7530a36f03bda2bb04a4 +7cdd9c45bbb60ec4c7f7fd5c2793c6e5 +38ef2773a2ae7ba320afd4e1631bd1fb +a6cbe488abf24b390c8ee5894e4ba442 +eae263e4fb8ad72ecc19d7368e3e20d7 +0c85c979b3a4d7ef49a1db4c71e832d6 +39a65c3ee253571623ed7250371d2d30 +e28a50ca2f93a95a2b664fb1bda5f673 +8e1276429504053eaa454d90306e43cd +a841286cb90b2a5239aa6ae6ccf8d9a1 +57f8c6bca226cb035a424145104d80f4 +e6758c7da41b4954fbe02ef708e7b676 +635897206aea1cc4d3e7dfe2cdd5e148 +075807c22283ddd452460c45eb1be3de +482aef6f653e109970bbc89144661b83 +084975b28a1ac65fbbff282a44dab580 + + +4f196e19ed8ad0fdd14cb73c93fee1ab +2f0f661518f1dbda9eedda2b6bee734e +060e9e0bb5a4e5dc1fe0d2fb20b2c801 +dde71309b78bdb3b366654446adea123 +6c65bfeac7e5b5b28af498f2d757f3f0 +2c56066f59944c0167a8e4321f193913 +5a24be2dbcae65e78db23bf732ae39fd +b4f2152a14d790847565aa176161acab +198d39094c81152155f8f35108845bbe +05e8b4037cfbb469f9ddc37e8fc9e970 +5468e59e8840a0a6799d6db5d36733dc + + +b903050b3c2f2f9c2e14a68d547d6e7c + + +e553e7e359fdaacc24ac6cf70f4ef63b + + +f563c5d770cd2ddca273bddd51d0ea7b +b6876439fa39e5d7e38b4569fe4b0ae0 +5d9111a43bb0a61dd556482ebeff87ea +fce01c02efb6de65ee2351ceb7f4c59f +4d9bac9a5df4418c150c7cb5755d8508 +5ce2841167ecceaa0593eb98090f3603 +18226c20d232aef820c24b181d52a1da +7462de701b3d82e26afaed3f6750d4c0 +4e556c738df97da21c645c6649f0ac2a +c8f9632a0d92283f0c21c9686404e307 +e7236f084a71ff0c305870e3dbcf9286 +dae7509aa3315d022b8b3123039f721b +e739960cb1fb56aa14fe39cc78fddbcb +5e3b2b96468e6a399272ee4cf7de3567 +03820e89cbc0d1394eb04849b2c63984 +e8452eb04184077138d8d57545efe898 +e1ec911fa666669ade4249a880515fda +7e93cc4be5b856f684f8263ed6ad7893 + + +00b237debf90b03aa19f2434f4a737fb + + +d1cdc4aa945f242012d3314ebb90c379 + + +20e8096a0c96d4d714a8c7b0812df9ec + + +f1c4a408a59c2506f30b04b8c7ebec24 +687d662e2190066557c48315447e71c3 +e226079cbd508677716f1e67e0c2b3ec +cfcc4edb9d8fdc7b5d959d9a359ba701 +b75017ebfe925b4d7b2afb9f019b284b +66d59e4a4c93b2c3155faab56a011860 +5b429dcbe483e7ca76b181d296fe9077 +4e442121767f25d7f57ac109818d5369 +b36c4eeccc9e7687b62e312e60edb399 +34219dc52c1412f478c26f9be6ddce83 +1733eb4e925889d531e1afaf3815489f +27f3b162fa166cd675bfd91d3d91b178 +6a419f5ecf5bb2169d4c88ccce7e9b54 +b2626c8a7c8ad7b9be51c6609f53d5b7 +1cd7ec0b74e032f0afbd1835110c9b88 +0ca038e8df3efb73e1c92e37a92382a7 +fb23cac75b1dea5ae3dfb24975cf9866 +fe2bde886e0037a591ec302ed73d6237 +12cbfda1e77501e3660fb9fdce89e9fc +fbabf3796f25c65efeaba71adffaa3cd +c6522ae31395edbc1c88cedbe2bfcc94 +534d37a6e6c3bdfad645a4da407aba08 +a3bd20b4f0b536aec482b863d26824bb +4b7eed62c19eab2ce3f5ec0dddfb0f57 +d657463b2be2b286022c63a829b3f7df +72475c099fbb56229801bfd40d4681ce +2dfb26c7eed3351632c30bbade02b98b +2844d875f221d127ae17322fe4cd8e5e +2a8b20539961ccdc54db302d0e5ca2b0 +de286d5c93b7300531e60503ef646ed6 +15e9864d9ea2a8f94477e883466d682f +1158a4874d23585511cb139def353037 +32f0d7b69529c61355c4757ec37687e7 +26981674da504bf0480255399aac86ae +e9753e2685a6a9ffe15d6938eed6f039 +43e34e0d77eaf601e95ea87ab163750f +fe56cd84d50a1585fef402535bcea5ec +c39eab48fdb9139537207e921ac72fae +16d3c1f635fb496053e19679b0cef8fd +8e516f7e71fc8787af24749d7d013a4f +da82a19df2ca3ab1289fb5d353b766e5 +bbf66d184beed2679b7938efa107e028 +ea349a9f69190c4cbe423f0398a5e736 +1b8d85f16427b022d92229086a207d95 +4af5244b59afd4b153e8c774a37fff95 +f7a64b7e9e31806690753b25abd3cad0 +404260c2d095c7eb5abeff51afd7b66d +b0e85e9c7768548f8b0cf271fbd39618 +79561205fe5aa7f348e34b5a4e05abfc +41073876e590fdf7ad35e2d32030fd0f +a3a2f2f9e59155adf4ec27e1c1ca0c9c +a705f84bad0ebeda655035eef200ff15 +2a6b79ec64e1583c702953f58013799e +0eae092c6634629e68831278b2295847 +23f532046aad65b41df8c6f609f8fce0 +a4d7b4cf5719833de8b85a003c660241 +c4c0043ac6a4049c996c825be63e2c14 +cc7485d89c6f2d3930fcf9fe3be04753 +4b0feff6823f0c60af3df3ecda8088ea +0f146acf599607f2b51def0622807687 +7436665e004edf441d43e15c307557c8 +a9b40ac34f3ad961d8b4076da2bf1849 +ba8b35c68f8e23895a388fba66baa214 +4c975efdf2e5d3a82063629afc7280d1 +4799d28d2dfb6e621c9fb0ad4efc2c30 + + +9c01c7151deb4c01ab1d6526073d33c1 +70dd831c761a20467a6ba9e5ae736f91 + + +6318d2b6f7fc79b4ed0404ffbc2dac1e + + +d4eb63e694ef031ac6e47d866a87e4d5 + + +dbef1372cbf2a09a2937da2ba8de64ec + + +80e05442985a4013b2513e3a4a89731f + + +cb231afc280b240f9bd06f891a8bac76 +c9a37af62da873b493e63d9bdca04afd +6f4595225c1742546849e9563060e806 +3f11953332dea768ee301fdd473878ee +533db66c8daa7675b21d06929c5854a3 +442bca7275355ca1d243480f8789872e +6c108801e2848282658e18d4dce8ad1f +b15ccd1e2cbe69ad2888204c96c477b9 +9304cd2325c648abaead7575c9870a8a +afeef5b70f5916024e687fd2247e207b +04ced724f3e21f46a3a318fc826f0f53 +c0a5715cefa918bcf84162bee116e7ad +669294c29d0e81fa6bf061c6e11d24da +2b716932699999c49de304b438c423e6 +a351b9fd2e17f1d36117a7a4b8e63988 +c022af21846d6a19546cf84ab88f0353 +c9dcd6c960407a7c6df856e0864e0e14 +7728caee8caa768be46bb3e5935a99b2 +91de20ed06553981dddafbc71f6e3e46 +01ff7811a46bf81fb3cdb45d0aa45621 +287f94960a19fefdeeab3e305fdf6eba +3354c99e3d13fa549c1975a03e4458d0 +5a6ad22debe78604fe30a693a5a525a8 +d587dd16b12f792c242df0a13acfb3a6 +bf54c20e2cc1f0603003c01974ceab07 +917f93e80da604aa435cb5b2c3d35d17 +74de0258ffa05523b5712d7d71984f97 +a1e3a62992d9112aeeeda28362e4ee14 +e7d43d1c9e3b8a2867bac544d2317c61 +47500df641a8ec3416b461af6a284151 +9fd648ec1f7464c286f96eceafb59b79 +fd5a4352cfc0365b5a9a8102090a46a9 +d4894f811c249080ecd49600cd8baf87 +9bb357565c95d6fb79f7106433f58f12 +594a0b6888327f9172eb0308a455777a +cbc52d8e46d0f8e3482c0644d643df0f +f27516d1807413c92770f320bd1f5f72 +2509e1c6672bc4d0325b79b98c7fe332 +f6bb67304472c650935fc5609989e4af +78d82f8b8ac1a9cf6b0645a9e230234a +f4c2722163d7f13ddd8e4c70c2db8cb1 +5129f1ba3348028f3667111746cb69b0 +b19fbbfda365bc79a6b851e60ec847d2 +1f54fca16bd38f93cb1b1c9b72feb1f1 +90813c26dc6b88bd481c92b3ece556b9 +568ce66622eecc7aef3ac6a24b63a421 +b0fdc716e42a1bfc7bfff77d4632d3dc +fcce102f54fc2393127bf91092758548 +a4d6765081911dc2787694e370431cf0 +3e5387e454802270ff818eb8907f1114 +0e207d98892f464ace855b44ed2e6a97 +edc647f9bea27c5ba109d13388a659d7 +6d472ed88958b1e5ece0950bfb3cd651 +0ad21fdd63f826df4e12e2ad7e6be04d +28768c91ca1316fa7168c8d7fefeb4f5 +4371e9b00b0260e1db0dae222153b564 +eb73d3da4b84c421676593777e8e2355 +28f7ddde20e5f86d71f9876c3627cddd +096183df1e822ad1dbcf0a5732625bdb +ef4f3d18c2153c03b4c5ef6fb15153bd +b95fcd358ca788cc5df66b1f0c86c07a +eae93802b5e1be0cb52fedc23cd7622b +446048d0ef92f96f835f152b29d8c3c9 +a9a2ace0dd19f72bbd1fe902528b2f15 +0c20ea56c48466954dbb5db83f39900c + + +d644d1dad1639671a0a08ac8d7cf2cda + + +ec300fcfe3b8060c918daee81cb6e740 +8a46d92eab527b57b421805b53b35193 + + +e84bef582a60d7baee95406173f95c6d +65555bcd6129a59922d4844a51f2a66e + + +4cf9f56d8067e2de5add44f6ac08aa39 +18d904050b6087e1a1878ed36f5bedbc +34d7acef8f0f218cab66da7c0e99211f +b1e2c0f3fd0a52410a5941a05b34492d +063ddca3bb7e703ba6d53dee0fa5019e +cb383912b1e9fef30d0309e3754cab09 +8b6d54c4ab7c9789c177231a715aafbc +ebacade0265c156a14d9c4cd9ee1aea0 +31023158e7c92530f262bf9e159ecb1c +2c6e91a13693717a1183ea384ff43f8e +822eae32e99ca75914e16f03daac619d +f8ea6e5c8819bb16855cf4c9c551fb73 +a1acff3c4e6bc6ab9e79fb506ae661b5 +16243b5859d618d8a65a7f462980737d +51845e853f433558c35bfe844f0a9215 +e1a4a79048eb46e05113a865859fdb37 +5b68d8515f0127c01755f84a8dbc75d9 +fcbe711b3aadb001b4fb4a5c8fa7b76c +e8b3b444682a1dc3efabe14653f1d0d2 +939d4ddac16edb5b36a415b15b165ff9 +7034fb1f10ffbe30036cd64a82cf6d13 +0aeb60633dd742edefb678f90d680718 +b3ed03c588eff65bc0815b9600b11a69 +5fb9bf0b10d1e7d0e2cb2a75ab8761f3 +65d22dc7f7eb7575986f3593604bcba1 +9d5c60f11872665e5c3e7f13328892d0 +57929505563108105922fd66ed58d567 +0b703646c93500a79347305f812c806c +31396720b520b3bb9f8b3a3fb57d27a4 +e017fcd72abfcdb3ada2ece84b141396 +b34a109edace291b40a56bcfa8fa2f74 +7385d48ac2e6148a6f1b60432b7dc8dc +e1f12cc73c14812fe51a9170cceaad4f +47cd20e59d9e9e47f3cd269b9d6f7579 +e514fbc10583cf759b04cdb8443e0a2c +5087e6d1810e83275b6af4fd1726a70e +52dbc06b316a3b71818fc804c9fa420e +a204d5f90107479e7316f683c9c4607a +fb65d82191472109ddf59b62d5779f2c +7e1d2f38a17f9b41650d4bda8d3da264 +9f68c3e8bfa450b72ee7d17acafb297f +cdcac5329fc8f57a9a7b420a88dc0ebb +57ad3dbec6bb122f9a0ca95f67c70814 +b4f13b20b3790186ae2baf051be79aec +0283fc038e449adcd3616d4419f5d093 +f3d44a5a85bbd3e013cd4de3341e89d5 +9874abc53037f2f38f511e742e30ee4a +e4ee16b8821c426711570560dcac5871 +cd859bb39099199582d4e94380982de6 +0d879986f44f9c64632ccf168da9e4cc +125f68078e5e6a1e9d11b75d15797900 +2ea9f6817c3f70cb4c3d7ecb451b4746 +a33b0b16b842e712d9cdd77a7fdcbbc6 +1ba07c2b0466d37a57cabd2bc12739f3 +1c4b03c6d879c610365522f9d88fb95d +9d9d72c07c81e41dd427559c6d4007a8 +a46a6619f90e933ada76af43913e6996 +592bce160e3975e31cb006370388efd7 +b1581f30826aeb7c9bf791425b67887a +9c8bac10a946e485681c9854eb064c0b +beedbd377d6231a9c75215c7ad0660ac +b18f1fe773329e1c368190a05096adea +a6c8966c4e93226e8fcccf99685cc4e7 +fa3dc191f76e8fc8ed5790524bc1ed43 +502d5d6d029eaab690bb4010ab28077b + + +365c361ff007348b8f79006a19e74e09 + + +8515eb9ce71bacc468ecdbb2dc766578 + + +c1efaf570aa80e11b02bafff0b51c16c + + +2dad3c71219a4201fab5e505272019d3 +14a2e420e7492217fd0a86991d52528a +7a90e0bb0618c3ae3dea1978c403bd84 +034798d01e3c2c0c2d2bbb394eb8501c +1deedd61a314c31b6567833c89d052ae +d934252bd228548693aedbf8169f7ff7 +b3e45580bd7dbeed7191060313256642 +b51ffcd2c91d8ed96df607002becd1e3 +9586da17ac1f90d08d20b04d17b49f97 +5c0b1e4aab4fe83bb5330e6f632b1ea0 +bd51080f0518510a2ff4819a60029b1b +6c6b1ea9bf7b6758126b5ee6527f76da +d7664d91439f8c6a2a214320a863e130 +e6ef40bd74c37ab1e302a156adb03a35 +a8ce7e2c7f0c51d8cd52972cfd2afa2d +5a12a23a67e5681ccbc279a9f6fbae15 +6372450456caa25eaaa1a45bd56f63cc +f71ca4688b411be6f52e48161d179025 +994719b22ca2628db29cbef70e13c4e3 +05ac3a78463aeb98058b9a10fa9a55fb +a139de011e1380dc9a4413f1e0f2fad5 +fe20f28c0334943984c87baa623b1c50 +8bb10f34c327adfe6d2aaa2a077edf5e +d5f86a87cb6212b2388a84ede7d51074 +cb1cd97b07c77e0835240f7e63012247 +945622657924660c72b73a27d5f63e1b +b526f428e8855806068da83cf63265cb +1d017bfd1e71478f184a62b9694a684c +eb9bdf965678a08dcbf378ad2e5daa4b +b0c2cc96f55278e5a21991575ce8024e +e11daaa41501227ae40484f4854f32bd +61cb2d4c36d4ba917c167447c2233d2f +21d06f61277c86ed48e6e8f4e49ee3b5 +4acda9b26cbc697a6817cc64e254e10b +30f9e470cb903ff4484593b5a0c6697c +cb55b769623d604a50ffab79b3d4d502 +1fba419b5fb66ee748bc47c5c94d1605 +e128b974dced4b7a258e148f1533be4f +8bb532d8e283ba1068788410dbc08329 +9c377d1fc734ab4b3692e6049ea498d9 +c667df92801521d707613b2b5e179c5d +81738a615ab84bda20eec985ab2e23cc +c1a3b889c21c19cf94e40928deba6f08 +fb24e12af22a6e0c5492056d6869f22c +afea44b4611b127391c2765e67bb888f +cfae719624412d6aed6930f865f3c639 +7bfaaf1c3f6cfb3cd6ebf94aaaeeab19 +198341911abe0c15937eee94088bdb86 +4a7fbaa242a59298e87bb07fa6d168df +89baa9f6ab06c02e7939a4eca7c2b9b9 +eb6c20862e0fd101f3b158c5591008dc +008e75649675852a7ab2bd3e8418b215 +d72021d07a222d699ae2345de41cf7e2 +8c9ac43196d509da6187f66bf9683bf4 +359c3d1d5b8ac6537a36ee5a83ded4d0 +564a09b37cebf4b1806481b2cfe4ea3e +daa3a460cde0c3e4473b68ff14dd5a75 +f8f54d966d531f28a305047fe818036a +aa9b93b7270a1a73b4ce3754b7bccf73 +5f9a0a067a1b83b665598ecccf5a7b63 +384cba065ba0bd57ae862c3288fcbcba +02a14ab247753e76996aff89e93bece9 +5bbc25117d805eb14b98b96743a91c3a +70c107b517f82576cf21b333ea681b3d +f9310a1c87b2453c24c0c8eb0d525277 + + +08a21603a4c8b0fbae33477838b82b00 + + +bd6cf96e05438cd47803d19ed3ecbd5d + + +254df5a7ff156ec65a3997a119999809 + + +70ab052ed51dfdad78f49615a6f69e60 + + +2638e97161f75de012118be31a22004e +0929f0b5e3254b6e40b527b1abce1815 +5d7b9b21d92eb1240486722d97d74f0a +b9b21157ffad702054136dfacad80e75 +95d2d2e08aaa0d1426b4cd4093ff5101 +a592864eae4b1fd55af82e98ba07d326 +33f550335ca0c18fb4af1bbe009e435f +8f9d5c66907f6a702a3395d2f6202cd5 +3ba6aa4f3f9c0a7b3198846cdd8d10db +564d13340a864d2ae601a0ddfbb1cacc +ae4b2db4b903230ee38d2ee40a2c6e56 +17f4d13b497c8ce80783340248cb0f26 +f0e5b29c15f18eab63138d7589148fcd +78450c1ab58ef126f29a21a9ac2e6dc2 +0848a1e0e3751ffe698f8f929eaf59ac +ae4d5ffcfba43c43792a00948e400a4c +00c223cc64d4c68665cf8d3c0d32a632 +c046f7d33ce43b59ca977140b91c8383 +8efcc3d6ab70c2ec60d28732b3e08c9a +f35a9a0c87ef782b937b3e24fe981c06 +ce0378f488c6ac4a0149d63ce950198d +dbc68fab8f657c2fdb11ff969b55109b +041cd0d0dae4436f410042efe7542929 +8d7b7ab42b7cd5334f5e18c0441abc9d +98e5199b0c3a6d3dab240f22a2e1c17c +763fa2a8c242e5541f0e9c59e5be0c91 +ea65decdd7c578fcfc738ed1c77bdb26 +d7494cd76abc606a2c200a217d2a6a07 +6b7052928a1a865a23f59fba1d313a88 +7929c963cdf3a8850d7d54928ca662eb +62957cdfb1790a620593f891892b4cf4 +94dab6d35ae6fc0993b7040012c37e3d +d4cc0a019c0056f9c6001fbb2210b766 +8472dd267a7c0f36258c1b1c33fefe1c +e1ba46513dcffe328ed67ade611e6582 +885828de452fd48669a7665a5c69e88f +c1178fffd3c603cd2257f1542c072dd3 +43aa2ae8adc95e1b176fc6e5428a096b +d3dbcc4565d7661ee3f45e84401bb34d +c36c3335ffe9f52485f7f9246d991b1b +b47d2bc1ca376839d48dd683583b54c2 +8b3785fa44dffe6cebbd50d78d84af3b +20190b4ea32a3cdaff054deb7c00f467 +b93d26deda65dbd18455cc7479f06e08 +39c3e78a97c37b5a302826a4684a3e75 +68ecba33735d58488e91f9fe817b5dbc +8ae6d716d87e25ff59e1c2d3d49150d2 +3c0a6e724f60b955074b1425c0dc52a6 +5d644468784d7d7951291b2a6bcfcc77 +8acbae37164eef94b59dbe8742676e89 +1f56f8a03d45c2a8ed59c019d94eaa5c +2be3062d24c05edc8df4a0c9b1d2b2ff +8110985385772ac7b2d9e90adf08f769 +b26b6cd27dff99f6d51ca1e3a1ef4743 +fc547a5eaa20d5e5bb777e52640ffbb2 +9abdf8612325424ada32c03738082e68 +6abb3a6b47621e4b1aacc1e3521ff7c3 +4b48b9e8b02f76f13c5f39d17f1ad71b +f14944e3d5877e8dc213a0c81ad67214 +29ab57ec4a083e9c51eb073002d08682 +c240bb7dbb2e85d910b8c85343d68c80 +b753dbc9b05f352c159b88304815cb7c + + +1e3f6f4bcbcec87e78be9a8cd0c11dcc +80cf4a974ffe1a69b6d6b85abb391d6f + + +ad8c831d187419e5499883a1ecc2df68 + + +c4d652a582af1421eb9a0b1f99c6d250 + + +c4dc9ebb0311552c6f3dac4b11334a5d + + +c46ecff421b412f95a3a1c54617557f0 +4816217f35fd66a1de1c7ebc7c976651 +7624ab4dba58de5f82b466f4eb08d9bc +91819a724a8053510d604238e4b58ab3 +d93a7cc7cb0762305676fc94a39a4a09 +8cc8036acb5131a42149179eb99973de +e292cf48a7bf4a79c9773a31cf2934c4 +1f99f7b52822d4c59d916447dfd7559e +1894d5f165701a24bf022017230c8df9 +d72b2aad7510c0e3ef72683b26fd027a +90bd57b60223a7433a16ceff05d97344 +a6e50f2dbe1ff84ca43f5bee0ae51275 +edcebd7174cb5d346fc1bb0e8ad4d6ea +5ad064f7e5e4973c6ff8adf20fdc9097 +7e81750ff74ff1569318f9f795584910 +cc7099e04e2b587cd785e517e1592eb9 +ec3a39c8e3b05819cb4f9ebe74fd3323 +bd2acd5c4e1dbf8abb0e8cbcd63941da +7a268a6642797b76d4f627f39c64a2d5 +15f0bcb8fe5c5b09d84155879155c6a5 +9bc75d901e6f5d74521f9508f66853d4 +134f4b70f31132a44eebd688fa862959 +02194779d3c20eef4dbc9a30b72385db +75f56656276c886a12736c9c0a7befb8 +6bd22e44e3eee865a50c7bd147353352 +97fe3406679f991bec2a84bb0d648907 +8b1b7e2797bfd86c3682f589ce17ddaa +cf70c10a5cecf9ae26fb704e9421d237 +aa92065e9d29a0d969480e18d9a7c45b +28d916b5a88825b69f709262e601b0ee +5cf74ca41c491f9c15151253feaaebc7 +32d0997f17421fbb3a86ee4c2bf67a9b +ed99d9404cdfa63b7f6a97e287c62b97 +5da7eade584cdea9e697d1c0e2f2c19f +45eabec8f4f074109c3e824500dc08d9 +283893fc0dbd7cc5b7679ae48b412f14 +eaba0797ccfdf0276124f6f99797bf99 +c117bb40e20b69f3da526944681473d8 +22cabd0be8bcbf938fa644ae3a6bffd5 +ebca6beafd3730935bbc822b52bd5603 +b2e047eebfac3ea92afd25ef98666658 +0be5ff53733331351419a804fec2d65c +5983992ebbf53f21ceeacf95623eed77 +2b4d9dcaa5ab568a61ed251819fef29e +565d4f7285e25e20677d947592f18615 +76c81607e4038f4d5c31f2c55f4b2f12 +02c42629f742ab4a4d9a27ce6c703143 +1b55b35346283436334c8baf3fa3dfab +c6d7514fec5ea3f911328b5a2ff65bc0 +a08d4045664a3a807699f0537bdb93e7 +ec5ee3c5d17db65eacb68f961fb6b373 +384e3d95df61a3f08137014035ee77e1 +fc28aa5e01775d72c6c509d671993bcb +768ab1e7379aa67845b73ae6b7114be1 +820ff8a3aba1d08a4966c828848aed56 +60424c97daad69207a74991017e259ac +aad364a44a1ef32ef0e722b4ddf900b3 +3bb9937553a7e043b34145d94372c4cc +61ae7c24ef5c91164263b3542e8b8f0b +92d3ec3fc776d88fbc6c60503afa5556 +f1b9b989b039f70783a38b8abcc29d3d +27cf3a2166066e7c046a92c69e173696 +57742bc53357148832b47a87e3369791 +bac68714b2912742376e52bae764ec59 +3270657a91feebc923013a5b1dd26e1d + + +a81d80968d54b8e6d31db1fbbd2763c8 + + +57b267688a0a287fbef73fa98384f51f +4d8b00e613dc9a2e4a4ffe3d485aa7d8 + + +51a3723412559c54daad822880716e2c +1c047c61f8c7c14d3e92634d7506de32 +51a3723412559c54daad822880716e2c +1c047c61f8c7c14d3e92634d7506de32 + + +6b93fd06a12f6bc0c74fc10dee98631e +4d8b00e613dc9a2e4a4ffe3d485aa7d8 + + +ae3cb083c91bbf97212cd97e02243609 +1a4b8ccfffe1da99a0244108beb16543 +d1f746d9bc0926785c04b811f3fb7966 +8ee4be957243e408f83238f60768a62e +d1d27ba3c484d69a50ea82359699baf7 +3f08c5537c877607b1b38a3f4628d300 +201ec03c86cf2054397dc8b2cdee587b +dc20105ad59ac69313a47db1691e716b +b7ba3ffdaf7c925cf02db8f6af000e19 +343d7bec72f569a5e5d7ccd4634823d4 +1afbf4b8ae361df5b07e40f4ce036b28 +4f0cba964ff3c374759ea96f7c500307 +6a1dd8ab3e701824124cb63eaaa81faf +bebbe5127ca9f7c16d10b78d6f4efe8b +bee70c7277935058bee76570544c2e7b +1101b7fa25c611245ec0bf3c5a7dba6e +c7f7b6a9269e9c5218bd6cf36f6c2a23 +5f0a85714b27bae10b591d97ec559d20 +65fba3e749586eb076249ba3c482b35c +49589a58849149505f18c39fabd41c8a +6aed0195f236b45819a8c39f4f2bab8a +5e3e069f70a0ded9d0ee0eb7cf0406dc +66aacc6ffd7e53adc3ca755317c22a63 +697e2261a085361a28067caeac366fd1 +4048c98914cd79c0aae66280000b3561 +3a2206dbc797fe66ce48b9cc878256f6 +6301df0d24884adc8c535de1c5a9e98b +f8fd950310c41d00a0097b5db79de259 +4a738bce271c763b1f0ccf4b442a44ae +ce6d51be7d2712bb25fb3da7ac755b23 +341af811b1496a4696c5d19ec20bbee2 +fa440492f96bcc0fdc48b5bd66e21389 +51238c690fbcb8afc6eaf6f27459ce5b +4e34b926b397349a7a399d9e2f6a623f +87c853d3f2fdcf32be3154c14324b626 +a85d6f6c9dfdabdbad59f048657ab05d +82d25454413650c9afce0c152f621456 +83e71e5bf598cc37ba54e1f4186a46f0 +5b16411a39be252dce43f6f84ee0b023 +93022bac37cadac7f1bdcdca314145fe +2087699af94eaaa7177b92c9c0ba9e72 +3dfd4391047ce944aef697e571dfa124 +e6c29e3ffeee1f20d265b95decb300d1 +5dbf6b1ee18e05b2f68efea7cddd6581 +edbbea920740cbcfa074607d3b169ed9 +91af40689eb5e30ab56ef95322d63dd9 +d523cc1f7ca3a4a13e11ad16e4e801c1 +8c6bca9edd3666ae2d7fe6004c8046ce +a6dfe45836ad9efae21ec474f6b0a360 +24cb8074e5621e8703181b98047a5a12 +098a74062c560323cf5b527bed594155 +5815ec05a565d909cb97507b294e76a6 +aa85f538dd855b04e154b6f9603973c2 +f9326b6eca3ff2cf4c6ad9fd2f238b7e +5420a4876d0f545323defab7add12c1d +c0e1028850e1771e7260629853155452 +21c2bd507e206a1bfe3384839b996bdf +d5a99c1a3afdfd41705bfa5fadf18b04 +22da431a7c7f89ec111dec1a80591058 +6badad2af73e4b042c8887c0addc7f8c +07cf193499b14b4aa2dcd2d8d0a81332 +531aa6eb0b9d51d6b45b54e1d8f7adda +59223a63757c54efd157db106076951d +a233c31b4d3824db7be5a7a8bd453b20 +bc544b7cf64e2e4b50074bbe9e783ca6 + + +0e3b2d7155b680d864cc63dd7a085610 + + +e5bf44e2803bf12aaa79208bc33bf39d + + +825ad0b1b3d2856a9919701895c301dc +59768a023b4746ce905b48b15b701eb5 + + +625acbfb79ef0ef7c548312fad2026c8 + + +9fed987110c75de38190452dbef8fe5c +477d93050f1263cc40ac9d69d1f535aa +3d878037e552a800898f385252a66132 +27052de320e652808dc308d56fa81fe7 +6bfd83d6b548af1f492860ad787efd3c +bd55061fbf3f78a7b9b9464931850d24 +f48d59c4c07611f93063308a88147075 +a3c84f9f621ddc0c5b98da56c129dba7 +84a6b4aa628062a1976a05c7de342247 +a0b1c3ef87e7644e083a4686df3c52eb +873efeaea1762bc8e6de524749521803 +bc0f7acea73bdce2b414d78535b14cfd +e385f2a5a742c08c33df37979ac7ede2 +eba21292ad522a1f5a116d783cae786c +6ef2e8666ba15887ea19211bdaee8e23 +113bb3671892d3362a7af53f18e00a5d +5f5f5bd5be56890be74c690e2e4f6086 +7878235b2a665f85fddf9c4766d0a291 +e0b09b89fcc0a67e97eb9ad4d2d5f739 +13ea49b54ede207b559c1a3fa8229e60 +642139f0e9e5b65eda856a5f326fc79c +0c06b2e3cdf0f98380812e3aba9f4dc3 +dfa31e414e448bae60fcf506f383c1e8 +b3a3740510a41e510d98725bfde5aca1 +be0e97b53e0da1f6b756f0d4c55cf022 +08a8916335ace5bb4b9805d1e0b5e8fe +bff0ad390064c7e2b31462f7ddbc3f88 +7cc05403e345ccb5e96f61d7fb36830f +53fe627e8236690664d6028a094d4ae1 +8debd5c821e24b704f66f0a10b4e2e6b +fa411083fb752aa47a0245c18e4ccfe2 +94161501225717d85d7af627537051dc +4d1c5569f6eecc77b5fd1f5ad572809a +3148092fecba9ead1ca889d868fa02b0 +af3ca2bf26f0465023bfd82c10ceed89 +524ddf7870ecd5c6fe899640bbac2029 +1ea16ffec75ea17ba8ad18b473a796fa +a7804359a276810cab36d93aaeb215bc +e624f3976c3f5d726a8353432a0c04c5 +a7541c8b7e02be34e75512b856fa1ec2 +aa68d711d69293957a9d69db1c22f3be +fe59a2b5f8216e2b157a6212f00bcede +65501c86d18f49ebf32bc3c0fd47e062 +d2f253d3da990772bb926b6012bfc18d +bc5dd6a30e2267713c4098bcc4f45f4a +79ef0811865c309f1565784a027c32ae +946892a6b29f610bc2f7cf99907fd673 +b40fa1136de474a69e6d4915f9b2a80c +cc8c47d1fa6dc294be5701efd1dd591d +5ec51fdbf3e58f8b64eaa81989c45271 +880f18b929ba47f3eecc446da05e63f0 +aaf1d42d655eb5d01f0c50c071989e5a +c892f44e925b21a4d6fb5ac6d22e6a85 +0030a0fa29b1ca57e61e6ac61e0674d2 +6083f371e6147be632379528b0e47a4b +94bd08b7859e9bb2140e6b70cb4a1ac8 +eac379790742d4618280407a55ef80f0 +84d768fe278aa3543546547897608946 +90f6dab5e408048c9bccc711302eb9a7 +789b2d89b82a91a1af067b9d83442f03 +609b886e7db3455e35fa3345a5f5ae5a +a669661b6cffcb1f6c6968250494896b +15a2d96bc1446cd93b5255d9e3b635ab +29cae020df4221ec9a54a36e438be517 +bf69258cea05265f4726b82ce0cf7438 + + +59caae8ab95b2eeba9444ba219446c75 + + +d23aac026cedcbfd9ac907d8b381c409 + + +f07c4c80135c24e1767c97e892dd91d1 + + +09d96357be13183ecebe78a78594bae3 + + +7ab4facaf458a4151978751e427e09c8 +59b09897951b4ae8033095a679c7eaea +fbabac0f628ea94dc81ce720ffe5b518 +6b268a08ba04c73389cdbe40b43e02d6 +a8f24c81d4356c863d0312fe22d60682 +5208c1dab4bd87a0ba9395e2053bbcb8 +dd7ace62fc1cf90e2f1aeb03140f332c +b62adcce233f417c439a3582598599e4 +84f2c91ad62ba9a338031ede50f03a37 +e1211327091a19c78aca0ea542a12bc6 +4de94dd78abc3d9bc5770ef7c5869895 +e136cff7ab9e595bffb5a5b3d71bf6ba +a1c69fd47e495a974e2b0f27d3e61cd7 +5a0fd20838f9ea420e236d2ac5fb0354 +fab94f16ec6471dd6edc07ffe1a3d92f +b99a13b28a4220b6d44e0dbb71e6453e +e4bccb7903f9cc37f2a5b758a64bfeb9 +4faf9a59c65d3587e028e8f209231ca4 +ad925e2851b226d2f976075a6ceeafda +910cd8728664a40c8fff90a42b329666 +4c71d865203bbed2c3e0cc613016ef16 +84c56529c746e9a255b446a856110eb8 +4cc2ae9ff71559bbe8c3ec9c2e0b0db1 +5c78c6047674bd80d65b295c9739443b +5eba97b678bb765760b3083303750ebc +4e0b2d6ad47a939cbd1aed18a3b18447 +1f0eff83daa5702fd156fc52633601f4 +8879893e08299e2cc3359a89b1be866b +f78fa13842ee5d3d094c20ad6bad1f6a +c1f8a62dd7788a5d4993c3c38f28a459 +bb260c3a099a844105d259dd4e43e7c7 +1a3460d32cada73ea61c05cdac89f199 +dba3d9b98aac5eedf4992a700ef43bb7 +c61ff1e348b67b36a8448ee040797ef9 +accf7951f475a87a9467498d58f55b4b +722fc583fcaf8aa04dced888396b46b5 +269421e00bca25d525a924b61dc183d8 +559df83e590334268ca422c4ba7ad261 +06eefb58b35916b5e82c8db0dd4f1e1a +b68897e92e920881b26ba8cb8403c53c +549c90e46303cef910afd3d8af1be63e +3b506686090dc9c874f243505121d0eb +4c5566ae3f96d929ae07e8621c6001b6 +f76258d204bfd2affbf78c075f255959 +791609c6bc4281feba925b1d9ffc41bb +825a3df16f2c1ade9b9d3094417db9d0 +b3d67d0b1356d80f548c3c2f48bbd21d +1365cb505cc38e32fb6e8c60c08a0b32 +abde8f135963a84439d39f6cef3342bb +1f8918e682f9da7d37aa17e94017384a +3d6c8535c245323350a1bb1addd80283 +5b717e20cad8756656a51b7d8f0e2815 +ec0d0db678292150c81c5cb6efdd9124 +166e20952300293e9b6c8fa8c48b3235 +bd00db7de155418fde890169f111ba0d +bf802d3ce72fea135d916e6beb47550f +1bcfd3cea96c9ac5adb052f67a1d3468 +b97a4d30e31f0da9a172d5c3420f77d4 +cc9edb760200803033e74b717665ca51 +5e511d66b4ef4b960e7c0088137ba5da +2d8ea15d9cd527c9b6e940befa77a69f +a0626961fb2ee10b5372dc79428615c8 +868628aced072c27c25684f70bca43c0 +a51873ca0099f6148114532d9d56ed81 +6fcf5f47fbe7ebcddec5f6ae0e712fe4 + + +e88cb5ee4055519600dcfd7a4bfb45cc + + +03afb32f7ff3e1eb0d61cf619dda3895 + + +9fdf0ee74a688f3e884f9e5ab927f198 + + +3f8d8e5cf37f5bb6190a6fd44d3bbef6 + + +08e157806b9d8deceea99c99f1f63c1a +08e157806b9d8deceea99c99f1f63c1a + + +97eb305e815b69a291d4cb1f59896b68 +97eb305e815b69a291d4cb1f59896b68 +81c71033f134ccbe045fdb1712bb6eb1 + + +5c4a2600c7b5e80fed83112a6a594d4a + + +e900b5594bb0527f300f97e06c187384 +9c737c70861de22fd0e3f03393808520 +3b4dda2859c74f4bfdabb95492dd9280 +cddfcc06e590e90644d3d3e33b3f034e +d00ff3e12914fdfa24e295270d70a749 +007ad466b9de8d487aa4031316141e1d +a29b9d99adde2ba2909b6f94b14d74f7 +426b43afe9927fd220415b0afa68679a +ab11f34bd4155be2ec424adf7cee7d3a +0ee913e0599e8600eaea6ff34035af13 +b48112fecbb1cf9b8f59a18dec1fa552 +ed91c73f2ac84ce445e2a0e8fbd36743 +f95fe28a5aa8a210a900cd6ea52b67a8 +42ff4c35d96bf751db1202cb0f89a236 +31f7ae6a20c4f0c4ae09f09c123d63f5 +c85a6538545fe3184cb1df6239850f9d +2dee15542d8f9756bff59c4c511bb5cc +756af74d72e5f473bcf7ee412df4748e +17e5efc6d1001460f09128243797d159 +b1c2b62786638489504669075cf6b27c +135cdbde7d4014af5d8a53941e022bde +b7f4e2eb0261882d091d08d5112317b9 +3526122cbc319aaab506326e9730d80e +ca41301b89d8410100e0a0c288ccf977 +ded46de770d90adb4156d71e1502fdce +fa73136cfbdfc9a98fc14cc0b60f287f +f2461e9e90ba08a3bff9224c58923254 +24c027a7a399d696469b17caa87c80a4 +b8cc34ce3dde40ee25ff9883c78ec9f1 +88bb1d27e679bfa171113a1c69a078ed +4c82d9f492c61232fa53c199d1fc3934 +38e93f63a3878a77e0e9ffc271c09fc5 +be03e591ed45adf75b4bc882e991572b +dbc9531550440dcd06127ad3effc4a77 +2aa4dc4d5f969a199fcad338789a8ff5 +4ebd5489630d7789a317438425c08280 +1217616f0fc32f54deb52ff1e512ebde +8e9151bd050cd64a2de231ece857333c +c08f2440712c7c5504bcf5e4effcfc42 +b1052ffcd0411db4d2d7de9171dd1626 +d4ed67350cd0982247ca9d3e0f382c5d +7ae5fd6013f4e76bfd2b8f43b6366044 +79e08909b35f69f1ceb781254f2c607a +fce9852f312c03cadfa20b70ee7ca8ee +3fc438d7b9078e8a825ffad968364f0e +61ea0d9489ecaf2f41988a00f3cbd9b3 +ba37b327f20d13a6381021aa9c4884e4 +cfa52487e324db96d0f065e1ee40bccf +231416aaed1db74048f5042045f82ecb +e7a7ffc954bd797c1fa91de37ad284e9 +4580c046af8c3d573c7fdc41b8315fd2 +0ce34481c49596f91a1ba6adf7e9b1e5 +298deec06a5177e42ed9f206a84dbf8f +e33c94dedbc1d4f8d67fd6e840addb0f +d9b9888e1625142da3eb8731a964a36f +d11ce33f08a9512a484a123640c5b5ae +78abe963b940659c36e476174487e8b3 +c4ce5c5861b21fbd5f931d2b446ae4a0 +3aec21be1a3d90b65fe4b8e29b0f1f03 +b9e622859e98fcf8fb44f7226aaf16a1 +758369d0784d0502680cd28c4966ca61 +e85575ae819585f25a8e7beb4bd86d00 +4df0a837930869243f02395fb75ad97d +79f403eec1d865029f24b8c32978e6e3 +b7ec82f70319afcec7e1c61084106286 + + +78a50a94432d86044f05c1a287b9c071 + + +cf2a58dbf1d1b58a5cf40a053b23fd3b + + +a9db294fbbbc538ff69acd16bcde77ed + + +47f605252aadd95c22ed142487fda3e7 + + +030248e13d61044617b36ca9258f0f53 +18bd2fdf15e5ec00f94519e5209ef0e4 +9ab450d8da00188c33ea6825c0f9709f +4034e1ac9e465861e63834c81d25a9c0 +983176b7f9a38f2275ef35074adfb5f8 +19683d962a67840e10fd8d271249d4d6 +c772ea24f117d1f1ae698f9465096330 +fc3fdd0cc9040c14b18c9e6481c07308 +b190e581221f6047139c48495ebeeee8 +7cebeda4fde32a8b9122e600898a4f27 +583da2de81547e5be899003c87f014fa +f0b9c426b53cae801ca7ab42d177e054 +94f01242b07d2f8dd29b2e92717bdea1 +082aec1700e31d4aa0757c90bbff0fef +a278f525013fe44144bfb76f9ccd641c +5c62739ccd5a7703ea322654c547b828 +97aa4dcdb5e27a85ca72cd7b5643d898 +992cd98766048aa3d405082a639a43ef +ca90a99c6e63f993b11bb52b5252686f +5c5dae956041d12cd573c0772fff75df +45b0f1a4f0d307ee461daab3e053d1c3 +2d2aa3b671e422ad187b8853e4b8a663 +2ae2f8de46573581587b3de66f31ef91 +3470a858bb82cab07c13cb8da67331b6 +a6316fbaf0b2fc38b90c5d8129e26585 +cbdfb8bccf81c07de980f3858e8e8de3 +f4d1dcbc3360000d88060e8673191fdd +1177ccafd6fb5aa04c46267b1d9d57da +8ef83741c8ac64ad956e4dfce8cac46c +1ca687ead00d32ac93356c70d0228ffd +43def4256809d3b496c5eaa92355b21f +4dd56c9562abd48648ce1b2b01228ced +c2fe480cbe6df6aa629f79205abf89ba +cef772a0f10113e3ef7a4854468d6158 +6f4ba2870ce64b0bcd7860f07b973b45 +60aa29a1d281796d255d19faf9463054 +d44bf025db4cf0641339b169a3026bc7 +01d72c29793cc7a5002a9a62dc44c216 +d0843e2cb2d7e1b2a5e0196105f5f070 +5d8ca0b11276d0a1eacb6450b0cd08e9 +20ca93c037764476146e9c796578136b +2fd82abbbebc9d5522dc7a30a9cc48ba +d0b080b2b4cfb85b9b477ea971f46cbf +a24a6c90c177a114c8ab214f43db7227 +e72b0a117ab12047daf8d764b09d7351 +5a4c29b8a92a8cbf912ceed74f841f3f +0421ee072598da0de952f933934f78a4 +4df3f182d365fb49852aa6273624550b +0b53b51d64ab737e7d26622301c0b4e6 +b004ca49e480496fcb1eb2d2265d9f96 +00561b49649191b0a71485544966de56 +1c6762de88604a103c1b58fb1a662abc +25e9da32e0d667a6ba31cb66ab137ead +e33dbf7e21300e1982478524e3328d47 +467a15fbd135255d8b985d7f7128c0df +ef0f2197c4ed9038bd237e51c1119083 +55bf774a83d9f08bff1982bcff33c58f +65ab78bb8d883c44f7bf266727b01154 +cd691dcd5065f061270d8aef246d9926 +6371a45ca52232c3c7fe46c3fd46ed82 +4a74c457308e13e3c87fb50bc2aff7c0 +ae64505398e6f6127250864b1d4595b3 +85373c1eab9eafb64dd708e57a9652c6 +d9ce94791fae3da15baf022e148f1e4c +d8ea9bc8825d21950867672bf140f0b7 + + +721ef95b0094678f4649627ae2a59ec4 + + +accab4230d9411331e5301630048a5e2 + + +ffc48f1ffde7924a1adc4be3e85f96bf + + +c9f3e02069c982036e19fdbad60a3c82 +2e00151a478a8d5898bbd3b486a2a3d4 +5463f954c60ef565e2982a8f60c940af +fa5aeff24e2b1e646f01f9219e1f4b31 +1d61871a075da69fb6a66ca0870a6e5b +7c09b1415801cd7a2d1fc6bf3122c182 +f9f216704c893ad5fad21cf6887e312b +6ff23c9054f454cf05da98f8be975a83 +81ad2c14e9462f7a94c2d44459d51246 +c7245b45878f02ef6de41582fb9270f6 +d16c6bf5384fd64e9a2c9514bd9e39ff +a298abf1d5f956a39f1c07a8c606e862 +2241c36d8f39f9d45bb94662de5007af +f5afbbec7c0c4043ed0ce255c3801fc0 +fa798861376bfa8c7e9b814fabb27af0 +49aa5f83f36bb1b67a3178a095a522a4 +619a4182d7f8ae40abaa0ad405aa79e6 +6fb13b77dc08c87950f0b064f8ebee8b +e91392ba55c589df3f6e9d235c148a47 +87ba4660955ed43c76a894ebae23f41a +34ddb664d0ab4de2050f93ae3dfd4d37 +ad7355ee1a27a92d56f0ea3d0528210a +61a69f52f637ee714fecc4c723bfb9c5 +956293d2ad25f84ab223b5f53cef2390 +a7de96e55db2eb0a7cbc4226c5763546 +fe9f4ccbbc7951fc61fbc94ab3092a6e +97a29a9a109bf806f2ccb930cf097ada +20a0cf537a7a61809d6f0ab25520c302 +3907cc81fb7e7fcce1a94f0bbb51d3af +210fb494a11fab76614fbf5d08881a77 +56bde2dff60059cacc95e478fad11c1d +686084517ffd9057809a0ccf25838f9c +6673dcc97bca838f5636c36369a77dc2 +bae54fd8ece7a085248f4293767365ac +06c3338556f7c625361fb1e60f2c64cd +cf3016d2d8d477406c762d58dabbbbfe +51ff71dada11446c64b27c892326a87c +1013b203fd0e4c2da6853f781df70a18 +5c25d9aabd6aaa2a4bf443c7008bff64 +d2ed3c4af62db9cf4b48802b67ab6468 +63610106f8fbf5414802aea71cc4a4e9 +6d458a1f1acd9ee6f92c450923910cf8 +4ff541158352d4ababb236a6aa5e9061 +30975da6c7fa7b556ac2ad20eaca5dae +a7a7914e881b57a69ee3ee50ba4f39a4 +89461c2afdbe30e1b5d1db586e06652f +0b5718ac6b1f7dedca8615f9811e2ae2 +a5d6f963b9fafbb25bf11297cfb90a2e +542d2f2ac444fa694049230e4b50dad7 +3f8bb8d347a12d31ddd9c44a334e0084 +ee20b0b1a78fe03948ee53587a24c396 +35f19f9f71f3e9803a5e5af22fabdaca +2c53c5efbd7464c95db97e373d7ea35c +5bfd0c6631b801853e954756e42de150 +b7a418a6de870057dff3eb1d077b2e52 +6d847079cc77cf103dd4277e9d4fdae5 +22e9eca179b58a57467cff5659b36b8f +bf9a7425668bde0c9027556ededbd7a2 +30bd33dd5867bca8ae4b7c03363db4f6 +794201010c95f1c43d6ca4c5160673de +fb4971d46e41755e42348220576845fa +4298c4c0ef40f1d5c051356f1b2a17ef +b112314c309eacbb45235456b3fe3e71 +0349dfde60d4f7ea1676e23b85c2e911 +5fbe153aece58eab309ddd19226e3f92 + + +bf5dc59bca9bc1f7793d6893040eb9ce + + +6f7bdb6a244ea8a1a51a271be1641487 +a92e2573661f4989a4dd972f58345a58 +af13d14c1fc24dd90412b33e20e42a13 +9c1afded1ce7798b1cd6ca4cc61dfae4 +7be86c67bf8f88d06e5b6ce754c5a18a +5737cd18191c5c11ece98fad73482125 +68fed2691e16e97938c695ba009ec514 +af58c45143890421c6c0c84cf513540e +58b24de5b00796597ec404cb95bc84a5 +874ef15719b219c69477988f8dfbc3b8 +bd10043cf4f91c6931fd27868223c530 +cf67c993408f4d06b374ba9a4ffbd21e +15e02ff036a1f2aad1788996d094996f +4768144a2156d01dad0df8b0ac120095 +91ab4e09bf3f12e32a2bd18c0f1c7e66 +33296b9bf12e7de6dd8eff02809e05e2 +08b9a65ed172b1392385a25d673616d4 +108062868b30a4df24a6ab2ca90b56f2 +95e800bc5cbe3202cfe41b1b17c7022f +62957579a880b5603f9c32a50bdb14ce +14df362aadc8a850e182698367819d98 +a459d5984067d8da16a7d47f35c67b8f +a2794fb493f5cab0a1c1b4bce6ebef46 +819a0a3761a90a651ec448a1aaa1a630 +3a4bdfedca9792320466e9c0fed58c05 +a03c188d2d679b98a79a82b0342614e8 +8e0e256003a8d1dec7a5ac13a7ae304d +fc13f9688977fc797a256646faffa866 +2e7dd26b014e5b72329ec8f6ed9975ca +2a3671ea78a3a7b4f1946625737235be +12f0382bcb4cd8d6c8a4aab117c09350 +d8a6028a77d0aa2a08894e4749a03428 +92d44534a8292ad7002070c4a999c90c +dbdabc48188f62860eadcb1aede7f6f7 +6f920dc7718dbcebc8bfcd967e8ae326 +32e573b584637f2ef0e4e6c6c9c30aaa +e9427a836bdbdce255e9134de57484e8 +1643b60ba6afede59477f1725a65aaa2 +08c0505df349f5ff61e7fbc57aeb34aa +a5cc8e70457f127f77765c2d77644e21 +c01a8e77be74f42d89f956540b2dd8f0 +b0c392b0be31f2861ad74e2f4a5d1c49 +fbf62cf8cddb04f96617c487b097cfe3 +3e6cfd8c21d6a8ad1022a3883a0db65a +2c862aa33e458ad30001166581f0eb07 + + +f4c5e92cfd800f12aa1650424fe5674a + + +fcac34b6eefc89912ab4a9ad63e4d1dd + + +9ca4eac488b90f3a72d3ae5e09ba7350 +e622810a8a875363e00f5a020051837b +69d62596107f4be1d2b435856c56582f +03c7c5297a51dcbe13f88cf72e010740 +a9fb0f1230286144a33fca5a1a141fcd +807822cc53f25e63e2e3ab54a4eef2d0 +07633bb947e7004df22a1d4b59179644 +c956d479542d9762707617ab46283e94 +f087349a358e5cfe09b9904ba75f7b96 +c7b669a5bc86de8f785342c666ef1a0c +a80b57f06217aa2116cc67cd53f6bff4 +4e96ccaaa0f067c0d849d0face6a5bd1 +600beef9a502a6ae30698365fb805257 +c3c3ba226a9acb79b05712726b6ab3d7 +02dde6e74ea514cb0da1612219cf0564 +d37340d5af6d82bb1a77a34d13c7197c +a4b95999f598abaa2735d67eca2b5a86 +4ed5332265904758626a4377406acdf1 +28640ff5a9b34be5798de29104f10709 +c2868310d29e3b390fdc6c7453f4e222 +e641dac10a7da90286a2f36f99efec59 +8e1cb6be2143e1d41d29e97d5aeea8d1 +ac9abd799f64b2ec55406c26da23bb55 +950d2c68708d84790cc279a62f0b1135 +0f42549d7a1c92aacf4ac0d3fdd18a25 +575c8f0b0a3052d9f993139374d50acb +a23d826c38c1829a2b4911d452244c1f +402031221b6a5aafcba9c1f028f2aba9 +506ecd48c4eb7b26a27f25146983b6da +78c9cef5e3c130487178275af3eb12ee +2b843f296f68153a645a90e297180a85 +c1057178c24b2f34816c5830dfbbc730 +026a3b563a858ecd4c8441feb88aa332 +10892847c57ac4058eb41a7699d333c2 +b560d8814737ffc35d0d250d07e3aa4d +949665e8322fd9fed753cd9243e16e09 +29278f465cbc15084b428ed2c7cb87b3 +0ff07e35235504d0f3b06105afab6922 +409a6cd22ff78013b3d29080f1a165a9 +d8304fe1ad07e1c3da0d2ad88530f921 +a183f48bee470bdb205c3328c5372a9f +11030fbdd985c52ff97b2295a2dd8d22 +85501e3ec766837f57886c9c0f04d010 +2a22876139cb9189d8c27a18e1a243d7 +f485cde96f056c42868745ba54a744f8 +8b33d7da529c59b8564d7d40fb9c262a + + +befacdcc4c5bf6a333b8c82fbebe282c + + +278509efbcd2e9f657549d42026b8bf5 + + +14e21c3045d6d3010e816af81d7c7280 + + +c3e3c06d870a13664c24c1e574991f51 + + +6405ccd00a5c2c81221b82a9a6fbdbf7 + + +b6d7bf775170c096cec0c3008cfafe75 + + +5e3a2c9ca377739914e8ae68a20bc04f +31fd312485aecf39ca856829e83ce728 + + +a58e595ddf165baa3098f33784833dab + + +8e51715957cebe1a603da9ef05daa521 +674204d15d22befafdd4358e070c87a6 +a7e69e437e2201a4729b3addad008453 +b6390a186a02babb56fd815543f36918 +3b3c3843adecf1550c725cc6eb788885 +e2556816007e8b2bc69c0464eead55d6 +4e3172d169f123f2ed42e6457098e352 +74b7bc756d82755bfc722244ba59c85b +f4318b158b63b42f8e9e559df9aa9895 +389f2ea1704535252b2ebda860943187 +9f7faf573ab7aee8a85091f8141d48cd +65855a76e55303a76c6f0be1fa835a19 +21a632653af19eaa8070fdd6176b5d11 +da3a7f1f22d8e177fd667b744d25d4fd +1052f1d14c1ed7000296df653c8754fc +ff352494114e6def4abb66e0a60c73fa +39ef21fca72b05149d766b6559ffe2e7 +3bd8da7cb54b869814e51db5cc9127b7 +8a6725237e3a8f05d4aca9652f4e796c +eee10a1f140523369f5d61f48cde2abb +b3184a5e6f07fe0d7db54f1ae98fe48d +c16bd597445766f625bf05ba2b14079d +e225555211216fbba789e9b30ae7675e +01b0463a2f3d259b1a73405d14bae002 +815368e4e80aa28db96aa5ffa1bb9b25 +512a614742aeac612106b38f36830c1f +63259862d9111982fc2bfdcbea692635 +a30f68bb98cdc06a4c9823a692295001 +5eb89aaee2713ad9c9ea914841863785 +cf0308117211b637f65c28d27f4bdb2e +3b4b18d60044fe6bfbc33548d90d06c4 +53d7d7885ff03fe25ddcc30d60840525 +f9e4c2571171b37dba9e05f342b6dd6f +c3eac116d382d837c98ccab27f9f3a90 +c9b22172e811ed9b1640c3e3972bc2c1 +5bd595f803c08f5ec452e0e26b44c8d4 +3c98ba89d8b41bfeddb43d49851a6451 +bf7d2f0a171f6117848b160d845b65d1 +dcab548e1155b0c379dfda56b4178a6a +b8067869917807971ab0c87cc12833ee +1d4d3c60401ae26ff1f010deb0f266aa +d52137206851980ebe7a88360f7ebf72 +60b2e4d2a719eb487b456fcb66b8bda5 +4d043abdec007dd6218514286e048799 +0316e7a6684ca2c2f06c13c8ac15117a +4df2330346ff724461480ae6f292010e +0b0eab64eaa80a0e96b09acd785a461f +6ecf16935435936403cd8da4e38d6305 +74f6d5aaf64a6a3c76fa5eef1967eb60 +2e818af7d25611b385c63d33d6685ff4 +cf9010320d6a8427f2cebc5eb9ffe5f2 +ea260364fcf259f67efc42b29919210d +03cf5413ba9eb436693ffa6ca8e80c58 +f10a00f26eb8bc8ef7de129bd482dc92 +dc8d46e6ea50a07791978c262648d00c +645356825c05e2f24653dcd1d6ae5a6c +2ea8c9e0cff569583b9f10139381c945 +d15d13a3ea77233149a91517227af14c +bb5cc7a600501a46833bcbaea20d7a87 +804b5912e5eeb307632392aed646be82 +a50933ec09dfd04403d15be88975d2e3 +1b344a5c954401e30c236c65e6f7de73 +6a0419c5a77c660861e642f6b23b466b +c5277ee6b21bb7ecc094964daab552d2 +2a6a62fd49941a7165def6478109539e + + +628cf40a4ba7a223b5993c7994cf21b2 + + +f63ef04a501398c9ea62416285a49ba3 + + +58e184b5c2e12e749884af75e9df2365 + + +560238a26a83c9a5772a0a66aa8c6496 +aba848bb94ad4ed9c3e4dc3089283444 +a2136087f9caf4b0cac18229f3690dc8 +41b3681c9defb8e0762bbf7c1397d821 +8de0815b2069fb7f1cb1ec3044751918 +1cc42aa2860a8d3c7f3e62cfa327e7cc +6e4ca7bb21309d0864ff5b4c35d812ef +a11798714ae699ee25d3f54265e4fb30 +b2006f50997760d862e35c5c360226cb +865cad73eb89c01651d884589bd4763f +40750367691dd20603551d026b2cf4d4 +d754c0655472ca097ebdfe812abdb264 +e0cf2713564fac2e99a72ee6ee57925a +8b1a3789e6ee83787a070eb690990dab +a2c77b8f765e5d093138b59ddecee582 +65ebc33d28ef411e036d5649afea5d00 +154583a21b3d64d8b26cf410f241793e +31cacba9e412c90a0f9f21e9ad9c81a0 +8151355b62e2515b90d752fc32452a54 +ca00bc92c1e71069f89c768e3176a0d5 +b9f778b98c45c31ec95691a1fc4740d3 +0cde5a1109bd464ea2b1724328cc6a62 +613574e726883dbcd2d93c1e7e968f1f +851dbeb4901fed90de52fe0d4336ce0b +aba59b9e43759d10a9da893198c8e9eb +53475de47389aedff8e7f9c603230184 +59c3dc093e6bc0bc0881730531898dce +2ea6dda2513d324414bbd8ac05b79d0f +34100700bf8a90401fa1bc3863a5ef06 +194e20e5ee6c7a5c79eca598e1665bdc +bb155e898159727529c39dbfde416f01 +bd72a5424aac4b4038a2f4cb2af74c8a +0a19bcccb97274a88b86003285637260 +bee383a14dacb5f2ba3b1deb8b84f54d +035255a8d30488964e4677513bc14789 +829c46e07c543f12879941999be47123 +e5f41d8abd451b44c5f92bfe6780b692 +8b914474fc3f2502f64f5e8288443a34 +096402ea8d76b9a8bc2c4cc56a4cd823 +a9bd287a830192f3038bb327df668791 +b5f41268ad9db1a4578bbb4d5eb07b9e +16fb1e3b659211cf67245486cbd9ef3d +bfa591574eed530ac9577fffa5fc543e +b6652eecc62028456111cf056d8b5812 +b1cb4d617393d1f38502b65b988df321 +15feaea674502dfb321e05240f7e10f9 +68f6059323f7587650925bba9dc6caf7 +f77470d1c3c831b2f443b8a1bb7e553f +9d74fcb626d5beaabb3f6b6d3b7b8ef1 +96f19a72812f90d34846cf72b4bb09cc +b60a3bdd85a269e7dd90252f987e7c0e +1721b63576167a05f0e306f6baabe3e0 +dbd015b2051d98db083351905f5d03dd +3f0605393e4248214bb0d8014121f1b6 +014e0b3032e71c8874ce0a44adae40fc +76f05447a6e19b0ba92e8913db3f0475 +590f0e56dda084a184fad737e6b8d80c +7371f1cb0309696c7d6ac33ad75a5c89 +5df6c6102516a57c741fdfd303c4ecda +687367c7a131a2b0b660f0ca30aabf73 +2281057903ffd3f5b0a4bf95ce8d3aee +2bd55711575c9ed0f34ce5d891e63cd5 +34c94d5146f17226fc5af7ac3ba81d6e +4697bf31f23200726d4fa8da13ebf106 +f2cd34ee65ce4804dd5f49d5d8d764ce + + +bfdeb2451b2f7fc2e429b93a7fbe8c8d + + +77404b5590596de508a542979f3cda84 + + +4cd22b579216b800efaebf4ad967f4b9 + + +7707f892d65975d434b0d353274ecd37 +128d503e78dfb80bb117f36e08c29e77 +88946514351c89d510346dcfbed7c237 +639c6622389ed4d92dc5203af5450b2e +c6b27890c0485cd16677d56507551416 +30e323cd262fffbfa81d283aea3a7c4c +b347b3f7ec52933999acb9dd40334b5e +752f4ab14934dc51b0e1c7533218e66c +22a3574e96ebf1e8a38c44fd8a55d411 +cc26117afd59cd39f0aa7850b4118848 +0b8f23197743e7e3fdbb330162606a47 +8ad26513a0572bca3544c64042be6bda +8dc9ba170a1391983e685113ea06880a +75914188f4dd766686e1112476f537f2 +f5022c47307973fa47ec431adcbbfd23 +85cfee1df402b0e6edd3c00ea301949e +f18db89f637d124187becb74e306f8b1 +685dd527cfbc1fd0f81a577209f5fc97 +ab13630cbd56a3e966841bb42bc97ec3 +687a45c78ca99dda76c3551e804b0a8a +8730b71b7adf7b84e6d2e7cae5ad46ea +1ff4c951aec067c3608ab6ec27d3f365 +ff174d3693adc6caa5d8b288bd7af1aa +a1bbb530fff30728fafa1b28aa715869 +664445e2248ad3b95fce168000f88c6e +54d4fedce75e01c45dee02b803114969 +a8659fc797d16b15fe111d5daf904aee +720a5708df097d7ff4ada620e7581a07 +0d455ea395c76621e0dd5a7716c63450 +57dbf0be20009c16757813d53ddc5c7f +4fd49cdd0ab52eb820b06f6b91f7b535 +4c1dcfed2ae2814618e2a45010459d37 +44868567341823104594ced2f842d48b +11b04aa7980130f62e3ac1bcd0e93a5e +0042f12911964e76802761cb775e14b8 +b570f6494885f32748a306efaf7c6d4a +8068829accf72a96bfe8000f56391f7c +a8e08e0a047ed303115fc61362bf186c +32a94143326b67c8d178b6132e3b725b +96b997c9623e32c40c37b30feafde59e +5daef170c5fbe68cd5f100d107e01504 +4afe82bd50007fb49423ca8a311cb00c +c8c4bdb4a1b617322cfcd26fd926e58f +c5f4573cdcd1b640a2a2b708c6183d47 +948ca535f90f2dc7ad9107cfa7aa53f9 +82bf1c25a7d5e5c391280bca715092e8 +01378ce47159a00fc35ed3a2b0c5f38d +39be56b5d7583f5d2b0ccc6fdfc769dd +5c678c0150ec5275dfda6d176794728a +f000ef2caf08334b13d4a2e394432612 +62c402b877c46cf02cc35beb17a1f731 +c1ae7e25e06352749f6fb0642ac45a24 +c4ac34f0381e28b826a88de77b97cd68 +8edda65f22bb0c407203d1402652e3a0 +a46fb6600d397ac28629fbd869821160 +3113648d39e5735411d9c11e780ad4a9 +b2af0f5e003d559139701663a502cae4 +e85e4d6872aac0ba336e6668e896985d +d9518e038a35a88a20e66e0bbc07e5f1 +efb7ececd6c8a55a744c4215dc178926 +32d36311e6dc45a2416667c034f7d461 +4e2a0fcc1a79296818800542d47b78f1 +5c0a653e0953467f63585f1122af3a6c +4471c14eeea5f72781d82f17895d5aa5 +f0f59095d0e9130e93b9e5e084868a21 + + +146a3438dc882b98c821e65ccb6533af + + +48efb991345980388b972a538c801e3b + + +decc55acb3447421b0a38d668853ebac + + +903f2c24d07168492b4cd9d513366b36 + + +730b2178e96e36abf7595d4663cb9a71 +2c98b4264c72874757a6eb6ba708f159 +2f05ce9a8e0b064f051662429cbe7c15 +b981877c761b388a5c2258afe118ab07 + + +0018a234ac89fade98a4a34b682c0be7 +49888cb47623a90b671b82c07bfd7755 +6104899503d5d45f216a16d791cdc09a + + +e9a6b8f89d741f5f66cdebe5338b94dd +0cb79627c76e9f5a2f6d0028fd5b9c7a +de1a854afa7be8bffb6094cea1ae0f49 +69835eb2a149e57a6bdcf506cdd470e4 +f74615c4acf2c37adce3468715ce1883 +02684a3aa4e0fa3c70c8f3ac18ec44e6 +1a326cb3e268428027376c7968813552 +fe7c7f4957cf56fbd2fc5d04489bdbbc +b144bf1399a9c3bf537f87091ac51af1 +0b83651cbd18a25b1278851cb42c7a16 +7632beb918653ccbbfcc1943e9739d3e +6d2f4f0c4588bab4192c5aa999f39e27 +387a6465de40b3d3e07d68612c97a169 +ef7d42f093f18a724028545bd3e10c0d +7835fd21fa3387409f2cfda2adf3bbb0 +6a8173b88aadb794a256bbb80862dd37 +dd814a607d93845515a52317fff7d7a2 +ed1d4ac42414cbbf8d0a8fcce9be5aea +acc7f66154278876e21c427c3d31eb75 +db0c97e5870453e77ba448f874662423 +2f03bb3e6cc6e7af97d2e139cdbc373f +3232538a85b81791d4ddf6aa78457ca9 +2a1ec952faff1c8a3896d599a031f928 +c84423522d204853ccddb147550f342a +79c3ea0423816e32bfe05ebacdb52cd7 +47a41514248347535aeca61eb3e5f87f +733abe84eaf125cfff136c23c09bad77 +a1666383d423bf454b13130f0d4fc234 +2efed899cb065cd7ec7f0e3c2e012396 +fcf4a19d65287dc290223e9555f6e7a2 +ff05ba323fcc1b2f9b31fe6085ecf329 +4eb088fc41f820bfadb4930da1669e46 +6627e78497bebbfe7d03c9e5929951d1 +7d6596134647efe995e984474a711bfd +dc6144c7724d4e5d4574847c7b63fc6d +f3099ec7f12a24bd061fe25d1182b16a +1236fa5e516b6ddfe391f42c142d120e +46713812c6e45c0243387d22d6f8622a +3e58a741e320f2e35a95cb1df2ee7e6a +ccf3bd5df0a92678efeebb27ba759e33 +54b9e40db64a48de20f8d0643f1224d6 +dd3e4baee07ad530f36b53c699934600 +49bcefc242ac99efdf656f0f95757eb6 +197b01e4a102e93a75a70a0a80789885 +b6f9dee6600c7c3e668af4b732be80f3 +898721e70adc38efbdbcb3757dce762a +c718afa7838175f9d03ddbc04dfca03c +2a9472fdeb3f13f6e9a7e05ccb5a5666 +bd3283d5022bfd341064e344c0188365 +591551f798f0cfd1507bd360c4ca8777 +6c4381828243cc9d1e84080df62cf43e +78a6e71c5b6002761a34323f85e03946 +7666e65fc755c867b1aabc0217fcefae +51086417bb7cf0f16f213a9bdb571002 +38fb12879e47ec572fef934b1224b272 +b576e50720b63f798eefb315703c8cff +c38283cdeaa95378218d3665cc597c9b +0b190ad7f8168e07facfa8d4d34c665b +a94d05759d168786d31b91b9b742a47f +7f9810edad92becc0a5fa850f4d92550 +01b0e97a8103bc9b715f35b4ebad33cc +f540b3ee0426841d5c3b410ac223642b +753f7961e38db702eb94f35a5ec0a691 +73181022f59b20bf9878c2f4ab88dcfc +4790650b0d5ff5ee1d53c743eb0eceb1 + + +0e01bf38772c698d9b5d4c2aed89bacd + + +8a873d673c98970c8e7a1a583ad3bf69 +d3411df3119a34813c2843d410542e6d +adba5f2e8aea36ae13491de788d3cd29 +f92e5160709f56509dc816e483a1d13c + + +6227aba90c0bea16120263d97a144acd +9fb077a1e341ec0e5b98ad4e185fd22d +dce28e58d0613b9042843c263adbe2d9 +1fbf7dacf324a615b97aeec5b983f4a8 + + +866057ad079489fe7e32838d8c499380 +41db43f5238fea2640e496a67e97c1c8 +6d4d90557420948fc764041b7341a4bd +e676ca891c4261577e3d0702c7f4c25a +a876bec439bd56f63e52aaf6551e9624 +9864405349e038742860612798e6a918 +346beeebdd3a7079e71b62d5938889ab +717ce376997563e923eaec2c9fa1c106 +584219e2ee406f237e1ba56d08b11f95 +76509ad5ab8986b87491407540d2984b +62d9b8189157bd1bbb683f252ff6169f +0f95064fd9f16a82c99f4fac06d3a737 +d51316e9ad60e35da9b7a84992bbf53a +8c0eaf4e49ebc4b64dad07a574ddb52d +34cab56913a12c8f3cfbdd7cbedba361 +7e71199d2334d96bf245fa287f5a4a1a +47521b7184d705554518a3ff1f94073f +4a1a0fbbaca8abf409c6f16a109b7aba +2b866d348468dbe6404f6c56f448f9c4 +33fa3560ac1f86f39f5a2c9ca61b993c +2c8a34dbcf92650dfd9b6b2a68bbb906 +5e37a2ee5874098bafa6c51cfea80123 +502ea8699641cf83217b6cb5972cd1c5 +a635cd73069c12bb0e0e81d4a7a39c8b +c2ec5e1cb7d7d288f3931fb32673b60d +a123b9382bd9ef7386175f1f71528486 +325aa87334b1ebefbc8d879248d300ca +d05920075a6b578127adbc1b6592fbce +7d50a67aa58530da49dfa5f21d2ab35e +31b50a949a9663738ef5d8ce1e3a9f7d +9cc343774932c4ce9f66bc38b232cbc5 +5f271406fa10507bde1cda5dfda82514 +110f53f6746e569898757a8de6a9b880 +cdc6e9c3375ace1bf1ec3ce9b7a95b20 +6dcfc5060233f29772b6c99ad7c6f188 +87a5ef6d5b632077c6bbb92fe3b9fed3 +a0acc37715fc34be00d3fc5720a67c65 +6d0cbc4ab99cedb6152d97d40383d3f9 +b45f087d77eedf4d7c63a4c4f1970bb8 +b6650f4118bafaaf48e623b4523bce8d +e48c8bc4397207061bf9672ddb7504f8 +f44efd782607f2a29ac3a09a8a8686f3 +443d60344ed3ec1decde608ba71cb29d +c6b327fc7149061e10a3de9b2f5395e2 +3d34025630c995e743260ef6fdd83690 +89267d685e2a8de5a1bd2ac67d9a1292 +6dac2208bf80ae8ef95ee1270dc0fe9a +be4e7ef4697e4939dc614302f0509d74 +e674a2cb9e2218198d8b8bc056097f3d +b7e65c55dd1db4b7d2a0a569eac854e2 +73fe1c847d82415bd179e0a776f53936 +d55016476f3bb7d1dd767fe8acca0c39 +c255d5dd8cb46c1619c2243649945423 +69827e6237546ba1da3fefe76ada31ef +d078560c79300da89352b34e319df9af +af144dad27092ed2076a2954faabe9ea +b3484084cdb615343b7ba6ac9701d6fc +2ddd9cc3010c8f0cafaa92d8aa22c087 +dfa2272a26e608fd14263e0c7b15578e +cf8945e482db9bf76d77af1580965378 +52f495a9cb8521fb22e921337b35ff8b +a51b8f8a516859bc9a9897b3a57b38ba +79e52827473a93a473166e21d3346138 +f75871ec96c9234377b3921fc4b1fdd3 +e46cd3a29608b66bb2818aa1792e8797 + + +15e73b634e4d8aaa8f17409806133a5c + + +ba07bc8eb2bce812a1d2040905149fa4 +aefd18959df85443c31ded83a17ce11c +6ef0beafe86b835ccf854c1a92cec69f +dd89569990b558fd73df26d470738628 +8f1044e1d1fa94a1136be2093ba4cb2f +3a778b1f22c9fc3d1b599131fbe16f4a +015653fc33b263a5b28169fd824db09e +46fc048c4a7514cdb99e9b437f526d13 +c03334df58008c983387bfece1426c9d +2b424d9e6d8e59302b9916a20241e52a +e8aabf620e6a5d98b7cc2c64c6b0af74 +4b871b31bd8de664d48b2f29458f6db3 +11bd0047df947ab88590059a78e16ff1 +f8e0a1a8f13733d6a7a5270fcebae393 +634b15f413f91c22de004de56830b035 +293eb819c592c012e300fdc18b3b0ca1 +83b0a925f2ca66740d1e8c11a2dab0c8 +97594b67e693c6b57969599b64a15b41 +6c59e43757c9c401120359ee46ddfbd7 +a751778d6a7d2387bb61b5adb378adb9 +8013ac340c2505e26de39c361b326ca9 +90e542e8785b3a08b183ac28aa574de7 +be4640834859b04f5a0ef291471be787 +2f20a73be82bf96207f148a3ab31e36a +d505eea409a4c2415a12b3240b4e7d78 +e7439a0718652088eb46679f10b75f30 +f085dd2f8370d44dac293957cdbf67ce +7fdf271038be6c5e9018c1cca6d3ab85 +f334305f7a526767cd39ad271952e783 +f28b76a2a50fea055e7dee2bdceb7562 +8e8f2342574c3f374678d3eb23c78ce8 +5db09e799c2817e5d7d43c7178cf142f +0a508c373b6e833d8d2a09d57b8565cd +f8d11c86b5dfc618655478757f5e1c84 +b94ee3e355209d8e560600e45475d9f8 +a6875466be585088add2e326588a462e +4fe9a2c16f1741bf588d581012ee7c24 +d333b0c4e981f824e1b6349458ddb2e4 +197445ba8fa68273f8d506c6c684128a +ed467f7a3f09b21ae9fbf7cdf85e92c4 +0c1e7e4facb9242d5b5299603bb0a36a +34fddeba90f9a39442fc8d0fcb1f0fe2 +8a06f205553f05c953067ca5272f7800 +7e52e6107c178007bf76b14a8b542dd5 +17337154b07f2ae57043031c0240a5f9 +abc6ff7471a439c3fd4c7a1e4824d2c0 +8fbc8ba712ac0c6849d40b83a81d0e56 +16f9242faae03079564ce4a8a1e73ac7 +aea7950d0d1571aaa570b963a26c47ee +8373a764a7ee48b781f6317dfc722ffe +988c6509ce54baa98d85a019c9009e7b +ba461beeb4645d9135a8a0c9378b300a +3bf25c192fbd7a2440342bf0dbf3e789 +79993e0fd423b00535d60ca50932f279 +80ff9bbb6e5bcbe8f2bc1d29e531683c + + +53304157a61719498aafb6d14629c970 + + +202e57e1f2578b749e55a931c7c3ed49 + + +5a2ad8755f17303808847633d189ea5d + + +04a3847804af946c34ed58e4a9d3eded + + +538dbfd4ad06c3907f75c86543063ef4 +132d1087675ee7be2e15150b5911e830 +d23d9fae5e3471e0a43c4f8913ac71ff +5b73046afba55901acb028cf26459847 +6db46553ad49d8cc62977513fbc122c9 +4c77b990588f8c567dafaa8dea2d1af8 +534cb2fb7f566eead9fc4d8ef33d99d3 +43bbf14fb91c6e401cc17ad26463cb30 +e5feadc0b8d745697956ea2adac95065 +bcb7f401ad3609ce70899241bf4ce292 +633ef5a001c1d0d102653abf2ab39611 +f5b23eb364ff3fa1759b988948ea85d1 +7e0853471fa2c39842af65fe25406219 +ff971213cafa87b9a0bcdd94e0ece8a3 +053b5f60b782a1bafa0bd41d3c433a1d +1735251075c6340d7002784b214b456c +5a6afe1158f28fde9b726c5201fc0f2a +75327548ab625afc438a4be204e4d0a5 +8ba662099c5baa99532e13b759a58a0f +c62bb50dc9bba44cc9669a970e47e8d5 +f71b5c95a615e672f2ea326bf2b60db6 +275fcbdcf6cf367fb9d3a4ff1ecb4ce7 +cae9d8045ba0a0baf1c028020541fca7 +23f67d63140d11accfbee7bec1ec283f +2fc2563909edc54ed91d37c7d3898fd5 +000c85c95f433df8930acfa34774fde0 +86ff7473d2ca25eb055fbe794bafc472 +3cda05435e8c01a4b6d35899f7eff465 +b45cf3999cee9f61c18dd7d1715af65d +f0273f3d0c92180c8188a8858cbf61e9 +cda62084753f224d0a6456a2428a2e89 +56300b715f1fda9c6653153011c995c2 +60f91114adae55ef0303695d42e58b46 +689fdf742b8557a9559495e442fc2fb8 +1e58e80fac734bb1326bae32e654a9f2 +0199b65a17b17381c2f4d876a9776f56 +df5c17977324a9f462d3d56fa2bba89f +ce11ee2e7fabfae1f603fc5a7a58a6ad +54d73a0f2b0e8fe9bf2aac2340d06d44 +8b00c222f6251d38d0c569ef3aad370d +8fb092cf2ee9839b48362848d9f3de03 +124ce5b27da467279b69783855ed3e7e +1859b0693aff46053c183fcc15626105 +9c1cd25cbb532f3e0b231fda75b3f507 +715aae34317a11cbd5915231e16fec87 +9e98398caae7b17077d0058b88d94937 +3895e3229dc416a0c28b814d02ca2e00 +f50887498e1a0be76300190abcc72e51 +a72501d080cb9bb829a169476280dfd1 +689607fa0fad4b9eba86b1ac19b08237 +209338263e4d3ddbd799b025980d6436 +43ff40adae01510fc1f20d0994727a81 +2f98062a90772f93729c2ada7a45bc20 +9c5a124b37d8dc2a518f6f710559e570 +84da593eb8c2320960b1de541d829a9a +53a55b3ababbea9f154d74c62f1a6b22 +a4c3a9a7545e4994e142990d5a58387f +48d2bcb938967416dacc402a93909d80 +d103fb8065c428fabbbe4c885b138c7a +ab38212ff73defd1c8fbfbe534c75b0b +7223ca84c20bee8ff6fbc4f47c8518f5 +d1bc33f0bdb0b31d8f2c351078338d5a +77e8869f3eff348fed0c7c69207a1042 +b33b43a608a5fa7491869775ffc458c2 +a799c44bf982bc6a4ba93c4d3d84ec4a + + +bc835218d97a41329962f0d54b01777a + + +8612915036f094ce416865172e14e97d + + +cf68254069073f12a201863b736e5943 + + +1752a7036efef4ab87c293bdc99a6ef5 + + +ce61f11c776100d7781a2f1e80bdd253 +c2c1de58f780372fa723cf91b29dd84e +58b40d3dd0f82414bee402b565e45f42 +0e7864f7b7f3fd0e500111603c3dbbdc +aa9f9f8076579ebb988b5fddb117565f +12a37231dd9df6bced0a70a162fcd29e +e764c61f036660af1390793f559cd15a +03ad35fc72a3ee50552a90aacca15c9f +2a522071bd65605dee2b97ce28abcb27 +a62f14439f9273f0d757bfc005c44467 +e937dc205ea0564f197bcdf8f758f5d9 +c7cd351bb10ca27f5e5135c511612edb +a0c7413cad31c78be00757a4d696a9b7 +35666c7db479d5ff1399b1487279c793 +63222c5f758cc294bb0e41787be95c07 +6ececb35454176da1813e95478263bd7 +e6e6ce33b1422bf712053607361f1cc6 +39efe21774f3459aecf3b7c5f2673fb3 +6a12a0fe421e4a943f5fdc7a76c862d7 +3961f6099feabe54add76f6c43ae718c +b658f44e1c6b6886be7ece9762db3641 +0c881a0aebf3f15ffb44a4c400116bc5 +b4e6032229209b334fe3757e0d5f6d58 +4f9ee63ded566a36de4b77a537defeed +689a14afbd00e0f481b91085e129984b +8e2f4a4cd02922d7d5e40738aa6ca7e5 +c0287826d7c0e72ab0443149be998667 +4c2d7019cb51d6323c5605badc3462a7 +72f3897af71eee7f2dbb5070bc21bd06 +af8e31e935468d979fb007bec07e71cd +eb316ffae28674defd706633e6e15874 +3ce46c8ec132f2f44018b5179effcbe6 +b097eb2697f635ce95aee06d7d3a2e7b +1177aaeb8fe88c302e5b7d7a3a6e39cd +4d66d071c1b967db68e1570dee5ac60b +43cdfabca51ac1ec8e82096ee825a509 +efc5f604f027765105d4e8f10eafcb2c +77ee294fab4927c6b05295ac7f52565c +52730c662e20f0457d617bd222e3363a +61619d87d4aa8c7b432f47d8c42a9ede +fb606b68fc0a94ef747bb5b609ee4ae4 +7a3655e71885f07ca9a540c7405ed67b +5f080bcf82583f9cef8d07bdd7abf41c +dede2e95e289800654f3be1d6b4aae05 +8162219cafc1a2a931892a3581a64492 +77203c41eb8c95f8c367efc0d10281f4 +cb31651660813ebe9130e025d6a48e0f +7bb4133e9481f1a3bb5047ed1983ee0f +556417b9941a3d4a517321ca7dbc605a +665d5a5a68a1de104557d2e35ee38f4f +c5374a7a57b661d075c83e694f29ecb2 +3d45af8782202cf34ed80274c239414c +376b751819a332d219dc4331b9d9f62a +1d1c1eaa6cd7ca65cc1cc163f962a206 +90d0f624581156184f07e08e3d5432ea +6de95928c986caf142526e2290d71813 +cb554f4400d9f2ab8b0d05d037b3b987 +6283f604b51b4c8436c19989d1d04c3d +afce0de88f049a56a0e2b1d7ef58514a +25a25ecfc0e1b63fac9ddfacc0cdf8df +8ab789172fe09ae5895b1e59ab201ac1 +d58a433bac370d044569b7d8bdec99fc +c1fc94b7fd1c4a40071501d0e062c9cb +4ba5542783c491b5585f72f6e24b38ed +30ca3cb8c6b80285993187191322a178 + + +82c1b74104395011f886f59c92dd03d7 + + +952e216a7803312fa67ee61c06f3c532 + + +7c09d7502b1003f037335975bdf8c7dd + + +60e76204774e71ef96b26185d68d38c4 + + +274f439e4dfc674581c0c72fbc7ed430 +0e3faa2a3959f81d79377f971b7aca93 + + +a519b7d68b3059c94689ff74a4740d8e +426f07c0798e1505ba9e971f2dd47313 + + +0f3d7ac5cbba9e704e0d26d8b515b371 +f5788fc7a0f1033f63da79e866548c85 +dcff781648fe33410c48967931017e2f +eb997b9d9f545d0e417ff6b6f835e1b4 +4bb67bf400590e434860f08db98fa46c +91dcdd9171330bf1fe2a68c75781cacc +ba52be3319719dea18f13a00e186dd8a +9636bdc181cbd89f1a3cf4a282309770 +abf3374cceab6e094a48b353980eced3 +44d36c782ef3bd210e3880685b20d9ad +93d0d0a5c0f829d01b9eb2d4c53c6bee +783c6fe18aa38884e7308148bbf8a284 +b740cd6c774df05b4c924cf0f42b5b13 +fec94613049294e536d3e4950fcc3dc7 +6e1d92ef906107124621ff5c541de67a +fe8c72747f740588ef09b74c3445f444 +0087533a55047448cc2fa174051fc466 +f51640826ce645e6ecca937c5375c92f +8e92714657b67232e7bf174630be8a8f +4fb44b127ca30b811af3230159460f1c +9536a078ef77aaff6c4db757e42efa78 +59cf7de75879f055850f81ac48274d20 +702865c717365f25ecfc9de0fb865db5 +9a0637260928288f4da423cfe527c2ce +6bf8714bb481b3511e42d6df5fac1ca7 +96ad06e54daef6725d2dcbac1cb90a42 +9f7dd0c7c5c0bd66ee32e2514ffc028a +26070cb9eb665c0c4758e0c5b133c283 +a29cc607c2198093066636105cfc0007 +83e90e9669014742999eda33936167e6 +5e46c8a04b9765c01d9386747fdd1bae +91e3aed95d9eaff1179580268c668ad8 +c45e4464772f1cbe27d9f14205f6f6e9 +f4aef961a8314c0aa559cd22ac8bed79 +1f8a24000c0a982800c0eacd1c33c5ff +40e0aa210fca124252fed7e441e300fa +25a7e146d67fd2720cb6ea10cd21bbe7 +a405f65660a02154d2cd022d21a8f816 +a6bb840e317357a855e7970e0197aa49 +eca38931fc26931ac695d6ebc8b1d470 +28367261bd0930840d0fcd563299da80 +761e3fc90e2c4675f75bccba7ba9aa5e +bc29ea9a5bddfc52d70edbf81d340186 +f712b155531e614b9fa18a9e99fef5d4 +3d980736a5e30ffe613edaecb0c60f72 +42c4aadf8ac6bf0b4784adb23eb04d64 +0c554ac4e30366566ca47133eb068084 +d155b3131c606911d779b87473fd9a65 +5660169f40ed8a6aea22a178864198b9 +5d7e7485d9832042e8da7a420663ca26 +305778bf22b14d32832b1bbc5c167c8a +1859d4258d23bf9ab57ceabad5ac0a07 +d77471c5ba4d6b0aafd041b366c089cd +5c389e5703aaa95c615231c9be30fc33 +bd97c5e7cd704fe29b5036cc107c4e12 +5ae453453198e5403d1673163e468224 +d5135f45590ce7bf7d0c902d13f6a2e3 +e398480ad7b1c3e8e923368923e344d2 +34d7f6131031d76a22cc316260cc65af +b2eb70b61009ce12a9b62f89d1853728 +26617630e0aa5bbcc4c28872dde424b4 +93cd0b3f03eb9bba86c79509810f9dcd +44ba81bf0aafabbcb26d420346eb959c +103d78b92539c7b44f22373d06f1d767 +40883fb361fc5de2a4fffc39e1e23cac + + +18a80c4fdd6880bd19be5a10dabdb048 + + +1a40d00a1e7269a80e45923f67e9f5a8 + + +8fe98c303f4642d919ff7dae5b865d27 + + +4dca28d39c883c265755c22e7e862688 +39f190894937b1f55e2df3276bafc229 +ca553844064d55a929c15b6206b7dbd4 +f0ea23df199cedcd015f754e67ee2f2d +d8185b6534928c2c27c3bd7842311735 +dae98fa4994180c0131251b81b438490 +370181d8cb642b916a09caf945a749e1 +0627099bbe99859c133d245036920813 +f839cf450e568e6a4c8e1db0a0b20fbe +53217574d8abaaeb0ba5f788407c0ab9 +e862dc16e5bee2285354de770dfd072b +acfcaf6448c9c745959e0499b08ae7b1 +3c5af3d9b79fcfbfcf538056f88d9eed +4736c55401db3a05ae6dbabf89133295 +a64c683f02af2f644d924d8655bf44c8 +6b809b39a0a46a9169f4db859663ebb7 +ef358d40f208b4cd2e2fa4da1ad9658b +a5c88f09491161c3ad9497c4ae263a7e +69b9fc03b4785ac400d4193253b4c6b6 +6c479c20624e3d0a3e58ece610af52cd +12c6543aa68a7bd8150fbe9e3b083608 +46dc66cf74689c57a92009a07ee976a9 +5689663399bc0b6fec8c107866c65b26 +a630f0b0df9868af5a0346f21bd7c0e9 +0da2ac555bb4df1b95c2482e19b3f69d +1d3260c0a3818c10ad13891dace380ba +cad168632e760ef4b052c0cfd9eedd7c +217f4354eba011a1904c9fb62467b65a +ef843e2689c25c68466d6daf39c9d4b1 +61a9a7f7d8571f8c11083c0942cfc265 +163a8358ec114acac5a2672ad4e37b2e +1545a5c74ed936a58e33dbad6a62ad29 +d98d2d362d93297d345ad4bcddd51792 +e8e8b9986faaecb3e83d01ef2689f087 +835772ea7744a5e195ac52ce27d761a3 +ef403b20c412cb9e46e7859831d7abee +909b41ad567a4d741b3813fb2955989a +f6b5953439b5be09382bfcf678c66c7f +50a82501f08a3723ec41f8f6a7f79247 +88ffc04442458e992cb35ef5be8211c8 +0fd72a4260a889cfc3e5a8e0e4ef1892 +faf618f0b2d199a246b4b922414e3d4a +8d1422de45899d51c8bec323da009715 +b73ea3bb9c43b5cc8980633dc76a87c5 +372850e153891cfaf349c7411f953146 +f3ea58b26b1ab4a3be56ad0f921c0b54 +3b83879c6f64194a2e0fbb919055180c +c274b99226ddc7e2db79152f57889501 +8b2a47a567e56d47dc1f88db9a9f9c1a +e2cbb038a2453d9e740d702133f36cef +961666e004788edf9e751d461350f27a +46d32f0f94c4524868004e728a51b132 +c5ea60aa79a8809a9e778625d2d18d8f +210567b7ca250975dae6a2f1a4787a23 +94b1498250d321469a72fb0c71ba012a +14d8f11646b47766ecff76b6feb93ece +0b88fbee7a06b6cf2d661089f1b32afc +0ceaba2ab6237ab2d1d4ac619b89b2a5 +b2c53dac18aaa333ea14b46f51b18151 +b58b6bc08c4bdc1f3e229745feeb0572 +8403e47adcd8429e23eeaf6cb6b15bc5 +cfa2f5fbdd3d8ab3d1249bd758c7a2eb +340190ebea4fca04c19e01deb0d3a823 +5942cbd2a0ac63ae845307fa087e2f7e +40c1b14bf010d494817bbf3816790be2 + + +199ceffa80f4db1e3e7fabf74bdee32a + + +4ab54cbceb647be525aab443e86249a2 +6d10783b288fe54b3e50f828992d0745 +1415a98b14e5cb9afe748c674bae25af +030c9387085c667ce9014f8f17dc0908 +a19b5c291ea2495e2432a27a54353606 +25b67ef8c30f1bd5520742c943025538 +1805943c3c41a0aece435f873cb86703 +95cffdc2b1e72e9b8baae9e00aff08ec +e38d30e0053468a2789af17d38f9c444 +457178c3e1e5a10eeab9f0f920df8926 +93e6fff7bffc55153d9c2859ac28e48b +ae7676fbfbf82586f79479b56756cce1 +11510868ce8e8ed585a6ad563ee22a9d +0813f938cc098ddc751cbef6bdecf7cd +3d403bb930953d625b0a771484cc85e9 +e24a05f22bf8f9d91fb17899c3ac56fd +94ac3c915312d3e4445343bc99be0c54 +0c7f9b9d0824505bd03fa82b4cc753a3 +a23c0a40efc09de6a7640b5d0d9f4bb7 +14eaed2d73022fca3bebfae0052b0c6b +c4b9c95d9f742081196beb6e72ded20f +a1fef4cefd9e43603349f8e4d9775029 +f3f0b68b3af528ca89254103743c048e +166b5085bfb3eaa3d73326a8829a34b3 +640883a64b98eca9219958f0c9a3c777 +1b3f37880568ec36e07297ddc71e2baa +9683369b3890d4830e9e0ba0e65743f3 +5da336a24e940842244ba5365f8f391a +fbcb93b073c2737f2238a68e0e8d173f +bd17ba6ddc0c45fa6b7b7dd3704a88d7 +a8642b488c4247b15aa815bd0fb20c3b +a0bc93f53f35404900f567504449f73f +b1f0a29724f70701011af095dccf9da6 +68b71eb39de968b214aee59c7aee63f2 +746058795a92d2278489bdac1c9eb850 +82f4dcbc8b788985f547dccef636c95e +10c1c4d475f9050f55a4f30d321f68c8 +3bfda8ed81210d7473e60dfd1c5fb2b9 +a6472d528369b797a46bfb37d6ed972c +6d10783b288fe54b3e50f828992d0745 +166b5085bfb3eaa3d73326a8829a34b3 +58d03455e940b51010a2a56a8cb04ef8 +e9421d09d8e14616be9571c92125933c +71a6cf09e9f6d0f95ada2ec5d99b3865 + + +1ccdf2386a0f9ccdfb330c73d94e605e + + +00b40ae23c989caac858fb873d3ac124 +14faf3792bf93d633f5df02aad6030b5 +14f78c71cd3162d636189600d5f84974 +5021762bbe4d4798fcb665a3d8d1af32 +76768f4cd58c2c1843cd813359dc1c76 +df375804789f9690e28a249614ad7ba6 +b12ff5e4167d297bf133f2094bee6efa +131e3c919ea28b49b7a6d9a65c78a4f6 +e9cadc621fc6628900ae43bedc2588c2 +1ec75ac93040da667c202b28ef25c0ce +057e7bc9937cec27a5edfed1a42ac7c8 +11af3251e27f66c27515faf2f5230091 +8c06d1a432e946a46d36e2a0340621e9 +2e3d0ea285ae9017f538b7e44c937dec +249da4d382d5c402d55e5f4226b49717 +5e06642539e4c61baca4a653e4efccad +f6717612edc2d0fee57a7383566834c1 +89bbd0ee8a97d0c98b41b3a8f391c99b +b368be2dddfe4e1cee45ccc0b6fdcf68 +42aadd458f7a79453311bbcea86375b5 +5b4cfb1ba0b67adc7050fba492406cf4 +8d6c1bfdc8e23551b69c9ac0ec57e3f5 +2bec7a43e0a9b86c1f4be7d637f509b6 +f0413ffb9757b5e863a1f9253f0dc107 +83ce32f33027169c99c7c9ddbc0b2771 +36568775c9e37f9dfe71d9d29919e80e +68727476ca31236f8df200932ebbc304 +4a03d1a28ec39d45f7b7bda42b6c0ff2 +150d7d0fdbdc7455bf6806dbd6ef8a4c +e87c11a090aa0ac30a05ac2245c19af4 +05fa3667e7b38623db709904cd5d07d7 +f28187b54876865cb4c5f31f7fc2e33c +cfb636eff493d1438720b919049bdc1c +13c7b52746b52a5fd50b680881b47fbc +43b6bb71820d5c965140e62ab0b6c3ea +6e77850fca8b589703d58a4045266d61 +0b8c38e9869d2009c9b4fafb5b1109d7 +d0d02638396f0ea62ef23688b1a9483a +a719d20393cb1c8e6b40d96af550ebc3 +1ff2a2539b5b1cec552808f21f5a3816 +9fc4893e57426d217821f655591eac53 +efd6769107962d232cbb8453379302ad +f9fc5a95271f30728d96175e87dbb012 +e67871a9add3ef7ffbc50f6d6739ce5c +2055df6f0dd7e414aa6a73601798c119 +1a23745064a7dfeba86800a6e7545c58 +8f27ff406d99a4e69e7d53134a275d77 +1b463c26612a0c5bc7f6fc75eb01d946 +5037c3a630b41bc07fb3984bdadd1372 +ea0ad12dfae55282afcea286dde41636 +e17665b3b8e8142359d071a7422610cf +21c5cbf4314d815a0996789863c1d0af +2c53f94fe98a68097223483ad95c9a12 +717845ad41a7329687625e3b84312352 +5bf6082634b5e94fd4681c219b7cc42f +e1ce013fe04374129b55062fd7aece7d +e81be4a426762dffe4ee817c9d29d5c6 +7ad9dd30a550dc372d944939e63367ac +a82511d139f1fbad44748d7b0b0b3924 +a053e427ed77db13e2aafb7525780c32 +dad1b372fa7c2fc8c7563747e36ce044 +635778eaa8fe3385e4955f11d78c8eea +ad9b58ba80716a5302e96d49989d047d +25f1cd2f6964253c2d1e62108eded2b8 + + +37a5e104be6e4b2d95c862e1d0867c46 + + +cf48ddbfd3ea5d66e3c67944c8da8773 + + +d3854403cf08e84d30463f89a32f2dc4 + + +c834d231620c7df3f385c3a49a6b3d46 + + +983729c2e3729c8a76110af3191cf532 +d2fdf22855dfb470dd12a98d193b0294 +37e189ba7e650c04a0ed30c447f123cf +74c1560a1e90e3fd07fb62ec94853dea +ab8923da645d6abf8d6b1b1d29a67dce +701c785c5095faef2d96dcf67f25a56b +84bd4993d9940e95b43efb672703e508 +63d15f15aef078f0b344588d6122bd35 +6c3864e371c0cf46cf9894192c93fd53 +758b08db561feca036035c0c2f8c486a +74223e79d1cb08e07996a4d82cbf699d +7194ff79bc8f0633eb12c043b2fae8f8 +4a01469a35089d4c0fe9b4dec861d481 +4ae96a812d3347007b85c60b809b621d +b9065e340d80545ffd52c987d6e1cdde +7813b6214da575376a7226f33ca92d64 +fb32dbc233692718ee8d705f3795818e +a6056a5f565a5afe1125dd5ec345bbae +d6162c59f219e35307890afb8363d931 +9fb7a245311f94cb5485d0716a91b46b +04b885f006f73d99a0d14db935c649b5 +5a29a70d0cce273c9c7e763d73157f12 +d2139add9c63754cc9a46f8e87001b78 +7a6808af6ee2a7d55d4cfeeeacfb5613 +b1f41e4a0b970090882c46bfecccd175 +865c234fdf958ffd0a2d75df9d919c18 + + +0f205d1900bc5a85c83967b4ab2e88b4 + + +2932f3e33313df2fcb0c151e3423def3 + + +bf76bbe3bb9f4fa1f38c723472f0e17c +892f495fafcb992cd6e250d16bd2005f +16f07562ae67f4d23ec913141d96155a +8dfca1c2cd9749aedc6bd6a7a2028ca5 +528bf5586e6dbb2a5befe26b2e40a51b +468cb9134a7361314437e9805096279f +17741b03432725359322e3824eb0365a +c0d4092aeaa089311e571e1a8d1305d0 +b8df58fc0a4fbb24c541c5f33650ca12 +41ff7f20d77fcd1896c013d78f062d35 +2ed8327235a36f38ae84f04a134e2ed9 +88d4ee1abb183b534cff35c0d90c40f2 +c667376098bd057f286ad96a8be557b6 +5c92c9449da6c737a38452922b4bcaff +a1163525e054dc09dea22027e5611dc4 +dd0fe1770571a9dbd89ea429fcaace93 +4d4ee3f261ec6a4801269377ac754e9b +dcc398ce47d249796a9541d2daf5977b +969853a18bc1c5a8fc1b6da66f46667c +900db2034b2d7a6184c7be13c86f2ffc +dfa42d2c349eac38be7ebbf0b4d5ebf0 +cd82e20ad7bf0dbacd5bf56ade775044 +404c2aca474520364bb6d7d95503d5ab +44a199bd8b6c8bae49426dd80fe68aa5 +b2ca0cd3a8d500830daf81940aa2e217 +f2a4457dfc4020bd6f86b614e72d64ea +c5e753209040963031aa2ecb1967f844 +21fe0227445c576740c80171336e7140 +08889d90c128bc986e6f33daa81de111 +fb24fe30463b754cad50ca0c8fb2a61a +6b32e52c1d8ae19f221e82b6658ec6ed +590749d0bb4f01cbe9419fd575cf9bb5 +b3aa20154f2c168489a0f025845bcc8b +e508f520803b6a25c98ba5b50a7d2460 +25c804e7e9a20379225cb03cf159f37d +4def3bd05c46b7c544700cceff48f2b6 +001d8342078c130a854a5fc2ba3e5fe0 +800cf8ce3aa715c4832c37048f5f2ef2 +c780ee5145fa21c13a14c081142c368c +35ee66e976455f7945b047682f1f4734 +a6f41e9047f174358364f070a1c9e085 +7374905c6244ad66e8c96f5ce3b87019 +4b7860f21d571f2b011e9c8bc3bd934b +0316f35bcd972c39bec12bf39ce8b848 +0b9d4f88bd9f89b40fa1de3a70d7b9be +8338e554a27ff4cabf09b75f4a437571 +a279995f8747fb597f20adb229f458f0 +345004bd7d7b7b965c0ed874b11890cd +94872f902b930385cef1169767d5e627 +39a5d39d564daceb561f5fbd44f618e9 +9bc50b2be0ce0833aee8d4112c0dba90 +b1e11a91a505d57a8c67502b914114a9 +1f1438bf681d3639cd200349e199a321 +3bfbe8485673e6d5182ea4356bcbc69f +c1cf7cb1fcc86adf53b852c5c386d80c +51fa2383746497ffd868f2c41a9b9916 +82ecae8ae815f91e8ed31a153326d8ac +c13d065a12474a08b3c1967dd412d3bf +269de249b303ae7df6f86174fb84ebe5 +7b58466546979c617c630397758804bc +27fb09849811598bc2a9d1ac4d256388 +46a74789d877e3031e3681dd8a79c95f +0e73a8e6e29fb65e20302d7b14932373 +c53c492d3c9cd649e87097aaf3cbf1b1 + + +d24b9af5ca5c9d722db69d1af4e3db57 + + +d66d1e7b6a373eff09f71de6991e22ae +14c68008d94f6d3f61f6cca02cd8ede8 +cff68e4998b2a8c3981c8f9f09fdcb66 +0bd95e0651a2ac03255ce19543439bf9 +58738e91241853705cc89688d779ef67 +adcdcbb989ce471063d6f5f213298417 +f44e973ae2e5ff86237b9213617fb822 +af688b341e9fc7a2a4b0bdcdb3b0c40a +8a7ac96d733528b9117bb34ceabe2afd +b3ed6329af1133bc6f138980929b687c +de3db480653c80d66ac3617983c562d5 +5c3ef78288b759fbac600079943871d3 +4a2724f5b8fcdc7f0302aa9fd153da63 +e36abbb542a080efdc037ab5b5892b30 +a623c86e9add2870c0590afc5f949bbd +bd237395ea9a7a64f1d09260d5ec9fdb +ae0879a75ca966dc197b8402a2162ab5 +e2c4206b699b0a3d50cc11518fdd8b80 +661750ea7a3b438f1f1f9827f3aeb993 +4186064e46463e1ba447f4e87197db6e +295385b41cf155abeef31139bceb22af +86f70ad4a8940724e813be06c1813ef6 +25c1bd469f655f5bdc5b1c4e460adda3 +ac510a2014fe6e9033bd65e3ca7d5997 +09c77138ec31fa2c72384cc2ca27d9cf +1decef4f4c89fe4c950038cf39bbb76c +b2fdf0078f2ddef407d32a20f3c55cdc +1d5084fdd27662a5828dba33edeecaa6 +65d9564a4cac04972338da24811437c3 +24b661483ef46368bf5c3d10b7d22165 +9c880cf3060d4146f93941b2a1c4df9b +8863eda18d8d7d8086441d029e8e0cf8 +00e1d7fec8ca8316f2d85a5a4b33fc44 +d01ae13baeed029832b3718143e8f4a0 +3dd88d8c7a7aba125c3fd8fbdcd2ea73 +5fb5bebcac4f2685fd9f8849dcf9b812 +a736f34d542d40c887cb595ee83c5a1f +24341da6955553e788c3a2564584758e +2f3d776b19bc39e993ce41c859839286 +22657bd140ac2202e2bf629bae03fa5c +1177f3b2688e025a98c04ab77b0c0e1c +16d98685acb2d7bbbf8bd790722cfc8e +0bc16529a959eb0dde97ebf8fb17fd0b +4f2daf7c00acab18efd05da010c78361 +df22a0b9c83465670f9d1ebf7632229d +8ab1f8fadb4c9f8816d055e7658a5e6d +1d98cd5f2f25e0591c11e41e2afc9c23 +738fc1d9f4eb5c4ab9cbee2b95ab7ddb +0ab38b3075fb9d3c9515862de613aa16 +114bcc9d8d93b490e63fdf91e3acb551 +3cef8a6e019d9c765e0fdadc3de9e2e6 +fc4ca09947a8b6a942ce2c1c8161d117 +dd8f860c6ef110e9de82e37fa8afb184 +9c173f277ea1483d1280e8c155a61bee +5febfc5e97dc2aeb2557b4de112db24e +726973b7ca45c04bb222e1664e8ed817 +45026a8580338b72244a03ad96e26ad8 +058041c70c87b2173b351b0c7995688b +25642619bfad6452050065405f23ce57 +13e67c57c640c49533942da28ceca657 +ea15b2fbcaa5a42956607cd8021faab4 +99479c0e5007fa0a86496e2373b0cae7 +bdb1c8f55784f7d8f12d7092db1efe9c +0dce132c559ca76638e532472b6370de +a69ea93297fe0452c1426b611515fd7b + + +df3e567d6f16d040326c7a0ea29a4f41 + + +15fb5433cf915aa2be398666363c8ca7 + + +86e1b26fb22425ba2e5c88d450ebe4c2 + + +cb4357c41b35084a10ea91b6f0cb8873 +6c11a20d3f2aee3890d163c714db76f4 + + +a5b115effaf63469aacc14b2f367d3e6 + + +652b4c23d9d52bfbb97a5f772dc026f3 +1e30220cd1c4d69488b59242a05788c1 +fb5fc514e5132640de7feecf3f6cc7b3 +6a5c8cc05b333d062f330d2430493bab +f1fe5e39f45acb48c465866c5de3602d +da084fb806ccfab38f46e2c981a21a67 +e7118b21bf601e8cd63f97302d7ecdd4 +e4a3547bfda39ce77369ba0ac530cde9 +799271e4b2e7a15bbdb7c125b0ea9f5d +18a99293f81a734a2086c0aca26c47d9 +b2f6e0e312e6f4fd395ed5eaf5ef3d13 +a44de256251de559963b599511a5e0b6 +c13ae1d3a6da0bb2aa323e186dd1d386 +31b0fe94d3cbd166075e6cd8ad01330e +a4acafa29fa8877e29fd2089359efbac +73f30beba864e65933a6520d1dfac7b4 +a63c5a0d19a26ecf48648e9f258d9ba1 +95a0103c5fda9a5b38a8e5ce90de43f4 +6f628d6a5f2c1ec73d7b740d0dc15693 +1f61c0621f1b3c205552e2c7e5b71636 +7f6a06b4122d989a3649f3e91bd988a5 +f14c76da432414dcc70dfffe6617b217 +c547ff36adf3f10501629741f159e236 +d9e276fa43be5a8ad48c94a4f7089fcc +945573cd76cd8640a58536054efe5517 +e5931e3a09b21d75678e74b4ab9ea607 +c622148ceda49da4faf56ae49a65336d +e5d9746d761dac5450cdfa82fa59ad99 +c09ade70ef2e492c1c5220aad72a2bc6 +cfa19319b2fbe6f87683e5c743d0905a +846a1dd4a26752300cc4239b4c84b864 +53e6ea416c84879576b4881f9266067b +85cb52767e4db268c9ab7c4b703821fb +a296e114b598141152fec8be15f50e54 +cd3627c392a4241a15c6e8965a6b2eae +3cf27c83b3f3dbe7a4a6f8ab17570f1a +bfc88159098d140c910c1a0eeec04fa1 +5731622ee20f93f4b44c3770f8f71c05 +c3c1e5581c85375440d5009e6d54d049 +c39626c5a90ae521a6d553f950c5ac5d +6d8d9d876bbfb7d535a2ad37fa3c288b +2a8b760d0700c3abe671145d267cff38 +3e7fed8b0a65773cb17750532994b395 +daec3ec1f80e3ca8da943a8ff57eddcd +8dcee24049e4b61868645a49553171e4 +8998061b08a4497932e91f87a821e01c +bafe6e2b89c924169cb82ab47315e0e7 +e5a1edee079f2cca0f52f7a80476b8f3 +b062eb07fa84ad1e905ab499398ccf14 +ec2661871e8f1903ec84fbc469dc809d +10f34289c45d690c9b22b4f4ca69389b +0d7b25603ef778a20dc8fbb403d4e905 +de9e574c0b44c4719bb1f83578b815e6 +e672e525da9adefc7be55534c15a4d77 +7ec306afaca26ed3c3000ae5c5aa8b8f +8a99077724ed433d911e3287f33fe5d0 +e587ce3591e950f68827b7677d27b516 +26bbd172479da8b66150c1a86afdc0fd +e0b0924f8c81c13dbbf9aa3e6671268f +04353f0157697b48f3f3d673258081ac +e4e8236aca00672d547d1f3613e48d3c +487a96cefc1be133cd1a3a4979d1e182 +d2beeb43f28ab2fb956d236a053cfe49 +6b2b4d990bdcd974683755a444f0fb89 +ad4ea14b69345cc7e9091041ac77fca8 + + +e3f2dc130c8b1ae2713f49bed2ee9d11 + + +f295e37b60cca30b2e38c0b01189ca36 + + +ec0e0682c767499a01f763530606916f +83c4afa5a7847671031e28e86833add2 +68617e25f0ec7dd701dd59a5656d9434 + + +b2a5bc92369b85991380abc7ba8ed9ff +86ada72552105dc8605abaddda6359e6 +f518a701ab61f6e1faf7b64a38cdc111 +14afc6144d0b738020f86f26530f5aed +391730a825903621dedd1167f0089813 +dd21483e8e30fe859c606e175cf816e9 + + +441c1e7d8779e39d3ddd5a21ef184cdb +abf053577f529a4fdca7ae577e6cdb90 +64aa12fb017e3a9b0bfc5a49fd73f8fb + + +b5648c532a8c2d01b20f4fa70523613c +fda34032c64605a76f5eec353889b28a +9e9680de469660972b639a94f801b473 +e274f1f497f272001e290079cd057dd0 +3d7dc891dd108074b057aee494c9f16f +68e9d18cdd5f9a0c5535bc9d75f7e55f +9b96558d6967fee68825aa7f8bf30a6f +82373d35e673d674a37b202ecc836f75 +604860eda6d86d052407127da3555b0d +30f0d6af687195da02d62f2a1d7d4277 +6634d42a866e9d1865a813520c322557 +184914a2152e0deff0a864793c1c4772 +0e5d1aab952117e0b2bc3a68b6547a98 +ef8602fb45d26e9c585b6f83d014a467 +a0a207416e883b5590e61c0c69f95838 +e6b9dd5fd0911c0055118d0da4cf6bff +ca5480758aa1dbb0afdf65b4429857d8 +9671727fd23c033251676c862a1905b5 +90fd4bf888b0ac7f996ecc5d416ee6e2 +d8f8e228928d660038783a51593a7e10 +1c38d071cd56bc2c8a7c041bc523b96b +3dbe4c6f39b6aaa0400182e83b32e952 +0981ce1b80a31d780650cac53be31aec +1e7c9458e6d8747b4f113f4a115edd81 +13492d0e4e3327c50611de639cca4212 +648d23549f0c9ffdd907ba5288573ab9 +b3ea90b5ebc790f7c45b0e6eec843bc4 +c08e4efbd854113a3ea6e134b9a6fafe +8bfa9092cfe223046e08e52e73c0a961 +06fccb32b8a54154fe1550bbe266eba6 +be1123f843fa34b639adf5fc0ed6e207 +dd5892a8544b3e8b00ebe1ea35c0e3a1 +cfd65facfc85f50bce8561162bc9847c +962d6ba633f1681a012235ff79aa6953 +b53338983384427805961c97ae6594e0 +2867007a78f3f919f590d8791a8c3592 +4c5ad546597e328452f5fde9f63b1c74 +f5fcd399a62088eb1625b6d2124fabcf +87b8149044a984eae6fc351ddfd89cef +daf8bd522c595c9524dc81a0c1ae692f +8435905698e56cb4343a7aca9d56f8ea +34c172bc776dc6e2fd7a0400f90acf5f +ad657c22136c9403be51eb81180ac630 +3e3b3127dba8c3d4d23f15570dc9bca0 +f53576f970cd091b07516078ac9aa0cb +b032e9d995bff30f0e2c7c5300507b33 +cd6bbcc0ae36e31539559dc2661fce08 +2ece63d1f03462376dbfb520a38cc0bc +5088de94dbc97c7e41956211f81c796c +9d636e84bafcfd303708a5a946ba7f0b +7f7f0f4172d4ce2f5520b91020a06d4c +4edc60b7914df59a495749d51757ca34 +7062e01b179df61d63d268c66a9f46b2 +70536fe0b9146c54d6785650174528eb +879890853daded7283a92e712b16eec1 +63032b8081ce5a2b366dc9d6b6595deb +d7b9023040d400148647b1ab461f04d8 +82c4f23da497d5e455883095774b8e74 +22a8703a365355fe4150e8305abe8aa6 +f08f2e3366c04ba0104285dac3731337 +20816917ecd2e4dcb9775493400bfc17 +2cabf886429af06001b048dcdd2191fa +ba6ee7d2e2714cfc26ba032e53f418b0 +c2e8095b6a0a8afda92cd11d30eb6a8b +df7b2860d7e2dddf4c38ddd17cf88009 + + +38b2c0ea8a8c30d66d17bf0e524a8a1d + + +e186a374ae736b0a383642251246a03d +39c21946426cba4b60723422377e42a4 + + +8aa196e802d6f72bfdefa3b5e8809f16 +4063d77c780ff6b5b79ec48debf060ac +fe69c569852a83a358f823da141e53c8 +c777aa8285dc3b9d75301b7a17a6a23c + + +47c80f0d87725ea324804bfe3f63ebd4 +3ae9af24508fe9ffc8664852465d57e3 + + +6d58a503c85896bf06c411f3d95eccbf +4ce4b06d71ba3840a33a4dcb9735072f +e7848d2a0fe7eecfe333449d7b3c4f71 +3698319e7851b8854df81e47b6917dad +8fa3e78c68fb039161dc55bbb3f0f746 +bedeb3d6dc2b6517985393fe933f3f23 +7fe75636cb1cec491dbee64b3756cfda +0215a306552933b811bc7930ce19116c +4c22f876df5b8465dd209a5840a30bb7 +1addc62af2f559c5abd2ad53f5bff10b +d3cc8565b641fdfafcdcae9af57c8d59 +a86b0ad84cb3ce606036c81e5a242503 +42bf4f22044979c4f2a5da2227b4db95 +1f4fac1c26ce40f9f1e6139aa5ee1bb9 +688e479abbaaa0165afd0e3c9e22c298 +3af14c6c1dc916c1f1adedf692f7ae89 +f4a939c3c11fd0e67994c11f3f1634a9 +554ce7dad70ccf08345739bcdb79416f +37bb7c54512900c38f6ef1fc5c0f5ea3 +00560e1c0b81e49d69f6029799a6dd72 +72154b5948886cd1eeb03e270f87926f +4e79ca699e46300843fe180d5f295846 +3cdcddc70edb076a0e93f0df0094070e +897bcbbda4f5cabb498fac37c621d7e4 +18e15b3477d8965aa8cb41d553d6847e +79a28bff4f078b130bec0e27567d3185 +7bb5f909b31b4a14985abdbb84b80832 +faab6d83f12ab9cb40aa95160986e981 +e8e6b1d6c936cf4d7149500198a7dac3 +2011a9c889baf4243f192e02dd63aafb +a6d5abf2300c19feb8afc7ac17de9614 +611d0184bd3366554cb614c0378fd4bf +903de14ab89a0fa174f58ef73ac64235 +e90b617bcbc89e5d827fd687e1d7b353 +a351f05bda1c6a42dc480283d96ea60b +7fc052151fc84448599edcbf1f583e2e +3b481f8b7853c799adabdace62e15be3 +aae36c3dfac9b0f559326afc8c4bef61 +b1dfed485aa260d46c31c32af3cf16ad +d6af3c9d9b3d1bfcdb39aa457460b728 +42afecb8bd19da681aaab1da177cb2fc +176311151547c8c1fa7791e1f96d7bba +11ddd08d54fa8b02bb74540d832dfc99 +2ad3fa79c3095329ae66eed2711c54b1 +3d968921d0f53e26e9113ee6489a4211 +15aab5dd87e29c927b85328dea18d614 +1e4fa7fbc1072ba458b641f11d742a12 +6fc13bae80547277c7899ead77450acd +6cbc423fb38b55cf80483bae13f0daf3 +421afea8d2305fbdb5b21202d1d3daa4 +a5988e9c564c0a0d6580ee763de7a6ee +397b59991b940fdbc8e0bf3e76241e55 +d162715195dff0e91e06442ca54d517f +f5165766cc964ab024eccb8fd65f98a9 +7d22d4c6cc8ad8b5110eb2a4a178f3a8 +fc1d9bc8b43e2454db7260a063882308 +c27094395975d1d5fee8107e06d0e5ca +74e7461fd3c4b7edf35bcf567f864bc7 +81e725d20e4792d0c832934e0b4d1768 +cdd5842f24fb7eee1fde3405b5db54a3 +33589ae7a0009cb26a8515630ac73304 +c50d66b224e0149040bae1471d3a2ca1 +1a8a32edbc28dca8ea58f0dcb7bb3aec +2ac655d2f1be28fd2933cae2d40e2313 +552c968ad48444896dfdb713f9d1a950 + + +d4ebc7510d06937836f84961c55be335 + + +1f744b872301f7a1ce8e969262a87dd4 + + +f585fa2017c232c9700d71dbd2bb8be2 + + +492da0005fcf299ba996cc907a422986 + + +cb801c21cb362fee6567539612849b27 +80c26f6c43e856fe7168ca0dfa5eeeb1 + + +22925cbc2dff31926cd9465a2981f8f3 +09559453b8c02af20aac399b753968d6 + + +1b0cb4219e01fc2496d44fbac2e278c7 +e76d8bec66c15432a6b952304c074bb2 +91258c9b718d472e07d903906ee3b1f5 +277d433baac7350184bd1d27775eeb24 + + +f2999d6a0d2a72f23ba2a011b0846a51 +1b82e756cead981f5cdc488918e11fa1 + + +85fc3d042805f52560599736ce53229d +7e97d995c0bc1eeaa6227f89d5cfc8d1 +c06f1639ee703e071ef61bdbb9edcd47 +236a7b4215aca10bc6be201f98ff3c52 +8096ff02b1136d9b70f3122341aafb61 +0e2386bbef9aba32802ac8238a13bdf9 +8d6314b0b5e183d1e6a60e9abc4d845e +d07ce5609796ed3bc9bc7d8c2d72b9b4 +29f6507d7963489bd1684d9593be1e77 +0d7b688e37f7c9b66889b28c3036ed7a +69fc7b288867415dca33e4715a5adfe7 +2603b84d027eb3201c80708c55d98d13 +99b0c2fe3c7073747f8a3cae31dd75bd +bfcd460941562acd26e4b19c3a939412 +1aeee31eff564011fc6673c33e6a9f26 +1658cdddbddd82cccff688ee77ecaf26 +de115279927e56ef815339cb99f9292d +0a0b0631d374810a566f573a4c6ef37b +3f4a0b5d4e4d8822bfed5f719add6dea +f3cd22ad24a4b750c26b731c0967f8c3 +2eba45864ce36777660fc9c55e81f313 +6fcaaedaae5ca0bb2c33a0cb75195498 +ca894957777341db0a46ad65f0b17899 +874aa73f22f608126d7a7daa7daed272 +4bec359ec721b127e605b42ceff25de3 +14bc1051609c9908935ec63e13972ce0 +9f280a0ef12999a092b8fead18bbf2c8 +9f7a17952bfaa8b14217ac459e56b646 +11ac09b3175c0f8c4624f7df4b1b1610 +a1e884c44c8af17e0033bfbf52a3c265 +b1be257fc722e3e3596c0f317b63f15b +fc2ec595b049b11e847426aa304ddc6d +a688766970c6db6b1174b6323d38f9bb +916e03582ddfffe4ae5fe61ed431e980 +be3698bf6b260b81ad7240c97b4c9cd2 +2e6ce4c96a92a2ed648368466e9b5bad +de8fdcf97c9176b0e6e2c693715b3d36 +520fb861891fab9c9aeb827d4cd9ba91 +59e2ddf05ce1238f5728934ec71d9f39 +6ffc7e1ab00dd8f065533835571b9204 +8adb620acea122426191ffa879be2438 +26433836c9dbbd151abe4127257f295a +7b8cee0bd7e729f54636d0dc48461efc +453bd3f4f91a2f2f8dc61aeeb4b314ed +c68e25a630bab4d2c2fd75ddef45ed63 +00d4313b95251a7965c14eacfe769609 +657fef17266d26b9679388339e014046 +8c7a4bb7e9d17c712d10f4138da654a2 +ee5c87f15da9bac553f91dab15ebb04f +1e8e0e7ad08b71bbc48db286f3886736 +adb01d6c3aba25bdb17a9dc4d93d088b +4db19fbc3e739f179cf2a814140cb0ea +cdedcd32f0a754d4380d6357c10638ac +330876559f315db3896c19fdeb8db7f1 +1ff4b830345bc173512425d495499dfa +b3026695d2a8b011ce6d8361d3352ffe +e7f647e0f4c1ddfebc5d1b1b658e51ad +ca2bf6af4d525857ce2d6be3da3de793 +845216f4e3e20a728963213df76fbec6 +120a01765437f41df6541f8c4f9c825d +deb7252f24c6e276c8d13ce4c1fbc274 +e200ede1b9fff1f440393e77bf9e4e54 +5761622a2bc204edec20925d46c7e742 +51bab5f9665d36447329a8d7bf2f704e +4b89e81a200cc23ff2cd386504a907a9 + + +d6540fb9a5fd8f71cceb9d70d1c02725 +62aed7c6fc9afdcf4f48f6c28be286b1 + + +b61cb3c36c0363df2b0ebf91a8b814a0 + + +5ff2733687ed023674151563277f9606 + + +330586373bb6e563f84cb097a13608ba + + +a1d6a4f36840ae414110a5c38d8918da + + +7e342b5d0366633fcf187ceb12ae71bc + + +cf8960630fd8d5d8a0dbfe3cc1cee4e9 +45e670edcafe630482b368aae3c6c35a +5b4053803e467cbb0478b65635a4e5ea +54a2d2266bd12c7fc1e7734af9f1dc2f +b91fc1fcf228706e250e51d10220e10a +a58a10e05b789f241187b1006369699b +dd29581a73e753192f4dbf04f74bf738 + + +b604706f8290dc2c1ad866158096dbc2 +a47285e8056bd94994455c9568d9a06a +662f2bbce147ef131b715a7ed63c6e5e +4b8da5f77c31f0951abf9435c1a38dd2 +754f06e960fe37a104640aaf1abccf00 +c126b5531833a5c22877a89965351495 +f2c8ba56a466020fa2a741346e038a4f +00881f0b6ab571ca8597f5bc67cfc1f8 +6c84866f916ce8ae2a791fde01ffd762 +c126b5531833a5c22877a89965351495 +34a1d6c4f58e1a3317873decd61675fa +65602c9e887f68bbb45eafca24e55c03 + + +2a3b6994a34aa08e1498614ce0e10819 +e689320fd984d21795a04255fbb7dc72 +a58a10e05b789f241187b1006369699b +6a57578a3a7037d8534bf04867407f9a +bbbde17b0f3619486ef63a60f42632ca + + +727c747367056852713f2b48fe53c1ec +22a02121c600bc405c09922e67669dd1 +9e2903286b57a62c10ed5cba13a145da +f25537156afccc498651cca80653bc1e +c4474420362ccb81e28d4c5d396a974c +956143bb0094112c6bd7ada797769f38 +4af94d5bdb7445f5c1455525fa7a62a6 +2bf7122c99b995086352e4f5eac031b8 +9355ecb8ad755e35cf0d906c8a465c30 +8d29804923af78a0f08d313dbfdb0ca0 +69b71ce05c903e216985aa9fc96fdcf0 +1fd4473d532968de389a013d36f2a914 +84dacd07224a53e620f85d73fbf823e1 +3a6259971dddce3b5f86e1c1f601d2de +f07fd40e9f0077c6061735334e821a12 +e4107bf5f6c3285c0fc82216bb1ebab3 +1a44bb2817f115f6bf09b61e427874b2 +fed13cdc809292d38bada26c3910819a +447be9a5f4e25c354c3909903958455a +7b71d5f1df04ff8392feca405e30c6b7 +9da73a507611f6af7ebe245ee18ec2ab +86890967051f85f1036c09ee102383c7 +1a0e873aebac4c801ba0fed76aad5356 +ce1968612d19b12dcaa0f23d2c706b12 +0aed04b86a560ab648c192cb9394f5f5 +3725dfdb6e00fd0e4d228795cc0076d6 +556faee4f11b76b177670129f265f32e +c7c3c86b13013ddafa7d90ef7829ee29 +b0bdb73b954927ab13d03cec657b37db +549e960585234537e6edfb8efedee332 +5112d3d0e6b168205f1415c5560ddcee +ed6373c1cf9664f89677f1473bde78e0 +5b0f43fb465391007323fc5c51150bdd +9b2244878e75c71967bf01f2dd217966 +d3649532a1f1d2658612b9a2438d1f3c +99d015c5245fef946e83c7fd88babb6b +f46713c1c4436a3d990c5cd84ad30408 +3c0855eb04dbae353c6df0b3693fe665 +82c923a6d8eac43529db9454b6896da0 +b2ad24ba470caf1822a033068c2f5d04 +2955312fb19060fa52335738166dab24 +64922684ecbbd977ff4a62dc3defdc29 +70128a5a069c6b8bb3e28b0b78152367 +f2405f4b1ed3fa5cef58bc9b241e1c7e +d2fbebcb7ac9df6a712fad7542d93246 +43e63cc0ab2b1bc17b9a1fd8ca5b36b2 +91e57c2a6ca916abfb93ad816ddd282b +9888c7ab412bad56a50d6a546dd2e626 +c55a4c1fe097d828d7bd557bf7af3b25 +08385f3ce4a8944aa1add96eee4423ce +c51c27077b88205e6c2e9a48951134d1 +2c135f756f61df947e60011e91dadc17 +5cc925aa61a6685427d8ba500f60fe6b +c35abec32cac88c8f99563d57fe72e19 +de190041813ba9927ac49ae4fe5f453d +1778b1eb3ec6b1be10c911d90bfc94ea +95f8ae53a869fd085673a4784152f98b +874cd0d750097e4388bf080d4605a14d +4aff18a10cca1c7494bc0ae2d4543bed +43284e48689e1bfa47a7defc8ca917e8 +dca7b982f3b3a0b6b7114bc235183406 +dcc52b5fcec6dd9a750706a183d2077f +34be78b149a33a71840589c3161b5b32 +ded3536eb6bd8367ddd587208fdba17b +9c7f8976a8811574572cb539951c3e4d + + +6a4e6aba870e354e6d3ebfac7c01f0ff +351cb9766dc5162cd586485546608283 +2b3c7c04fd04dc7a09bb983fd580ff38 +68ae2d02f1e21c856b4cda0f13c8fd3a +632e4ba7dcd3de3168feb70553e922b7 +f76e2f239d6971bc47a058bc15305298 +d8e7d709b1d1fd9959705811453bcf90 +b3b0f9faec2fc85f3fbac8baa7d6a9a6 + + +c724101436b085bf318e695fd784d658 + + +e7da2db71fb15e252c37925c2445b363 + + +ae55a1eefe734127c79202bade1c9bf3 + + +b7150383ae7d33277b6edced137d386c + + +3fcb4612fa389fad0b849b042dbaea31 +7995bec1a02a24ab6e41d21460bcd169 +810c0081713130c8d25b1bc3509fbdeb +fcc020b590c8a0a4da3d3d757d630eea +719c7c6de3c772441eedf0663abdd7b4 +3dc1fe6ae24d64bd1036739dc56f39be +c2d23d0ec20e54c789b69f95b297de10 +4257c313773aaf9f703b7409ebefa893 +3cc9b54cb0b7df0b963e6e58ec1980d8 +df0f43fb589f6ce9e938c77297202dec +754d4d0d76b3805edc8d64c3a145d116 +b922a2e97ea572db7617252a5cb09016 +b52f589bf618a0ec290822065475236f +a798a3c77764bbc441792cb1dea86375 +d21c3990b2f101e0d9fba427358fed01 +5442cb7e20921a65b3f4024ea2fabfdb +b07a19b877060edad71d0c8133c9c563 +bac76324c1ff893480227d0ce85193d8 +4ecd2458c4065de9d5052f58d486237e +879e016db1327a5325c54a04a05047aa +a0541e0740c2520523ca6a8ec5f827c9 +8e4174f9bdbf487e91f73fa5cb07907c +36df037980205dfe059f1fd7308f6864 +2734646aaa561ad0ac8ac3dfd0868b3a +64ae30b6e476762eeb8995f0689190b7 +d1a2397cdb479777687296695e06c51f +2ba61c1133bcbdd5bf4d7de05064606e +9c2b43af488aa616084e49439c55da0f +dfd9488d1730bdef5e7e4651691030ec +d096e3503e71e0114b7ba5b821e1a2de +1659023218e51017e544ad4e537d9b18 +e0ae50e17fcd29b137569250bb3040b8 +994f4907bb14f448ac3a44568a751000 +bcf08a6544003c46643fbc2a6ebb3812 +4b892ef95ba0feca4d59f4469a4ce3b3 +a1d88eb55e84dad93be065cc40f8f43b +3a7ecb8e2c75c7fb6be8a15fc4fdb908 +ba90e42ef3b6b88f452c3a3d466fa2bd +9e9b473214c639b310e3e80ee37d1e8c +77798a72efca8c59d3d3103ffc1826aa +4c616984a8663592b3f72f8e917524a3 +1b773b463b76d2d74594e989b2209449 +d6b65c66164af0579ccdc3472fa91299 +26fb46a804553e04d411e0f603562d4c +280a87a8f05d376f5d4f56933214e292 +fcdf4de995727c4d106e5cfaf62c7384 +e5e56d3950a1f3f6d90e003bf0d7e068 +2819ae3efa4e379c614ef1d36278e295 +bd5e00c03c3549fb769e326633fe1960 +3eb009619122994be49a5f3716e95326 +e41a061acb148287e1f8c4fdc3a16571 +2eb10e54d58683e54999b0aa87dc3a85 +e97c0fbe9869a8f6a9d7f9866b0a60e2 +70340cd23778a77a387dd8798c2f9fed +ddb63fc46f59277036603cef21dc94c3 +58447b5980f81822e013c53a69d55d7a +9ca4d349ff39a9d000bdd45b4e754b98 +65c18a93c9c296130fc6ec1f039a2c1f +7381e1c8a64778c83b9f8feafa31524f +e27ac27a64c55cf2a628ee39c711c28c +fae881ec38165f31f2514ab8d0caa21b +cb24ca767a4f89f10142f9972bd9b6e7 +67bbb73728d892af28f3d8a26429395c +86b24af6f0386af9f1e1bb941d2003c7 +e1f548d95e7fb382a5b2ee9c9fa38b5c + + +640fe591e3695d8b47d0555cb7c44770 + + +4bf47715be8a8ebfcb74483d37bc8927 + + +88a813c2a45d0c8ce12eda52f36f26d3 + + +e39dba8d7b8dc4617bd3a92bbd643207 + + +70ab052ed51dfdad78f49615a6f69e60 + + +254df5a7ff156ec65a3997a119999809 + + +5da383d5cab8d9acaae132e642e39806 +ec381e415072fac0d6eebbfaf9d6e62e +c91e8e3ade1afcc630e27827d98879c4 +058274a5eeceb30f11a79ffabed1d96e +73f148f84d8e97c7db6657fc3f537f2d +3211b9b5fa8c83ba6cae6de02cbd503c +59e1c8f8a6212947de946d9fda42a390 +a46b031738dfd4a8c8b3a9eda141dd99 +2d6819315f6c713d88daebcb6e35d7ad +3c33182571d240666416d01fdc898b44 +6afd922cf25edfba298730f0e3009d10 +7ebe3f9dee233b617e2900493fca3da1 +3347f3116c68b1e588aa95385ef18b4c +053355dcf7473b91b68957d14591b448 +fabfb09387164d3bd931bcb1d873bcbc +1c14e4c0d88f9e322a9115f774cf5369 +1f2b53e20a6d5de24335cb6ef91554d0 +971704fe6ae22d9c55ba03719ac35221 +68a6512fa5235743cb2e1d17c7ce8b18 +0277ea9fbedf49ac49cf2d3bac63d541 +6f51a68280927c57c9b896922d178acd +e249d7912bf80bbbbf6c3606ddfa5205 +2f7a31c1060cd0e183470a37139a04b4 +db8aeeb94562d6f90b79fbc5d7ad706e +e72e2b1b569dada123db580105ba8263 +7058da97db5d6d700cbc61d2a21a4cce +244aac18163a60e054d68c36fe3a0214 +dc0f022b5c07243035832fde05abbbb8 +d5ee5e9062e1eb72d397896349364356 +1b7f9d8725c4259ee427c528a7a44c18 +848d3d393e18b413f825fe47d6831133 +f7b3a70d845cf15ff446140d86fbc523 +2937da2da3ebd1181e2028b65437380d +090c60145b221eeef1603724ba5a36cd +40047b3bf7923cf8b528c12d427e0d4e +89d3c886d0e496b835e5cb8e4b70bb27 +dd709bda9084bcc30fb2364c93ca3e0f +3abc2e5717f88868d39ea70b72863033 +47cfc1effb86cd33f04521d28821fd1a +8cd28f2d14a34235fa70221b362f7e5a +fa90ee2416693e502ef3468fcc7b8e83 +4fbf79d4a94cf95251db1c3676913466 +b91e59bc080e0b4a4cf7edfd8a693feb +8f54ac1037ac33b57f576db08f8d7ad3 +d999447518e66f1b4b41878e57cbaa86 +034455bb71928598956d437efacb49a0 +3d6240fdff8cb8a51d9c113e6fb43534 +ef9a0ff6de451900915f83b44ed9c733 +edce8a83541e168debca66b2199dca29 +c5847ebf22e80b5cc2d38fb14479be52 +13bbace6b20cd73781b01875fc533598 +c761da2c6cf06bcf61e144f235152ed8 +720433f1081eb4d6df77266a95302f60 +57ca3fc5af4f3f961d8e7f2c1eb790fa +552f72702015e9ca7cce60938a31be63 +e17b94977639c424f3ecb6f52bd15d67 +d2d3e83d08249aaa44af84c2988e7d5d +acad8fcfa817ad704c6c744d0b2122ba +cdc0746377a8b12d61be8812a6f7d044 +45ccff68595cddf51a4e7f39da5b107d +3a0ef81c1dd16d86a921a9ad552aa5a2 +338197f81e8de089151747cf4d088a3b + + +ce2c91ad6dfd86639dbd6fad1fbef509 +586d7b2d1045b9115a817507fe3b5b53 +272ead8eec497be617cc3d390c427477 +fd9e4859f8b774b936461669096cdf31 +de26be26ca4ef240bd153a8c1dd0cfdb +2cab0bd74fdd7b997aba318b7c90eed5 + + +e000d09cfb7fa17b91065bad4e642e1d + + +7e244ea49524cac297c2db935bc4c3f6 + + +005e92a64e62ee70165293969f7e8ad4 +10a79e01588ef824071560db0833603c + + +bc35a09be3c5f9a7107b2b011cda6e7a + + +7dccd26f16fd1ba6d82647d69fd7e829 +9fa62494bae4149b94cc915a54668d05 +04b5620bab2a6621242e6b85c28e70d6 +125659976e92f59646b96a2fdd0d3b1a +c44f1f2c607e519fd0a6cc63b54fc5d1 +eaec7ae1c8140a8bdd1eeba5da986e67 +81ba5aa271152c52adc4d764982ee4b8 +c8f0ec91653ae8fc3a38518e37913ebd +22f8a939a2db8688c01e1f7b89f02ec8 +d8f3fe396763c0a89ba5fae99200520b +ca0a707dcc754a2fa7bf605227ff0295 +707af5608d5b3e9a09c6574224914794 +1afbc4cfd5e597e995e7278fe3812d61 +429ae70fad42b952f7220f7186025eff +d1c600b4fa86d245f27f6818a17c6424 +50153673c580b797448b17ec9798a1ee +ccd381d3458fb877783dcb47c53ab08e +e45f716f7591e5575fea3180860563f8 +16849e53c607a199f35149e1478b5e03 +c5768fe0f893de17c8f00d3bf9f4db5c +d44b85bca880e33db65127aef31ddb39 +5257dc2bf2a5dd7a5458814123977586 +0f4799a4d2b537dab1a4d44629794997 +912024b336921503608fc4d50975f1d0 +4ca6b5dfed4c6ac285513a051edb338b +04abfacd63b51bd4c4a8ec2dd1de0b67 +c8711285309c46d1bc5be14e05c6ca65 +685224eba8e14dbb8c1398b050f461af +428d1e617fee4fe79b92966ffaa11f25 +8f6f74a2ba3a2401b58854bb90acae89 +62c2c4e3044de63b8aa11b2dfb44809a +f7ff8a37607cd52def859f873c3aeefa +15b63e1087678a477cb5b833fb150076 +eaae9bbcd84423d52427e1dd96156b58 +e35a5053002efed30027b668d3116a97 +775ce9f1464a0211651bf0f8a5bfa18c +b6dfc5cb64d2bab4af5f89b5812198a1 +56be4a409e9704646ea9f669dd494282 +11c4cc9af3ca2fcee8f4e4975c3e7833 +7b5b25a1ba0b52eff518e0349b5e35c2 +c2a02db9de9a83f9cb7cd3cec201cd47 +5075e143b281199f63bfdd5449e133e7 +862ae0b77e8e317ccd6d0ef3e0732c6c +d89c3500a22fa7e1c9240129f1d83ecb +768bc69f53d627b4e7b21d7f75f09a6e +983c46a1d76f8a56d22ce5618d24789a +a62af33f465e0aa663f820ca0188ebf6 +1dbe78ce97802d95f9193acf560c03be +dcc55d206882c2af68ad8235ac97e58e +2c4d13185c75c8202f65022c08963603 +b4637f410375f835ed3c90b1f72892de +206fb09e8f296ebd9f85be9cb9289f66 +a879ee599be9760dc40840a4a462ba8d +8557b50fe97da45ac8756f6a4d1bdf34 +d308aa05a2f05245f060c391dd6f93f6 +ac0a5489a29d733677ac7c89b2416864 +de5ccff459a14c59484a89205a1d959b +0969a2f1c9794642dc22682e361779dd +156cffe6d029da83a426aef7d3982fb5 +eeabb7881affe487a960606edd42116d +1b47bf9766d8cacf2c3c0b60ebe9b3fa +633f9363b12fd8f5574143515b642778 +082f5b7b4ba85be86d80f0b0f3a50400 +3ab6eedbe157562250a547ab1d140a0f +2f747bebb1bcef6255f8650a89376ace + + +88a94d80df79c5b40fddfc38c462b99a + + +692e20db6b797b084592808e936f779c + + +cd3335bc2d82cfe0d56caf236570106d +aa5ed27aaf82b840ba087ef3d2787e04 +ca19b42f1adb825d58d57e3b2a739d20 +c41a6f742d111e6b9e69c455515055ec +8428e9dd9d9677f41dcab782a7aea97b +7d0ab24e3794439ba29d4aa48f4a0c7f +bbd6bd0afcef117a4e47fcfc4a518b19 +8d6a079a12501c8fb4b1e5dd2473a6f6 +2d6e84919aa99d0451175fde78e3ebc6 +3ada9bf47f0078d360c99e18277641fe +01c41bfdc40bd10ba190526eba306fdd +becabad6a051cb361ecf4c01cf446f74 +2ac6d502533254a08759227452505efa +1551d9c1112af9eb9fdada91e9d51cef +0a633d7a75a70fd222bb0f00b97b43ab +0092c63651533044068aed3c5a72e66d +cccc9e28e824471fc6fa19b7d6b0e505 +cc85dd4f864541a37030e31d4f999bd2 +4bab956687ddef71e1bb8d10a5791eb6 +f06b456a67bf306fd870eab672b8598d +78b01d50c6acb898bd5c9467ef7eb697 +a34f278151995523a345ddc569c1ad9b +18dc3202e452555bb9e99d0973262752 +42b7be9cd7b2dcd67b0631441b6fa2a2 +618e08d1a1ee76a570c3794be96899e3 +0d134260d954269a57ad1c7cbef97e32 +cbc332cad54788eb88a5985a82fedf4a +72dce0732aaf164cc938bec5aab86836 +beb1aaab495a85df74d549a4fd16ab75 +e3207e4ccacbba12adf525e837133cc2 +f3816e17dfe77dfdea4dfea4db6281e5 +7e55b90d516a508d90386e4f1fa901f3 +341cafa16a4453f5ea90da70e640d574 +e1bf696f6e95ec90ceb0d4b5e306918c +5f9020e599b44474d5b8a59948282b72 +9f0dadce14495794753589351fb2f9fd +a9ca3f6a4820c4f075a6fa7810be0921 +63f7e3a84429869b296a272bebf80009 +fa5b39843bddb4610105cf399b460f24 +0944b6df9271cdf1450fcf3d1d364cdf +5cf61f2e90951fc0db70efb0c211786c +d4f1661b9ff3610b5d7f8b1a74472d4f +26042c05a9894e7e195e3fad7e254bc5 +f749d8a1cc8ff8024f9add4fffb98711 +490957bf6c84850b9a1e0a7ab2c3f896 +bc18664a64f5e95aa041a4c247c42ffa +80502d46ca2b54e3f82d6603b0115741 +c1c0d2935cbdb51bb9576399f1015c11 +1251916aa7235cc839f82e9d63c61531 +b276786905ecaabe7050400041331561 +d7da526de089ba90d116347fe52af9ae +1d2e2c6a2ff30107693920d227545b4f +1efadc4f92fd784e951d45177aeba8d5 +fba065c3f0f6050f9bffed86803450fb +de9cec2ee73d79fba3f170dd9a6fd633 +4d53d37ec785c8810afd47da28df62c0 +3d6b3f6d6a4b2ec03f17b6dc13bfbebe +42c7ad2381d10bb65963c236a41dae63 +eca0dba3c96aa8e96836860c7597833e +fd16cd57de3e72799f36a6fee796cc0a +9cc94696018e1e451a6165b5fadc4ee5 +c8590e1c0551c7efab6946a920559994 +1af5632c10940ed04e4f3feee4124e00 +a98a8f4704ac217a1e86dba30af14a35 +b2c01d47cb53b49dd8a398e93b9cd5d6 + + +04aaf1aaa0767de7c4312205606378d2 + + +72456b00bf57c2bdca437c5c48135647 + + +9a7af859f5b12c15b5b6285308e982b6 +e8b960692d1d119505b4761d397a41c8 +9816e29b3872a45e9d81a9c114170ecb +f6fee0b8e1c4ff3e19382aedb7ab9f52 +376de3ef0ac8ac61b2f32bc7acd8eeaa +71f5a10bc7f4f677fb999db2a9180471 +a84c2a499a214a13a21ca1e954b05a31 +99b23ce0612bc8bfbbdf6bc49740c968 +0512bb5b52801afae8c6c599112d5cd4 +9f892e93945e7b3e40c5afdb9984de8e +bf2fe4211777fa79cd85a091324178f1 +9805853ce7c759877250763042b684c1 +31ccfaa6f3df0053086adf5c72d5e427 +4ff9e703522f3ac084f35a9f84d77d7c +927759d3adf4c5d3238410f0fd4ffb5a +8c7f7eccf285b39347cbfb96eaa51bc2 +c0400c70dc30b5b5aff5ab169a898a5a +900f3a2f4411d10e7688a3679be3c965 +3d2ba455e78d218a5ab31e78a2ac4c36 +a028302ca9f81637b36d0cc948b54174 +3a203e28a9c285d02dc300ccc4029642 +0651d57b68b5230375b02be6d044d2dc +88080902673d4ecd4222070c110ebb54 +6d6ccec65e35b5f76684ee52526d74f2 +5ccf0ded2de23c2b69fd6948c1108d03 +33866d7a97b295879ca893dd3c09cd20 +357b614ab10f3bce1cd530eb5b1abc90 +eb768ad4efc097c7712ab2bae34e13b3 +dad6459bf4086efb7f7901cb6ee560af +772f8b59a36d04471136584a9f3d82c5 +929237c7af0850f0dd42950d45168163 +ab27509d1efc3064a91078f29aa72d4e +67707e8118d72b2f687596ff273bfcbb +7c22a31c9f2a318702128e6a2fc8a13d +61ac990e48b25f7cba5af4e9f037f62d +d3e1712e33762922e691efe371cbd285 +d584e0104f73cf19f42be51264124888 +f0895565cd76e7b4e51fc923944dbb37 +79565e95e823a6a94344f3f70dea2ae0 +4eb959d933a8f6a0f6030fbccbb54f69 +e913e87abbf59840d31a5f5303f1e205 +47f34331d7016dbc6c18f53093bbace6 +b4a1885a02afbdfd20cf3dbefa0c38c2 +33dbd41012f2d8d5503ad09923c5c8e2 +0428e41f9d091d86b76cdafe35e98b3d +6ca8b568fabba17efc290e6bd99b889c +721eac7a9ff861f192a1080b8fd2d222 +8afff99c215828f3778e96843f56c1d6 +7df81b0a58f0828898d2bf496a723bf5 +b7abb662fe04024ff7b7274e8ee2f01e +34da72116f6b107226ae5bf956d36deb +107293c4f95e043bbd27c59e02a2e036 +ba9fb3df6c19f55d827aa89c9d48e395 +848fe203e64b9d62d18debe2eda1f440 +86614f73c28fba5e34f0fed0c1342525 +a554adffa6aa31e9eac4f23fc5a3cd1c +5cc1c3f1ced768e66a7cc31cc7185d5c +90670a763e5207226393cba5dee0ab8c +a374dc97cfad5336182d563c842a206e +f0f5c1e617ec1bb569eabb01743d1ce0 +5eff55f41b488f6601002a5f65b7f6fe +cdf4af5545ebb5e23145f1e668ba6aa6 +ea073db87a9fdab0cfe160fa6014171e +ea803a95f0e9f1ecc71300443c50ebd4 +6c1fb8268ea1138e983be73428e83fba + + +5e9ebfc29b4989010e7cf0497e1ea3ff + + +245089c23067de21b6cd2036e94b0230 + + +74a27a4eb92496daff4c8b3e8102206e + + +aeaf00778709d1b32e3202a373db3d81 + + +d7c15118b921e6d79f7377bb74e8aa1a + + +5c4ba8c3c0f8c8d579a8144c6dc47049 + + +37ca40ad2de204bdc31b776570b78f46 + + +8c1e9253480167775b996483294ee36f + + +c36af72113ccee4cf0e556b877ff094c + + +17227e3510942eb943576846725ee696 +17227e3510942eb943576846725ee696 + + +c36af72113ccee4cf0e556b877ff094c + + +e9de9abb34883463846f9fef369a4a16 +acca9833590682114a331f23440fa109 +9ec5b89a76d8ba24ebf630d86105eb4b +1db70555e0a91b838ae01c873af08e62 +a27ac5eab7a5363a64e25fd9c7452428 +8deaa2d6e01a795ed85f97a7ee2a92f3 +7c7fddd05cf2c6f79377528e60e71e88 +119186c7bd4dc1d57d737a95cf0ab68f +1063e323499af708967c6e8599168eb9 +dda755be89653ed90c50a96f85032be2 +89d2c7af93c123a273884f9acd3ce56c +d999b9bc31ae3ed13a20bfaa7dded4c2 +7eea7c0ac1dc1293b5625966250f45ac +7e4ff09840594f15dbf6cc4a78e125cf +39dba480512d1eb5dbf81d3b2b469b4f +e5894f67831ec88753e18729cd50bba2 +f52f55f52546ac4edca9dec441664ab9 +e2b4dcf5b82c5078e531befebc007829 +1660db71f909709909c1369c275d4122 +76d0c647acb18b22e1c403fd5ce54763 +b869ab82ebe8edcb3a06ba62c47192a7 +a23374b65407a21aa6ab11dbf998995d +cba9920f5283ee00d9bcfe51935a7965 +0e7efa59ec71df19d77fbbcc8730d140 +376d75361ce846342d6cf627a001ca1e +76271e662b1e8e14b9d44ceec672fa94 +d06e9771dfc296e3ce61db3dc37a5349 +06ede1ceb3e8e098b85b4a2facd22e21 +7e382f51c426171c77ac65bdc203d389 +47058a994ac46273f00519eac6c8eaa1 +2f185cf5b017ac42a21054984a865be1 +6185de6d056be3cd3696e154da9c1be3 +1e3833519a57a93e419555ee9d90dbab +d2cda74f94de0f7be61c60b75eb41444 +7b441758b0369fd899ea318cc1bd988d +976f9ac65de0e961fe7d3cb8148dfa50 +dddab59c5a3c9c7008d3f007ebbcaad9 +5a962bdfb2c89b879a0a1767f4dd84b1 +e1810de740697162646e856fbd5027bd +b69e3f108096936bc60059f9b7ee8e49 +d47043a994d1c39399ee2f3789ecf25a +8ed5d68fc4e6f4c83956f73324a6d028 +b9754cc58d9a783d88f8495a4c98c6a4 +7b3898461e5063fcc5e3d719beaf706a +3081d95229b18a9beb92e6d0749f6952 +9b076e5dd55b43b6d1fdd40c99e9afa2 +10ff4bc7f1613f5d64d49db46dc8be42 +96b4587f1d0cb0415368702dd72d465e +0186a896aba9cba934300b139c5489f9 +9e41871e4bbfa3d46af20ea193f94dbf +0842b61a016ab9e5f16c45d17fc3c032 +97cdb58b5fd277b5bd4097b13016e804 +e5a6d20e62527b9d49563d28f9f62aa9 +4b3a8bbf6fe9b433d650832a6637acff +3a3ab16b3f5b7a1b73fad7a45c8c3cfb +b20a3f56b257d412ca4d78903ebb27f3 +6895797a3759985d0a0dc455bacfd61b +6f84f419dbb57eff8cbd55673b9fa05c +7f5a528531ceef6ce94f417206b8b90a +740f0a20ca582a63bb9b69fd67fbf445 +84d3cc32b75f5d45858272630d10cab0 +6432a684fa20021b8b26f94ab85b08c1 +9d047f4c4fa64ef60a8077076cbda6d3 +6fa466ae1b787448983b8c3cda946e4d +049d8ecb76f8945c16851577bb105647 + + +a013597cdab1f0d46a67fec6acf3cb81 +502ec066ce17658bc228175aa6d2bb51 + + +2970309425dbd62a04b427a38c74be95 + + +8a4d45166ebeef73e222270a8113d66f +fc667c4366fe133c30ab122fe2ee7f20 +b8650f06582ac88ece68948bac1bf734 + + +10478ac144e87538c4e4d794d2f440c8 + + +89b85d46dd17f5f9834192644138cc3e +9bc93c463af11160b7419bb9b9b8c04d +516927da047cdbeb264d2ceff1bc7302 +4ef63ab18e11e0a1776618dce42b0c68 +4d00f1ca9878eadcfd9464e911156b9d +b7dd4753a1f73eeccd3e0d0c62aa6c46 +a592c3240592cd0bf5459d0cb91f060d +172e05b5b4f37bc52fc55ec3ddf16c66 +72761ecefe18d122afe20aaaa16f29af +050a1b0a9290bcec41595cbe7626c6db +76726937ea2d3889c61d6ccc5a09799c +00e11fea38ef53d0e99868e5e5ca3346 +ae213dd5d98995ed7abee5aa12c9b37c +093451992f3c1ff768b1fbc0a3490a42 +0d321674b7d1e0aaced16cdbe69e4cf9 +411dba233b13bdb756c2b98314f5800c +e3404b9c51f7af0b604373712eb44561 +48c7402486c5a80774f5addb0f109ace +8d62607818f94d8a1637bbac1901602a +6806b9d5ce203fc4e6d38663a71ef27b +ae3609a24c28179373af4c58c6ffdf97 +154fc13ae002da4831a93d73a8dc7571 +6b7f082eb0413e1beb242ba6068530f1 +d1e5db489cca322903a695682ec464d7 +9885b4beb2e0e3e2ac4341a6d0cae010 +2bd5e9d1c8fb89c95faa6a97971420fd +682c930d5a0ef0d12aa0fda61875bc0f +99f536af5bdcf5d1c0ba759992e509d9 +2fa9f916bb83bba6b5ebd68be51d8df9 +7f5f888e6640de48b7b0efe59ee94976 +0442580293b0ae840b7bb56095d0eae7 +9826e5b2520054f478e031f1d8b06749 +812b7f68232db25ecadbe4283929a1c5 +c271dc0a582c32a4937c2e045380e931 +2bbc98751301bddc8b98e00dbb497ae3 +2bc69e3f4bc2a07381e17120087609a4 +94916b5d7126d3375c8eb0f7925072b1 +502f9ec9080b807dd076f238ac6066b0 +345c759bba2bada6514baae01c2267a3 +31c8d8ee369b1951c2ef80b67e6c0ec9 +9c40f2e3f06a503013a8f7b94ecf4c90 +2ca72172e0dee2aec9d5841bb3a2c6b2 +4686f3a2a0357dd5da87c3d4bc6df5ff +975fd7e0efc7724969154310df64e698 +8e80a351912e1d9c3e41335ae2b08768 +f379f3b87adc4f12cd701bb7acf0535e +856af24ec7a610a60d23888ab1d2f27c +5fe30721dfec5ace0d84b86415ea12c5 +7b29734a895fb4fffc1fd13f93980adb +e66626a3ce21b7cd66732baa13433b78 +f541e0145c3cc3779ad73392dedacf9b +23098ec985ada5f5128ccc3527e461a4 +9ce75f5d9bf3295f1f9823be227a8621 +e3eaad6ac1cd47ab7bca00b1aa996d2b +0bcefe1dc3173741c0608ba7ceda0ff0 +f6d252c6803dbb9b04b5b65b6f8d39fb +5451e69fa34c32bc892d66e8896aa782 +4c0d7c37cc0afd8585c62276f736ea6c +304125a8db08f6dbf8b04a8e48c6ec87 +96133c2f110639a2ca58ced7482141dc +23658b4c4f2ccd097c75082fd75487ae +9185b0f6fc929157e4e84a82c413d699 +10734b49e0f9d2803b256b883b9bf3fb +2122e1438e074327f6b573a239950fa0 +7969843889aa44cb8e63629c88e864e6 + + +0e5f05b82a9b77b0cb302e65ddd05635 + + +5b53952452eab634c20b3f6949f58807 + + +3cb8e7e34baaa92f9a177daf6bf66a5e + + +dab0bea2a45fcd730255f075a399cc0d +66eaffabe362d2cd1b092df702926a7b +63f5a644044dff35542aeb5824076942 +83b84e0d69d2a0bd430e4a2f3d0184cb +b220973d49b1188b4e95e1c658b06c3c +aa0c45c5a3e82980e67a3a26485c4068 +94615c2fcbad6519c2e0a3b8711e9aa8 +2e8350503151a18bc7e9c1b2204788d2 +672975b025e7cc96c5404ad861527d07 +5c5da4e28ed613e85a49edf4856a6822 +1a84925e4a30a0e0d343294cbbdbb529 +62733a2d6f590753ca7bc473984f7324 +e8fc75c03c47a4cb2afe36070b18f4a5 +c76493db176c6d5a8fd8c85ff636dccf +84ba6b7c343b1c651dae1586edb01e01 +2511c537c17dfc75369b8974967de984 +dd3828accc2e234856d11257b7dd7281 +cba6dd7f7647ea925b8a43b6c7378473 +601c51a57ac3fa90e6350829889756f1 +b1f200747f349b3ba3d4e74b3f5c6994 +b5c6bea87a3781a1cf651f6a364e2a2c +bd34497387c8504d2357fe09cb29a946 +6b031f2eafae110e2b40cbea47d6d959 +c400a03be480a9d031f65ac88f9288be +bf08ded8d78533545fc70f3905c65c2c +dc0233fdb0864c95e562db5baea836ae +779b563b2757b037e34488deaf4f291a +5b666ee35e4551ab235f34af949e10b2 +b288944edde6e32f83e09b1ac75b4233 +b1f1853c33c2f2ae36d3652ca4804a77 +2aba72d5a58f530493c35c917aa628f6 +e432acfb55c6ea09e30d42570424f007 +2260715525b098c08df436b117416e16 +27607be4c20fb2cf8f76f50f366a0ef6 +407ea0dbdbadc30a149f1fb68bbaa2d4 +e33fe89d85affffd2c6467c1a0c15676 +3e35e088bb450acf85163b28f1941eb2 +59eb0b09fe26d75439737eff0e339fda +0f98b55f7b8da09bf0f5974f9090a251 +2d9a64283afb545d8561ee5f4602be1a +89be065ce3f4c188dd10be066e0b91d3 +e996d10356971c7589054a5a3e23dad9 +6a474b90221ac3417d6606beac1c474b +f56f9e3a8fb4ec0df9a5373867950f32 +2116a5011c951b5910e64a2d3c6f929f +2691c88717b7a5520c96657130fa679e +87892c5ab3f53702a72389e4226ccc5a +0a88a57f28dcff30a5a90171b5fc9716 +7232c727b317be81b53ddc1faf00f320 +3f3d4121e2d5ee452aab3264439e5364 +c6df2b096e79cddece1eb44a5419f6f5 +b0e7787bf67f5d4ae4f61d658f652fc5 +4968fb0bc998718b58579bb0ff8ef8f9 +c409580eaccea712dc1135a51f192300 +30f78a15662e4907438a3f3da2032095 +d823eab3b1cbfcd5d6501497e7b4d9a7 +f67e47685d37b480ad0ae17b3c60e278 +71c4b90a4d0f31cc209fe31be16d31d5 +dd57091610a5cb9f3d433c0974f9ea21 +6bb702b49f457d4760febb5f68b660f4 +066d078712736fe0ca54cc6989158897 +564554bdd727dc2cc9ea1a1a27f9f45c +6beced9c2e60af599cc713454271843c +7a658dd4bc6d3c1bb78ce15b180b5243 +50671e176a12bfeefedc8b346482ae41 + + +7c24562a2e36b60a1b49e24cb395a902 + + +e9ac9384237d8d1cdaab68d31a22005d + + +86c02859bf76535e227b147df1d7f9f8 + + +8cc8278179fbb415e3f30b98c5e8b4fc +9b0c9e19562eb950621e2d8182595659 + + +5e99092b13d0e0a7672fdebb2e988b8c +2cb9e8108f97f63366b4146f9472e4ce + + +9e1c9fe94ff8f7b1726af502b6fd9101 +69c4ecd12d81dede6dfa123d268ad20f +9dba534e4cce2ebc3001361ca89c16a4 +0fadf9a8ea97fa78362c7b41c532a8d3 +4ce6e22e12c97b220b44c6b9fc5f2479 +7058815c72bcd527f38f2fd7897fa692 +9ce9358b2005623969aa614b56074c44 +6e316360fc9d8bbfbed43f8310e79182 +7ff09313a5f0f914b270251b49929453 +18f09b157524d2a313cbacf9eea0bab1 +2f56924e399e7a21c261f284916f7e60 +f0f2ca3d96fca432767eafc3dfa7305b +e54a2776b7537a0f67d35a8238ff72f0 +a296a27e6f06c12ec27352de5b0aa45f +798dc4862de11017fb774e09b19851f0 +ddec456d3cd40f7bd16c05d4808f2bf3 +4d3aa4d4c43ad2858566dad3ff94325b +0a18f254e78285e5a26a5e0027ccc036 +3a3d76dd23ab98ff9bfc97b9e37cd75c +d05e5903b19290570242a5e957ea3aa8 +77b6d75a4303d301cd4707b4380d6fcf +e41d5bc5675d8b2641cecd6011694668 +da236e3156d063227e8176559a7a5fbc +8aba98a5ff4570ce929b7f629264f33a +d41dc695ebbdc36169f5a57f0141f8c1 +0cb694690f5f16646014d0482e7683d1 +567c6d4d2a0345e3691e1317d45168fd +d00cf099ef638a1ae4b6cfc8f2020d7a +7b31864fef1065e47cb2799ebf49b744 +35b23f1000c82bc953dc9b5f15f1b061 +cfab365bc228ba94a18de47da3a45473 +8e1e8de34dbfcccaffabbc078d8bcd68 +2c1319dde3b7ad238ab6cb020a81f407 +a8b883b1d5ca4760a8002270f1c6fbfa +e1a908e793dd21b3bb30f092f3ffee23 +9072c79603ee2da1510f1b722e400a32 +d504430032da050b01b1e85c94a0874b +ea5a49b0f49319d2366ab37c5ff96bfc +30637ebf317fbb9afc94c93a7157794a +2f647ac1976e2866cce1312e74ab1ff2 +91ea847a2d6799362d42f6842ffd0b60 +acf11d5ee43e34d54947a24bcc02eaaa +e785da7095ecca60e6b9649984688e6e +7e46369bb88d6d8b2d55d16c583acd73 +51f6e34ec323eb9e003417adb0d74476 +24e509c0d01c8f652c65fab4ff572a18 +0b9139f6d4c46512978588b50b9f5b62 +559b3f2ab4a0e72153b845c9a35394a3 +7aca76670d18b3bf392f1ca09d5ef5cb +853a12de071c16b0e6d7463c1f8cb36d +0b9d3005af00fc7352521d190566cfa9 +160915df72fa239da18e104441bcd5a0 +afffce62c275ef3c7da563b1793cdb13 +d7f1ad9d25ad83db76ea27cc7e1623ee +3385b07f4c4412bc7077272a5f4d83cd +ffae72e363845f60271c6b074d0ed824 +9b71a868ae0c914f09fa0096b3c4515f +0046c0fee6bcacb1d339da94965d5481 +e62c15fd11e68b5efa68e42da4759197 +524273fc9581cdea1ae5903a9fe6d5eb +91b8d2f8495fda759c2546e1b29e8eaf +6c594ea60e41a589c3c3e9a249e7d867 +9b4a6d91b45aa851c6000c2761794b15 +7958c3c13c671f83619e8ec23d8432cd +c9d6808ec856e4e0ff15fb597340a067 + + +8c10865beddd7b64913db21f12059c64 +c468deb0acd01bc010634d988e684e09 + + +16e626c7996b2957e8b64c186de9ca0d + + +097b08708208ae1e5b0976fa576e21ba +b70e2b3d059d767893e8abd38648d785 +1537329ac08c21bc452e988e95f7b634 +5950b9e6e85d75c874ae0407cd1ac71d +a02f58f073844edb2e61f267257f5368 +0849eb9a2b28a2f6167c1dd33f480241 +50e62e2fbc605e2196d1a0d446900463 + + +ef0f206b527ff64cd44d20791dc7dada +7eda495a66d481a45fe354e591859bc2 +36ed2ed2060ed1dafe1c557ee86332a4 +a9a36f52f0294c0c81a33334e0d7e6a0 +69cdff16107d3aca2e48b6b1f9542e93 +e005ccaad2996a29de087e640a514449 +72b633cedb07eab057d7831a241546c6 +7a44b6dbb7459c2a40c93785aff44723 + + +468e7de9853cdb5570523d7e687e652a +284c50448c5b454c99587b74c1a3818c + + +a3cd90cd2b7bb909ee13a42041ce4893 +0502867e190b3236948d109e02a2732a + + +7b021f7b0093f5f5bc0222d17a391da5 +3536e5f1813e79e99d60ac152b758f29 +cef52f5c9ea95158c9288a038807d63a +5e2d7588d784973178c28860287eb756 +d193838abbf2439321c6b7cbc8a20e18 +25b1f2c3c7cf8c31f6e9045694cea8ce +a60f3f2c9b72e6a8b0a98733d9230785 +457a102391650783431db06dd69b3e26 +a56c3abfaf35aa9e194b0f90c66c819e +bc7c7d9647d26359534f1c6c5c553e8d +60879d6a0e051f089310fbc08c714bd8 +417757a90bd6b861b7e867abfee4d36e +662dca4734552a24c556c3dd65997f55 +bbc7dac898f2d9150881320d5cb831d0 +b82f5612164a6434f2dc79bfbd24cf5b + + +7208e52ce0a5f9c2d809dc08f5fc34cd +e22fb66f332dbd77ab3bbae0eceec1d5 +7f761836020b1a3da1846ebeaa8cadb9 +8988f4c78983609cb8715966f66f3982 +2fcf9c4e9315ef74d8ac8acbad712f8b +f5a54471eff0ba5a3ae4413dac555dd3 +117aaa05e6044dd393d9c3b781cce590 +3e4b7393748ac9d418b3e8d1fa1ed709 +3874242716897a2f720ddae33efeb3ff +f0880025694ed8d793355719c284b378 +ef1ea0ea7176bb66528d1f75ba419454 +84979903dccf511bf370510835e88b43 +e5871705c64601f450e48e17a3c97573 +44dce2769e4695722d904efbaa8af1e9 +60eb6c60d5307f0089e5924618a2fbdd +eda4e25a66473cfb39968d9774738e53 +86d165dbcee84f04d67ce982889c1e62 +ac56c8281862cc3a9d38f2e76651962b +ef1d7d9d4e23153d2bd0bff65f55f384 +f7b68824d78c6bf899539449869a8799 +67556d8f154b04b52cb4ba3f4d057fc7 +5ea568e43554ec1102b2c6117325bb23 +977d3ef3a316bfe396a1e3361b17b202 +9acb463e4bde04a0f17f1d483bf209eb + + +4254d3baa0f050715478546c8a984764 +29cf76d442e78896984717946977542b +b91921289a4962823752c793755cb0db +abec52f4168eff9fe26156c0c83b6426 +89310aeabff45d8d0e3db15e5a544f97 +8ea4846250a7a10fe781793b447bd277 +e6d14fc770a9196d2ac80b9e98fa797c +c282ff9b75524457d1162378a60a5a97 +a08ab2cb67aac27ed6dcd776c048163e +8d06e552954dfa9019f4025097e93a4f +989d31280c0befa91146e1d93f5d4a06 +4af44754cd8a9169ef110bc8819b26ba +b2e9cc6b83b3972dac3b12190bc4527d +c4a57e6c000e5ac94dd3d1f8157b3475 +d23bdaa2aff220798bdc37c80e0d0aaa +27fcaaf059a2640623e019aef81b5c66 +9bb50e250d516ceb772d613ec222a292 +f63a766693f795342782a2cb83495f36 +8bde67bf893edf48a7614839a4bbf74b +2a19b807e0edae3d92332e2c5907efd6 +d08fb2b1a185a1c31e7846758affb0ae +e250fb521b43a206d031acb2861b4dca +fd6d0fd255299d9ab256a2e571aa6bda +def61191ab83db3477794d077674cfc7 +2183e9eb46f48298a282345350b42a8a +4cf5221981c2637550b84b6a5ae8e0fa +0e170e254f338e246e49c03b9dd80c55 +135a64b167aed9c2ef3ccbc3026f4b73 +37bd5cd93e03be1990c87df15963cdf6 +d33e0a98be45f2e9472e49ee9dd6f0e1 +582ee00cda28fc0515827f70f9ba92b2 +36e12a977cc05cc827265e5ff03279e6 +a1414f9f8fcb238d28e70b44270a7a0a +85208c58f89620de2754fcc700c4a075 +8329dc000348b6694a0406078334afcf +7e9da0dd3f40ca8657eabff869c9c8d8 +960dee22771d0e93cc816a38ad009f2f +dca94f24bb85b0593f5a0933a0a3a7e0 +6d5e9c09b7b96beffa76410e7b045bfc +d7133d4ece13b3bfc56a1bbcbdc1d8a9 +ad575cc08912598f6f5e729bf877d838 +8ab6321edf9f8ea1238cc0560f052fc2 +64922d606f750c8600e7b9ecf07b7963 +ca2ccd3edfeaa2b32dfa7bb4077f0f36 +017b261abe8f6d2222d7f6c0fe12845c +587b5427eb5cb02d7112849ff94fef38 +7f7487e34636a5b2dd1659983fa44183 +1082f9fe5c2f6cbe5888d1d91badc664 +9b9244bd50d5b84971421633847fba54 +ceaedc7d087c746507535d1c003af166 +0644436d2ff4a3936688ab08df19fcea +c730dfefb17028709ecee2c815bdc154 +a1915b568a6b7519e0043b4770179620 +805b19dd0996ca2000f73a119d711cd4 +a48aec0b4d383a1f2a92086ceb47ec48 +073f005cb7f0ca1fa0b3477b2b353eba +3efaff7db482608044187093320b0757 +9858991322ee43e6a4ffd569553ebe80 +f6a1230bcf5d16ce03fa1b29a3df834d +ffe13a2313344e30f82877a3416a0716 +a04dfe23fe5e92ac0c8468b726b6e7c3 +32413e5ab84f9ad9c03ee1ae36a694df +a6b361049e2d2bfc442f019c0ebe0d3e +f60e1698f84fef6cceaf756526d35bc0 +31b036a3fe4b899112c6034ee419e9a7 + + +6bd070aff5e945045bde6a49cc92e512 +73791145fa71981a2f3a56fc5b22fbe4 + + +35c63682b9f0ab3638c5e7c987e1a892 +d5e952f44c649481aa8597d2fd0159b3 + + +c12c6510dad3ebfa64c8a30e959a2469 +72c593d16e998952cd8d798fee33c6f3 +2a44fbdb7360c60122bcf6dcef0387d8 +8692e6efddf882acbff144c38ea7dfdf +6e7a87edf112d7544015589f8291e752 +9c46d7cab43e22a14bad26d2d4806d80 +f4254356c2a8c9a383205ef2c4de22c4 +5a3be2d8fff8324d59aec3df7b0a0c83 +3e450c2a2c66328d9498e7001ad7197c +ebe6b6902a408fbf9cac6379a1477525 +6e9e2694b7318954aefba787732dda44 +e5a8f32e28fd5c27bf0fed33c8a8b9b5 +119dd0c2e94ad689de873ef39fd43e6e + + +cee2d3d516d9940ddbfd859d2dbbe55b +c78db4dde38bd36c9d6c8ff0cb6502e4 + + +f040b255ca13e693da34ab33c7d6b554 +ef9a6ccfe3b14041928ddc708665b226 +79f41c0765e9ec18562b20b0801d748b +384c3f17709ba0f809b023b6e7b10b84 +5f1847175ba18c41322cb9cb0581e0fb +1c7fc3f027768438a5e12572a3ca1233 +b806658954cb4d16ade8977af737f486 +c18cd01623c7fed23c80d53e2f5e7c78 +39c5a5f53ff0e6cebaec731706427bbb +d26e8f463195a7b86f86b7d550cfc114 +ebe6b6902a408fbf9cac6379a1477525 +e5a8f32e28fd5c27bf0fed33c8a8b9b5 +8aba3e2c8aad049e56a11eb5ee095941 +342bc03f6264c75d3f1d7f99e34295b9 + + +a714d87749fb1eddfd91141d931f483b +c3006f32bd19f09628292ae1b3df25f4 + + +3c9852ae1a4d25e9cbdadb68bb0e1f1a +3964ec1cd6fcbc20fbc2ed63d320caf6 +6572c4e13eaa937ff62163ee7faaf33f +2a44fbdb7360c60122bcf6dcef0387d8 +2b6a88b05b94c56fb478fe70dad68cdc +2b99a5e48d3c3957d03027d36a25e8bb +7ebb3ccb0f2a3defbe84b59a1c07fd45 +adcf31a940ace9fb4c104672cfd2d6f9 +2b8885da50e2324557185fb0890ce2b7 +527d96cb51eaa54fa74a90db078008c4 +5a3be2d8fff8324d59aec3df7b0a0c83 +3e450c2a2c66328d9498e7001ad7197c +0dea943064353cbced50464e82de12ae +afc0b83bada23f6dbec51c8e28029efd +50200576c149315cf45b3293e427a671 + + +65e2f06da6de8b5a9bdc7a9fc8b01458 +e9df9178a05deb95474788697500028c + + +4effee5b896fb71cb6d9106340118b7c +90e40fe8ce59e8284a89bc54e2076deb + + +48cda2a2a54a31f7a666547c862c12e7 +c65fadae5a0fc27f401f1a00e66f518f +12ace1a918403049a6d2fc152f53baec +7363cb7630d1d4b441183345fd15ae62 +8c366c11adee3cf2988614df4c96782b +a3112ba7e266938321394347e2a6e107 +38af291953d5b90b0aee30dd0d2126a4 +9a8269421303631316be4ab5e34870e1 +ac467ef8defc620b6b5eb80d2047bcb7 +bf30d89d69dddfbd8e5f805a199c407f +661505d2efc05b2347492e4949f564d5 +5ad12582e3ca901894737c3dd44a5eb2 +132a505684e7b7b91f50ea29c072112b +03e2b564224bfb58ff20904bda244043 +783f5b06082bf73e9d1eaf79d838162f +d2040c34ba1ffd8fa5b72ab37be11eca +fc517da02d6a64a68e5fea9a5de472f1 +0da66bdb013f9a9d12ce7219e642bc25 +5ee15843554004d12736f0404f8d443a +787a96924e9b114e75f48b540ff480a2 +13ad2158a4889c26a851f99b261e4c5c +2eba6780fc7d3663bc44808480c6bd8a +73c25b185fb78cc690675cd4a181ee0b +fbd3929a893b147ae0940d48d533e023 +bd2244ac282a5ada48b0d79cacc59426 + + +be7c3c0f4cf51faf0a543446b97d2c55 +f7e2467d8c6614a748e8629cb60614b0 +f2be13d5e99973c73059b469fd10cb04 +d16668a2d16b057f04eb2f93372bf631 +fd5f09f2fb6e899777af95c277ff8c60 +49e3f006018662f60f1db2aec0b2cca9 +9ebf1d0182dd9eaafad691698d6b5a04 +e45762e446e2f0cb2bef724fa339b4d6 +820f48fdead90505fa70b4e47b2c652a +8cef2db6f12ac34456d346f4f0df3bcc +2341f2c853fbbb21188c6b2c2f7064b8 +fc4180203086f4db5723547477eb472f +43ea1dd926d28fb13254881c45cd313f +857cc080b63fbdb946570312693498f5 +a67be66f984c8e31cfad2c93fb5d0a1d +c8dda8025928ac2a82206adb6aea2fd6 +feb67f9cef255056d3c1efa088faf1f3 +817762ea9da214f1f4584401ccd51374 +2ca61b76e22053571dd8611e5aac4900 +3c01f20e2abba61bf212d959f0b70143 +953a8f4b78d06742b24778ad0fafd7fc +c87720a8b6da87848cf717971cf8e28d +bc8bf1b085afb48f0a833f55bc7a092b +0fe870dbba4c1e71c7bc3bd764ac6648 +9c63e7fcef29b28590f35af932505ab1 +0a363eb48ab32888d2ccded705697e3b +b8285c08b99e9db14a03e1fec65fd080 +88d9eb0ff69518f9acd61ada0912104e +30bf39efa0692914e6ddb6443425a173 +1f367bfbbc77e33c28beb1b3f1a5f88a +0a2438f2726be075c1c1519f918f3215 +65d6c6f25dc89018dc74262179cd56ad +08a9454e4631ec0d88335265d8dfa2ac +b52db318cfca6f9e1eb261af3e650ef4 +ce82206856d06c84b34b4750cf97fdf9 +244c2a76da3dd075f12892010b51429d +81534c478c919097a58b0154664c1ee2 +cbcec86b5b111de63a9408378ceabf1f +79b1f2c9d5d8d3ffdfa3a1b3ca3eaa85 +cc519c456cb22964a334a6b41ad86e0b +907f37e8b7df4713213a505f28d6467d +572748bcdafddcef34ad0be34ef144f9 +785563ea1eb9f66d8be27cc41ee95f6e +d01a7384c6e8436fb43e0bcb2df770bf +32663e0333fcfb98bbcd3c2073f8aa5d +82ba001c7bcea7af62c33d716b0c9bfa +1cc5116a76477d8f0f5de2efae29cc3c +6157b46b1a107982913ab0320c36b7a4 +d0788051f22804e9f4f323d2c6a2a0f4 +7b9776076d5fceef4993b55c9383dedd +b9d0598b4e1c295dc5466f6e55b59579 +1a39c6f2fbad7f8ec87a16b41f10e4f9 +4f26ce66c3f271d8055c7416b3f4ec82 +4c8498c7c7c582df2fe30520e64d8656 +ae9696e232037d480c25f242f0dad26e +8ab6c24f02ec882d1a900b9151ce32ad +4e0326a0563bd2fc38a1b14e47fc7ded + + +cd7073388fcbd89d17adc9e9b6489c40 +6eb77adc1ed55d94c3c598d424843dd1 +ff683986021d3aea2c2e0824d3912882 + + +a2058d7d2a0e947e75f659203eedbc6f + + +9d53983237bffff6a75dbdb2e883082e +3c66dfba890ce9f8819b909bbaf6bec2 +6e3293266f645e19a91e415f8418aa49 +2d3c4d442a16d6402ba14307eca0cdb8 + + +0266cfef4017307566e781d815ca07f4 +bcc3797b5ee26595de904538fe84e289 +26567c0e378766f38baf34bbc73cf0dd +cbda6a0e1afde69875c104f6e809f1b1 +08a3028fda91d443f4d5e93307c96fcd + + +91355952bf808fedc051c1a96decc2ef +9bb2d1bce5ca6c1dab92e70aa744344f + + +f0b2d2ec92fbee68080605d968cf45fc +fa9079fe13a4db2dd6140d5d7112375f +6309fb06dc9f3d55d762718d30fa5f48 +969a6640722a1ab4b936c07c99a2e6c3 +4f332fdf2de4e25eb3f5611bf7b6c354 + + +739b03158aa5894431ecad1c8fa1c82f +da93d8095a72b3b2acbb64290dfdc716 + + +a3f6bf488479d822864c6346c895c623 +9c9723b05901c04d7bf4d62630c4dc85 + + +ab27137e3f7161c011a7b8bb89782c73 +e87e86990aa254a676d19240d7707204 +ca51657e035c8ec7101a2ba3e4fb027c +db163b6d98c20097ec791f4d7dd938fd +d88c26dca0ca8c159befb1a4f91a817c +33873ca90e5739a504ea50ed6c675eb9 +9f6dd30bc97b892fbd971271d1a82ce7 +47d63ecea460265f78ab03b88d2b0b10 +5c5791930e0644f718c68296a62251cd +fe1c7cbad0cbc0e2d90a0291658dbbcb + + +f505cb61cdfe745c5e4d7c74471e267e +955a446a7362ce4ee8d73acee3ef9790 + + +efbd0fc3617ddb7d7f31ce74f2e2162e +c01d40afca257245eb8374dece73e0c0 + + +4c4e6b894efc6381846a0764f1e70f77 +7ec9405a31291a374be5a10b11b4d146 + + +dd3692f9ad17ca6a2a49b6ad446a1eb7 + + +2165b99c89c8431e7165530ccb5f89fb +05992d3434d3589b38a3a5431842d38f + + +ebd0cfcbbb8e8ececa8f05617a98b324 +a3e000456648ad121c8aadf7d918a4e7 + + +bfd10864f928c910add9a134c48c003f + + +75e009a1fe815df846b1279590cb207f +f5e90c30ee80102ae8d460878f8aa080 +2d22c61e44fc9adb7315b121f8496708 +ed19ac112bb57caba9d0d43886216071 + + +11fe256b13a09546f7280198d8e98239 +0927262e8bbd59ec33eda07237e6f19a + + +f8bc7ca757d08b874579797ef5925bcd + + +599a8439ed6125670db4a61b4f93b406 +cdfa64990c808af7009d75478134f966 +b955200005bc73bec30a42c1d1df16d9 +eac70f4024955fbba9bd6a6e94cae7db +8bc18a7b64cde9d8fd204e30a8ad7172 + + +c3616907aa8a1b91b1ffcc2cebf3705e + + +3888e9f93e218814c97a146069d104f1 +7a4b4c6ebdb549fcbe47408f9457493e + + +69f1f3e08eaa1371f74e265511deeaa4 + + +ead9e5f733592ae8f9b227507de37ee6 +ed882314c841932770eab4413337b4b0 + + +d529d0aa82ed3aa96944387904ce88d3 +04a3ab30b80f9112937f2d586a622c55 +11b9e8e10d8acb2cd1addb502efc7f89 +e8c268d38f2cfa22121c876022676cb4 + + +8300eb5446df027b01ddd21e03c361b4 + + +0cdd968bdb2f2852ec71e0264b3292cc +e009322a00011359f76cf7ae59b4d33d +18b3e43abad26bdac6f4cea944777b62 +6c46b98e0c60e6dc2ef14f9d4a6607b8 +46878a9b3ede269c4e234550c9c89cd0 +02b42894653cfd82e52aac669ad078ed +262d69b7ca267be1994fca2aba46be32 +dc335e786863262f594737e26198009c +feda280e7bffb057ca4c87491aab6943 +c94a07253c14c98fe69dffafb59228a5 +9ab0e28d85d8ab5eb954fc28f6ac1e80 +9c2613b4de53f939bc770983976f66cd +9f41e1454905fd7416f89aa4380a65e1 +5e3c0e0c48f48c23c45aef7b72c739c0 +30d8e72bfdae694b1938658e1b087df0 +a3ffb8abd978b0464f7b5b508fcfdef0 + + +9dd0da9a4d871790529883dc56679b75 +db5cf23edb637b47a757468a06e6a717 + + +d678f496270f4b144ca5f60807a09cfb +ee9e3fee14270b7b27fcaa0e2cf2e042 +8c62e0877101b378a2fcb4e818cacf35 +e5b3968f64661f1893cf740191e959c5 +5081f3ba73ec28380b8e0e2ac7e94d1a +3af2127003919c5777dd0a36074817a2 +5744f9f3abeda8979635f87a1c892949 +bd7bb74aae07122ee6288f5f5ece6134 +d70d9eb28f1fe2f749adf494a50faa66 +5b9dd9d9eef220379a2de503d1ca6418 +59e5c87e9d8a26adc90e35532fd36d58 +c52fb7a817e7519fa2779d73040b1243 +0f9612a2b219856f8fb9fb980703983e +4c5647ac00f62f00d9584c17ab7c3504 +8aa24366a73e0e02cf427f7631005447 +c4cfe1c0db251f00e4a074d1c3556d27 +21c94faa16f9fdc7bbccd9486d21428c +1331764178f082e53bd0938583ba9c9d +0f2da7e8eb75ec9c688677631f81c8fb +35da51dbfed52e2f12ba3a0a832cd1dc +a4407ed736d6d821d839ee517b3afc21 +aec4b7a509e24fc101d78bcee93aa3b3 +20b789a8c2053e44309d5b83f9d2ff1d +19c611ee5a7f93785a4507cd723e03eb +581242fd17550f2bbb546b12f1829c55 +0ffba049a349094a1c160bc0beca3649 +63098ee9b67be59c25279b7ad5613637 +0b0ef7ff9ff85dfd27cab71f4731cc3b +b2c067e9a9585e997bd726dcf567c009 +f1092e3ac0dc38e9008a43981ff31799 +af877a7946403c96546bf83e9b9916d1 +db13d00b66e6af44559f19aadb24d4e5 +a73c5af628597d1fc68576de7ff5b58d +0c66c85cfffbbf9b5bdf3ddb943626b4 + + +b0cfd2a97c10400d18ae40f3b97c2fa0 +bd968116e9ade41f7ffde91bb8f6063a + + +a8c67f65e8618cc76fa3e94fe2a266f5 +dab22708cace926268ce9e71eacd43b4 + + +4cbfd7c2fa4dbc351c5bd7ad9429ffd0 + + +1b5d2294dc2eacfaa647413ebfde352e +70c41dfc17c87cbad54cde7e24433348 + + +b122a4394acc1a0a683cb787ad67a75f + + +3dcde5f0c575c078fac213717ad57cbc + + +d5be44e5e4de9222192bb2757b79c793 + + +8c086d220022ed8a1af377485f653ef7 + + +2405ad70193cfca2d44064ec2227fb2d +9deb8b8b4db1cf94cb88bfe20d998071 + + +53d9502fe340dfd1a37d536992d24c28 +e6179e6b20a5e08f351128a80b13568f + + +e7db69e4cae5a975d12a9922bd62855c +cc50cef418d070dc204157ea11f44ee8 +fee93c289a49bd1a98399b9bdadf4627 +0fc278d1ef776f8c1edbc7ab272fd850 +4dded8247005cc26a611a713fdd31335 +04a1cb8a2794a605461f8211fe46738c +b8b601fbe718b934ec74e2e910c28afa +49816c1abbb0646aa7fadaea57cc2d3e +b2c9c2e53dbe4590899b644e74e21cec +b12a9855f2b25f5a770753ddf9546b4d +04bf5d1e88e09bb87b8d51a7411e5dab +0953547609fedb241a4f6e86d47cc57c +aa2e592ba6fa4024a2e5adb63e4d2f6f + + +4404135b901f042ef20061bc675ebad6 +3206540bba1bf1310c08d32ca5bb42df +2390d98f9f4d1a5dba76652050b17323 + + +9be5f327f16bcad317c8ad0ae92635d8 +574c1fdbe98e07b336aeee94514cba7f +a8c664b8219ffde978db3d8308713975 +72ead25432b5a84031b8333aa5fbf259 +64f2d23d70cb2b2810031880f554b13c +2998e23d43af7c7857149b0e725ccad6 +9d29134dd5e1c2192916ef9104dd877e +d48475e6c742940f44e62622e16865b9 +94b34ff5224ba38210d67623bb1a1504 +8f88d990024975797f96ce7648dacd2f +6c56b94fd0540844a7118cdff565b0ae + + +051441eb8008be7093a760ee03f777ab +f1e6c13d39826544090e00e128207edb + + +0b6ecf17e30037994d3ffee51b525914 +38886cd44c85297638cb669771be9efe +8a4740b64e36fae06dd6317922c94629 +3a316818411b5a80ef878dc5c8483950 + + +f4d6dda9a7e9a13fae9a0b5666a1af85 +26adcdd9610a48fcda8eddfd22fab072 +27f0f0c023d8775a7d970a0550caa3ef +6bb88a8a3d69511d1bf9e7af12ab5f47 + + +443543014f50021a6aab6e3dc45ed587 +a8231d248b1a221019ad16fdd605a9fd +0f6007361d5e4c8f34a2e83d402567b1 +b49ce165ab6bb7d90fd020bb3958ff1f +8ee3baf3211d960fc39e28c4e2a793c8 +191b3c2e856e750c06c0ba7987f902fb +eb85dc872664c0769e9fab1b7540b4d5 +cc2cb448f60c5ecf61f6879aec325801 +d4836ebb5fa4e49eb36ba797c9f117e2 +e0a7f23376f50de631db93814aff2e35 +7ad3c70ef87d3657f918d3ee3649f31f +b2664e1ae97756c12114cb3371848ba2 +c940b153fb6c5b3498efa181881b5b6c +fcc615d2a469180dd6a29ee6c04e866f +5a3660e46c91205c9203901c6b47cf8e +2a315fa2593161154c319788f0ef2127 +544195d15ad41278307f99c79129ed72 +f163ef4cda9bb39f8abfcfcf2b683e0d +c22fdc8941f2956e0930b20105870468 +96c6b586a6afb6d72dc8b93b30f844d5 +768d12956504372d4dcffea0f0bc2865 +39b329017c9d46eeb7f89f11e8540c96 +a01d7dccbd0a43d02a87035b60b5ca8c +8745faaac931fd3990eaad40b663a00d +82f254a1bc551aee1583bd6461b62cfe +3daad3713df02c15beebd09ceecacacd +0583253d3e49f14e3b6306fa788a6f66 +d0a111306e668d146a52e2299597888e +a722bf1cb509c0218c9b0d41386fdbbe +c458a95a74915bb3e01102060bf3d27c +66a08a1e2a2405c7ad5affeca0f81b2f +4674617014723f062743145bd2952df7 + + +cacdbe68a428ae36151a3d1152b2b77b +1aa821a18b07bc7cba92552a372b8f9d +42f2f6e2122319a302b2769011897b2a +205fd4b7bc978688de8420087c161bcb + + +0d24de61581243b069fb508efbc78a67 +561027d7adbd2358225866cba60568d2 +edd56d70cac390ef63feeef7e9d71b3f + + +75837274a0d67e19ee975aaef9e283ee +8f83bbc144d70505672f82679546c72d + + +5c546b7f37191a754b6743a640c6a0cd +17bfd10e3232de9145f5b74a6ef6afac +bd2d14a110664154fc509e3d3f9421dd + + +b162a10416c2cba0be1ba5d979e19145 + + +f8228e3250f191a1f69dfca422396b3b + + +372d1bc3cc32141d16e6828bfcb7f15c +a234de35961af948a38652010a26c9d5 +8a4d8793abe8403cc6f5ab4af734250d + + +26c15cb43424cb0a5f4374b2f23205ba + + +f1d09aba4db36c2f1016eb065fcda1d3 +1c6f773292c37fbd5665c68439399aa4 +daa89e4bf8a6d7258ac1bcaa889c518f +2fb90091fdcd91c7033e2b9d43cd89b0 +eb2c70a5c76c563e7e350275c8ea8b31 +a6af0861d20de8d67561f9c09aee738e +3f13f4441c56f049f641638ed8523035 +b7f7a8a0717691a5fadb72ed9b953930 +4d611ad3939347626d994450645914d6 +5e8879bea2ca8523121328fee835fb98 +2aab5b22f214a5fa75ff9d57f1dcf4fd +9687706ae4cad55d5caf9cf7a193968c + + +a3d8f09c515e695e7ea3d3ff6fecdc3e + + +9a095583d4968210c428aa671f7fd05c + + +af897df7208934f59a4f5746db0f3e7c +6e58f3763d79400efb63ce5c692dfdb4 +e90fcba79e73f0813da74b92517043d8 +bb214b2b022f8a410aa7bce1e92724fd +dde30bfe8bfcbe0ee166386b64256dc5 +ae2ab2799848a18dcceadd7514065059 + + +0f47c9d67789b573d2f22181f55c3636 +87b259cdf18e697f87a8d65092a7a049 +5abc90c303abc0281a323c53d1e44c2b +53a1ad86cb3f04d69b9dcb275a3db684 +e9042b477814247c6860233246c57163 +d94304e12bf6cbd4f8f000c4fc563766 +ff0d3b2b34e3e09b44827b46cef20d43 +e6bf12ee8555d9fdc3d0f2c42940436b + + +cdf35ff41736804343d6a5b1ac20c69f + + +cfe68492dea5ba16eaa85ff232bafdb6 + + +7ecb0c1313a804acf7cca3bfc2af5371 + + +58adbd597318114bf70164c0915d6836 +7f90ecb330695a1f3d6e3b7212bfd804 + + +5f8489eed8d4b6b7b13da0bbda876dac + + +4a1790fb8c8aacf08aa645cde5f07d0f + + +d138cba0fea34603f4196dc5153d8e26 +96b453f1c7b3bf0485319a462084db96 +7615dbe480f829b7a967a0562c8e7221 +63003d078e0b8c6321f303661321bc33 +755728ff7720434f400c85c4d7e9c0b5 +ab2a6b84195ac4739dd22f429a36c13b +1b2e22f2a95597db45c8af5af3852506 + + +53f42b65c3712a2ca5f7afc148c110b7 +ba3387a36f0bc8fd51e880c434d426b9 + + +47144408dbbf4a7eba63f1761a499508 + + +0cb495cc714a0583c0a45a65079cb2b7 + + +a8408f6208da9f44b381e808b83c1bb9 + + +c871f031ea048c72acf364943d927ca6 + + +2d31c00eb7f8d4a4fd960971e4809d31 + + +8c6212c872e88f2009fb441f68a1ae74 + + +edd95eb12e0cf72e391e897c595ee289 + + +c532a9793127f95ef92106e37194499c +08b7348a9439950035cc7511a0fcddf6 +bd8a3d70f7c061e94386466b0e52d9ef + + +4cd066bfbbf816d406d4343970f029b4 + + +eb649938f2a91662ca060d49414ce4cb +0497fc1a8fa4467c01aaaffc4eb7ae61 + + +b66080d9f6ee6863cdb2a90e90d0dff4 +932bdce69cd84691658ee4ebde954d1b +0b7c9cb30c4f266489e94e39de7bc8eb +7df53375d2ba071872f4f0d78eb08b50 +b0e3e59ac4a59d120775fd038d8bc693 + + +829aef425771dbe207a07c8c056f41fe + + +119ddf7becb7ec0533a2d1af9144f4f9 +dfb33b91b611417dd4aa229ebff9e7d9 +3f1fc62470db30f980446bc250cc2b19 +5ca78dbb9603e64cc7630f1e45aa7eeb +060e704e080033d19da3d279e0080913 +dce41ebd1e3eaddd92aa77cb18ae23c3 + + +7d4bf23a5c30fa32febd05464db47ca4 +fd45c67989eed6b7d3881ac7d660ef68 +99d181ffb366ca1d65449ab8d7f73233 +bcbd68efc7bbe8f64d1dcea62b0ef39e +87c0ddff94acf4073911f561e66e9c56 +7e1c640c2f39ba23ab72652ba6bb0825 + + +7ea3145a0dfe1d9da222884bdc89a606 +b95ea04521788a9c3c5f311ba98db929 + + +457ba7f711105eba233443a3f1c6fffe +da67e2754b466b467f9b97d7dce1b367 +3d57d24d680dec4818f4357f2cba6268 +27701a1de23da787b0d3491b886f6966 + + +bfcfd11916648c543cf40ff4f531f859 +c9c051d0e3d9d09c70e433bf63c56e68 +861a9e8b55723564a5fe508b357027d1 +1c41c7cb2d913823e65ea25b9b067a34 +44ef4a89c95664c98d629e062e13537d +9534f18545bb75eab35be1909d01716e +42779e7cbca0ce50a46c94d453f22101 +1f2af9d27a32d3bfadb9af4df5bedbdc +8b6d02597c98dbe4998550104ae90e51 +d661e302e5a904c9d5b2975feab00886 +5e2d553b5b5f009b217099ddff7f7143 +95c4077ef635ca070d9b7e147b4a97f1 +3022ef929652913067110629d8be51f0 + + +dfe86760bf0f9899b0fcfc86c7172bdc +33f4b1f8e4c449cbf4a01710b3de380e +1cbd40249a14b7ef003c8a6f44e3022a + + +f0bf96a5e49457f8031630df2134222f + + +4456ef4ddfcadde7b479cacfe46c1f39 +3fe76e0f0782364db62969a16a391373 +4129d479726c923853f533863980b485 +e1e9ddc20eafcd968f8c9f51a56736ea +62b7de49a5677852bdc59e5c849173a0 +dc02ad9bb7d7cbf9c8cee893284bc9d8 +ab2155979557b00ecef7c1b7c7e8958d +e85ad470880e4acf2c2c76e288216b26 +090f70ef38b639a7eb61c17dd6fc09a7 +2bd3bf69b9320a995e80c7ce85af673a +4d924d6b8d09a243f14a16202e3266bd +ecdfde02f33a63b14166a42680cf8cdb + + +44acaa258dd743bd7e274205a2f36288 +ebddf398f5da69049cfe4167b5e6b880 +70c0fc61adcb15addb3a06df5a810932 +450e1e6dbddd31e411110de6f18a5b4b +0d16f75fa10e866a576667e4e0dfe825 +0c1c0f5a4bf1ea99ac241c8604d70d3e +abe5aff33c491eff6b115bc16eb0badb + + +cd76059e9319a93321c839e039fa2456 + + +07c586be90bdcc5c8429c4285d1d357c +dcbcccd74064350045ebca7ff9c61c4f +6094b341562284a4596ec75bcbd37deb + + +18bcbf63cd346f9bf9ee4edd60e69a23 +e9c60631b682b4d70caba0c8abde2db7 +8adf723e1ca06d2217f132ad66b3d112 + + +7b177c892a85d8a3eee3a7b482d01e2e +7739e48ce21ce35cd78f1247b6eed711 + + +d68b958fab17ee3c8e933beeafdd9881 +beb2be314774a6dc4412ac7eb5211306 +1b7a1789b75594414fe2f0533422557b + + +7f3af95b8429cb1135f1d0b6f38e89e4 +c22e2d91ffd4f71ffe56f32989d1c3a1 +601214922e3c23f448755f48fa6d7f7e +be8192ecd06e39c897bd970b436d6293 +ae7d425c162f8fdcc31b6780c5f60aa4 +9f5036a9754b83c78ef667a5ba915f8a +f6aff5dbba38184dd8998c576b3093ad +e3ef3bf3556ae02dc94a2bdc360d2d49 +d5897a77179001eb8dbbb0aa1de54193 +b833ba10c2a43fb30378db9d53fcd3c0 + + +1dd7b0e81060df90697a59af9e892e0e + + +713cc92bd897d941b740aef1bfbb64ee +16ee4b07a337b4e9e04a6cd919bb48c7 +2f0031ab554d1ae49ff97db3764b33c5 +0f42b24f6a1b9eba72b885c94dfd2c4d +b3bfc3ff51c1b630a842fd2a8c430fb0 +485c9e075ba3a2a36de5bc546f7e07e9 +7abe01720f55b034034b834b89ec1306 +2b69d68dd6f5a829982f6d563ef62442 +d01f94a52840ed0da0fe14c3e70d3592 +7d4348022e6489408cec85c94210ff99 + + +e3ec127b7e8b2bd7e8e1766d1a36db7b + + +5a4b646decff7132463240f4f57b3592 +e78a29ba0df7c9bef147defe5ed5c296 +d4e5e96dcf25b31361aa0ef68ea9dad2 +7a8bab6fc66b5d2ce4f152bcabb0acbc +6148d30ad1a4bdd7d0937358d6b461e7 +9ca66b984093a947484d8b50abaa4329 +1db9cc9d11e448fe8b6668158c187728 +c2bfcd0f8843aa94180737e3c6824593 +a51ecda844cf3dd21ab391e71d8f9af0 +91784f44ac5d4a6ca2290e44242c4d3b +c38cfaedd5384ac4c0ba3765581d9475 +c20ba6ecad9f9c1d2a041c9aa59410f2 +d36e0b9cb8cda905d16adb7f4ac97832 +ed2e03a937832c0f36ef4ab568db8105 + + +653edba822938ce0b1589595b26ab274 +3c0b5fd7b2a333bce8026e36d3b551ac +d714db26f9bbae92fcfe6189feb04af3 +2868b5c28a90d590cbf4413c8aead039 + + +bbeb679422f9fd8474d9c635d6a81806 +3ddfb7689e5681029ebe9d8308fbe2c6 +8cd1881440ae64839a38ff9838ea6aff +ff8cffaec052817493a619c4b5de14bb +435a535b406ba64c00f9d6eca9455f30 +aca6d8c08e6c663bea2a2e89811a7c58 +c5b833c89e8077c9a61ff61d82cda36b + + +c1be273bd3bcaa02fde483945228edef +16915cb7d9769afd557cf5ec03de59a4 +c125f0136ce8d49614938238294fe6b0 +58faad0c53a97548125937e2ac0079e7 +38b17de188c75ee96abcedfbad061a58 +a52e6402293e6704ece85c2abbbc244b +8b202634562ae4c51e87598498acfb9d + + +cd0df1eb1ee58f4a1ac754bfdefe1cd2 +2bb0873c4f7f81c0c99b54d2942628b8 +e096c55a1206299868b4a383032c8534 +1b477bc500a440a840ffaaafb17f2c7f +b6adc5d873fbe888679d379f9a8bfc6b +b2154fd07961f3c80f34d9513c06a3a0 +535fdffb3136f26c9abfe69ea0f046e6 + + +a692169c541af686bb9b3a1d0a02b2a6 +2d2941bb2551e54d2c5d091a4aded9cd +4aecbc46e0c5f2ab302cdd54eb427864 +34416f2d756b521490629979bda39b6e +2be702506930266ffec96980fd79a1be +428f1045dfe854a874514cd67516cd28 +334b819d8cf23d9bae0b72e49101ce13 +5a75344db0aff743fb45be81fea01a67 +1fcc1e9b943cd1b517f558921e29de9d + + +aae48f5a99308c12641af94e8fdeb31d +b9ebe1856ffe897a519c981e673f5339 +7922785cf9644cdc09b48f85f4851781 +dfea3cd5ec8c64bedb9aa2594b3a2d19 +2ed12a38674b56a0928c25b881882435 + + +e90ac5d6893f33fb504a632e6881ab80 +0a9ff928fac90b7d31a211798c5d7b07 +24faffc6ec8a98224a7458268780df30 + + +be4ad6fa5c6f10b2267c2f5c37a96995 + + +898baf66f1dd853750e80807b751781d +aa549e38162bbebca92c3568439e6cca +241a18da4b5253d1a2d32322a76de9b8 + + +cf0c603a372ec04408f4f0390e508ada + + +c3ccf7492299ddea74c15ff331ea0f9a +d7c38727c22bb427515f94092c323d51 +5b2c3dbd4abbc7eff715977d4442c50f +fa2bddaa89b6129d309a100838daaf79 +c7fcdbfdc4bde8825a57450051950df8 + + +c168a83b8d1fe063cb8143a0ac4112aa +e8592f94912d5ca0c519d036efa796e5 +e1b7320c28b4494fba3338801618f1f9 +93d0209adac1b1a2b4e3cf2173cf995a +20e95e9c16378e6ac4df49011220f904 + + +4ad543978a9d6664dccfe0e58b428c5f +6bff9cf68d35e1f83c670731e270c91c +f6b62af680035531c943bb9fe3f416a1 +725a7d1d35aaa7deb29d8d7b68d5a7f9 +06e8c0cd2ad1628f6e10a7430ee66bf5 + + +1f0d1c2f75d69114936f822e4cccf02d +ce549b85795e2bf7f57d622f3fe5e306 +8230b1f4124e9fd5a70a1aa71b9ba705 +de2f26a9b5b2409aa79d946fd383ad54 +0569611956dba3b652addc02da4b6666 + + +a1f9523bf430bdd2af7fb73de6b9e442 + + +497e603380ed4878a23cb93a6d41fc5a +c36eac40f8db61edea7958d8ac870f88 +d5eb6af8926a058a1509863d6fde211f +0cef2d554ceb31f339c496ed5f06e63f +a6af9e25307918427d5fc1a92c2d73a4 +c2c7554e684b3215f323bee3acaa467a +496f2de8d1731c247561cea5b9356f5d + + +29edd079877a1f97269ec792704ba1be + + +d41d8cd98f00b204e9800998ecf8427e +4be6c1dd3aef6eb258ab4537cb331205 + + +1043bfa076d09c0b7ad7fdafe41db9bc + + +d217b089bf601472e50a76fa6a645b2c +b847321521498c0da0627d9de6adab94 + + +d41d8cd98f00b204e9800998ecf8427e +a90f7b32ab9202da3ea6974de66a8a5b +758456bd92e4f81e1fdff423d4f914ab + + +f80e903b3aef314dc7e173ba95324c56 + + +edc900f68ee6af819ace6dc30b968d80 +d09f8b867632a7fa062c38fcbe196b7d +6d6695e08c63ce635ca3e2f6a1d6f402 +e5d6f1a85bcb2c54d64d10ff8c9a2e10 + + +69caa949b7e0f3137c6ce7482f38e0f8 + + +c234c6e7b71d97e977d881538fab1d5e +a0fa0788291ee95ccb306b8aded3fce3 + + +c857cbd23a138dfdef6dbcbb475ccca2 + + +830365de65420fac0ff53836c6ba35a7 +7cade8e0372e270697be4c7ccfb6deb1 +7724aa95e287dd12bfcd6a4a9c0e0e72 +ba5074adaa5d00355e3b689f8f5647cc + + +3c7be843008e4f8c210d80e653934963 +84262a9209d682431c1484b6ab0be1d7 +624da46dbfc287fa7894fe66761c3f22 +0d215ccf216116ad98f20c48b914bf34 +54ece365991ca0dbf3892b5fe1d2046c + + +ac2861b424e2b7e30a532f37b33d6889 +97bfaff0b5c453d074f05fef1fc4c3df +35433c33dbc3525adc99ba89816d3733 +45b742c58510d055adee01e93aa33ff3 + + +d41d8cd98f00b204e9800998ecf8427e +8ea20800d43bbdfdb20363355521c20c + + +9029f09e1592da49626e9fb5b6399e1e +d71afb404b4f1946d241bc44ab27df8b +823e0c612e7de62db2d41adf37214bea + + +56f08275c87353995ebdd5373f678de8 + + +7661f4793122de3be8b166f3bebde98e + + +d41d8cd98f00b204e9800998ecf8427e +9dc0be5de3a337cca64ef3e9cc0a49aa + + +d41d8cd98f00b204e9800998ecf8427e +427bbed1f2e5be429d011aee8c4dfb0e +745adf0a86c9402ae8d08ad2f198d366 +ea919d13e77370c2542e7c20defe5a46 +1b331e41775794399092b13709a36a3b +16e32befe7245bb0f920aff7430fa64b +4ea138773b73a5ae105dd1fc61a493ef + + +d41d8cd98f00b204e9800998ecf8427e +9f037fae52533208dacbb7ad16655081 + + +e9369438fb098c129be060ac6e705a9f +8fd4a88aed32234ba887c20fd976d507 + + +653834503958f258dacebb5f928149bb +d41d8cd98f00b204e9800998ecf8427e +ed2e19f478a4fd1376089ec4b653f027 + + +e14ed0babce46edd7d84dc9aa271d058 +3c90c8031f1c099642b27d392fe480e9 + + +d41d8cd98f00b204e9800998ecf8427e +92609e87c5826db05f43b6470047253d +51465ea4c96dcec00fe6f060b378ac02 + + +d41d8cd98f00b204e9800998ecf8427e +ca0ca45f3c28138dde2f4e26effd15a8 +7b22629626fc5f780cced1f6d817d57b +7dc0092414e8a0160f715413907ef350 + + +a407ef881b83bf2bacc9edeea1511248 +d968592147e2da6690da8161b4c8478b +70cc57adde39239a54f1800b4d4ce40c +a6a80c02f188fa39b135ce4f07fe1a99 +2e8a39a9624e070465fd1ef2cfd0e34f +5e8c8b93e0e977b883243c3ff3d9a571 +7a30afe2b7f7e02b189e6fbc521c1cd9 +8b208d9d73aea61ac49a9b462aabc445 + + +22f4d2b640778fc1e28f2b846679b1bb +d41d8cd98f00b204e9800998ecf8427e +628381f4ef8ee6d35665e002ffa61bb0 +2a2f8d993d977c68987f52998c625257 +185e9b25e8090c806e1164d18c3ab7ff +609462d6bedb898fcd2efa9085432ccd +4fc187f0910aaaa9980dbed3071f6294 +625d53776232369101dad5f6318f40c7 +ccf52560d23a20c3c23a90d2e6449d8e +b508411bb915ecf32b1a995644f67fd1 +39fc42939724eeed99fc0f9554e2a6d7 +a320ce39b96e92f089f639ef14a6ac6d + + +d41d8cd98f00b204e9800998ecf8427e +9f492656ae023edc0395cb700c6199b4 +a5df2e5c187890614848ce174bbf31a0 + + +62ba1c7207971f4f83d00d194263e7ae + + +af876c926d49c59376d8b6d642ce9f66 + + +b30fb8f9811c1fa4d96fb35456366a8d +5fa21d6616fd146640d8cb59d52fd6d2 +0425a56b168d7f707d31028ad6122c26 +9f9e7fb20c0cfc32dd7879ea99bcb3a0 + + +fedfac2139ca74edbddaba770b52995e +d41d8cd98f00b204e9800998ecf8427e +5c09b3d75fcba736c3353468236e5338 +688c47e56752db341e110657c4f6f4de + + +d6d72917df770c5f42763d5bafd71857 +0a81d81144952f49baecb31cfc610fee + + +453d482e2c6217d080e4ba4ac382aff7 +d41d8cd98f00b204e9800998ecf8427e +46ff31a1787666ae78665dcea6351800 + + +2e7c67c1f808b58e33a5d256c282f02f + + +d41d8cd98f00b204e9800998ecf8427e +33d557efbd941e679c386377e63d949b + + +e122c4a3c7fd8e1814f52d447e2d1a87 +62fc08bff6c9c08fc68bd5ddab35e443 +24ec97e48bfe034f3ee795ae9ceb282f +0ea32bda75dc7855fd061f23d129c35c + + +de6be0f3faeef94e762c4e1ea1def02d +f38b902b5ce63c83e6dc6ffe2f9cf0bb +25b3ce6e2f12f227c4a1ac8db9fab357 + + +af321d136a1e674037ba2c163db3d2b2 + + +d41d8cd98f00b204e9800998ecf8427e +c62cdc02c0cdbe78853d0f432054d985 + + +687073a85e866b16aa6d4d753e78f080 +e9587367a586ee40af51946287c13888 + + +c82d5d5abb089b8ef750558b75e23f81 +ffb22ad3767850ed93e7a462fc8616e6 +d25255649d1fb417a7e7041ed86dc8c9 +23a9fe711137f3cb4f06dd011d38c23b + + +d41d8cd98f00b204e9800998ecf8427e +0ac7cc84f48f255d71c0be34442038c1 + + +b3d36970077a9568ad3cf810fc556313 + + +644741d234cd1021c70506f7a86e7930 +b6f6be0343ebb230829409ba5de4565b + + +d41d8cd98f00b204e9800998ecf8427e +7d845e5c3c1ac2c7b1c49de0d7e1c7e9 +8d01e83c7ea6584ed8244fe84628bd7b + + +abefa8f7d035ae87eb5b45b0c43843be +1eee3803a8e4cc3414f475c2af2021a7 +1228532a69cfc2e4ce917fbedb9321aa +dc68419754462144b6a61cde63251d67 +e3670650548097d9a7aaeb346f3bd5ef + + +031af7d7688f3a9a0d48d2647a99e4a3 +a7a90ee73e8f7f25267dc0ed66b3d8aa + + +a7f47e13476c054174040b29f993c271 + + +3cf2e98145b2f736130d75ebce1998f2 +d41d8cd98f00b204e9800998ecf8427e +1d09e4bcc7c8b15b8870ee521b50f1f6 + + +f94fa580d25989d4f7a0729699c794f4 +dcd7588470066bf274c070ea79bf0b3c + + +d41d8cd98f00b204e9800998ecf8427e +5df9691e6d6caf7defc193311b0b526f + + +592985ed8be81a2b5b4d1649c4100423 +9b8c51efa27bc12af0a4dea533970b92 +4bf5bff008c0b32a9b1cd7f78a4c617e +c37a0bfdec6d6c5a787dbf10d2f1b25f + + +d41d8cd98f00b204e9800998ecf8427e +c5b4ae74b2b2e938d18d6f91ae094157 +502547de717912a19aca06ddd223995c +4c457d8c88e79b1bab6c830a9162e718 +2395be35cede1fb715ef9a4e497300a0 +1877fb02fc4332fdc3e3699df586c157 + + +e181a5e12c03159b707abbfa3e94cbce +d41d8cd98f00b204e9800998ecf8427e + + +d41d8cd98f00b204e9800998ecf8427e + + +d41d8cd98f00b204e9800998ecf8427e + + +d41d8cd98f00b204e9800998ecf8427e +b795793e8742698587af059a275581b4 +47e8ba9252c70ef0d0bce623d680ac3c +83d57cbbde26de78fe831891f6f8dd7e + + +66c525f1c24e58832662ea2ba2a21cbf + + +1ef827a6d68e23ded862c53c32d3f788 + + +50267e189f3160521671ddf819a1fe20 +f88b0bd9aa40d1267c48c44d44ed2288 +b3697e5532dc20737589c4aee62b3163 + + +de594cf4764ee6b3bf0d303096378308 + + +d41d8cd98f00b204e9800998ecf8427e +8c73a6f5b6e511bc183fcf2b5c1f8783 + + +d41d8cd98f00b204e9800998ecf8427e +63a86b61d1158210eedd7055b3bfd935 +d9f10175f29b8f142255f95be2d07965 +648275f02e4c1be714897110a9aae56c + + +176b79460f070f5adf9f22c1bae9e4f5 + + +d41d8cd98f00b204e9800998ecf8427e +79cd6f766e78d5e866d1797d13f4c698 +056197c13985d9469bb0caba11e38b39 +766a0aae54b748b5cbace9b07031030f +c0d5162e14b2e33a1241be5d99bfc943 +bbcb1e28381494e4b974e6c82013a613 +1178c5bce80f0c2cda291185b55297dc +2a452e950585fb39d94e41a414471df5 + + +4703a36c950de669ee918e763e014fe1 +977109b651acad563d27a9f05efa820a +f0bd1599b002694c6ec351d6606921f4 + + +d41d8cd98f00b204e9800998ecf8427e +fbccc9c80db24316963f00108777de22 + + +abe63d0af307817515898833a870bc29 + + +d41d8cd98f00b204e9800998ecf8427e +3e8b72640f3dd0117bde24b366b7a8f5 +6a1a6da93f9c2d77d68c8edb90139899 +3285c87826c9621ebf4352cf2a3ee2a0 +8a1c4f997f37fb274bc58c905649c0e0 +2211e75d50ae16f94e147f2f05a85d91 +d6e07b8cab924d1b1b4e7b467aad3e67 +80c65c798aad65e52c21289ba4fc8db2 + + +24fefe7d02c78008aca2345bc2f632c5 + + +d41d8cd98f00b204e9800998ecf8427e + + +d41d8cd98f00b204e9800998ecf8427e + + +d3fd9ffbdbd2e8a25f32d3fa18653196 +d41d8cd98f00b204e9800998ecf8427e +d64e97da94df5bcc6b9e82a379085f61 +b59142bd8cdcd219692f63fb46cd3a49 +32b9f7e276353924351253cead6eef06 + + +58251447f64e61a8aa57f4a820fc21ad + + +d41d8cd98f00b204e9800998ecf8427e + + +896db0e30e08e595ebcc6037c1f43125 +d41d8cd98f00b204e9800998ecf8427e +9828a8c09e33d2aabf40388aa3d71d56 +977792fd978561c2f641a42ff3af515b +0bf49a329273647d1ab966c8bf1852b4 + + +e669f981e82f640ed242b796c4d8f2f1 + + +926bd78111e0f27f638bb0705f92439b +8e16469fd236e9975f6a14a9e59c147c +37d695c0d624c79d4d5fa14dd131876e + + +040fcead42553050d648d53d01d642b6 +58e190fe5c72ba2cd4db99fd17aac7ac +212fcab202e934b30e6fcc7c5128ed3d +6a692cc606a48741b08fef765bdaec4c + + +d41d8cd98f00b204e9800998ecf8427e +3d18b6afcda65c40d3e5b1565e0ae3f1 +0cde765c7d578d103c71dfc4197438c8 + + +4bac12077505462bd962adb666852966 +3ce4735205d14eef357f1fc90d655ece +cc7d7a963ee9ef58ede0680241f53de1 +ebb2e597917e22900853dfa300de88da + + +d41d8cd98f00b204e9800998ecf8427e +5b69636b3ce9773a65a8750f65d31ee9 + + +32df7d91f327cfdcd67d831f6e7535eb +3ba16c045e8e62e38dcc8b6c24e75b37 +40ae96657f888af71df1a7bc45d158a1 + + +d41d8cd98f00b204e9800998ecf8427e +4776d6cefd9a868dc15fa24651c816b9 +9069ff50c20cb96cb418f7b75c3a905b + + +ff4d34cf67cf4cf9d6d4211ac9b36cbf + + +ecbe321be296c93f5263424e7cdb266a + + +d41d8cd98f00b204e9800998ecf8427e + + +2f057ac3d6bd562b5652a688b6e64bfc +325472601571f31e1bf00674c368d335 +d41d8cd98f00b204e9800998ecf8427e +f6ceacf21d75d76838d8d0eb07b59b91 +bc3efe4654dfa1f79154f2544af4b884 +fee68244e60227c904bac3a3b6eee43f +87ab0c3914a8aed4dacab87430458bb6 +520e529510d541e2f6d55d4835d37676 +36dd4822197fbbdf19200117a1764eac + + +08c5276ccec1e43cc5f3c6d0be5d2b8b +d41d8cd98f00b204e9800998ecf8427e + + +b8d07a4c4a294348b97c9bcfe2f85590 +3e8e56cfacb8c2bbf56f9d5535e531b6 + + +edcd1c8ee9024895b5a4583722babe78 +ba4926ea53023adefd4e45924855b2a2 +582e2c081262467afb34b75cb2209cd4 +d41d8cd98f00b204e9800998ecf8427e +9c8237cfe69b78933a90446291cb4ae7 +5d2a464ef783e9ec70d12cbd0219b093 +401bf37973a5828e589dc42d51a9ce41 +98ecba6c3121fab9e9bd8a0d231291da +ca7af6adbe7fc6713eef7aedeaff6d68 +e6b53f1b56eb92e0f6c7956389846860 +a9b8b3dd2ca801db31096657f9feb223 +d2f15a52c9b7cde60094357aee158f9a +bcf30b9314c6e22f433cf63e070d5e2a +07acabf847fef0e89e2bce0503630da3 +9fd4dc6b29261e27a3510bb978a03e6f +6384cb5f1f2ee9d373aa7daa642aa37e +33a84dfb653999b51a2e7bf4ad9d61c4 +d557ad90a880a8c4239afe23dfa338bb +2a6d089c130c02e956bfd09b24e471d8 +23ba1414b6b41244e36280f806264949 +4f78f926e05049ba39465f6e6468161b +0b3ad9eaedd22ca346e7413749cf65d3 +23ba1414b6b41244e36280f806264949 +f0e74b60a4bd86a7e3c72703ae35bdbd +ebe5075d5d7f38954bdac5dc09ac7959 +bbda4f35647bcd95d0c8ee59784c171c +4c5e0f1f033e3c5bf6262396bf67fa18 +d4fc315c5e2ead83751e8840a12f0bd5 + + +c05109777e57c2553f01444a13c901c5 +d41d8cd98f00b204e9800998ecf8427e +5c405b8797567aa10a74ba78e0a45779 +5518e2e6b0fae1d10afcff0855ac54d4 +0a2d3ee44e20f13736fad04e7894b6df +bfa40282d9494b2a4d2999f1b0cc3fb9 +a313226470463b1cef10c0a9e9ef810c +a8e7f6279b672b819e3587e82be2ecaa +1f38190b8213c46f62edaf39ee4638af +c05109777e57c2553f01444a13c901c5 +bee1a71bee296f6d1c70585fe47c6ef1 +c2ed5baccc767f4fdb09ac901f1b92e5 +805d1cab1ef9a9a4fb9d5f6bc19599fc +08302bad21f1fa6c63e2676d8997c4c5 +1e66ff16162d27c4f62f5f50321c27c5 +1a5c6b584ccd998c0612fede27015d07 +99113f9e888936076f1bfab0f118d75e +1411e223b68d5b52ffe1af867f60c4a4 +95c88179a187f4e5b646bc9ca87fe969 +f810fc612aceaf61d59bdfb6070481c5 +1411e223b68d5b52ffe1af867f60c4a4 +f70aeb96f2b1e6b321b8a0b33a0ec388 +72517dbfdffeee4aa7d31fd4bc08989a +84ad28425e6a6a24d92ebd0e072bacff +1e66ff16162d27c4f62f5f50321c27c5 +e015c12d2f9b5ecbe7d3dc4d40a3d403 + + +191d2a2463a0166ac3be558bea018c72 + + +d41d8cd98f00b204e9800998ecf8427e +13c230e30f07c174594e9aa17fadabdb +be71fd70d4c569441bba4290a5f45ae9 + + +d41d8cd98f00b204e9800998ecf8427e + + +d41d8cd98f00b204e9800998ecf8427e + + +d41d8cd98f00b204e9800998ecf8427e +c25b358c8b92592afe06a9c4d62a37a8 +6523d9f84dcf60da8fca2097f2147dd9 +a820218b80b8490482654be08093cfca +7db229fdbab069ce531ee6db615115f7 +0a3152cd7649e57b9318603c240cab0a +77c8cd8ae6a8fc95809d1ba5d56e6fb8 +1fce4641b42b1c6680093428f2ccada5 + + +f4306fe54c33047d10182d177f39b89f +d41d8cd98f00b204e9800998ecf8427e +957b9030b18c319e7c1529a4ffc72b85 +6b6851714ab5e4f9491c2500a26c8ceb + + +6dee88d0cf667f9b940d2696690f6744 +d41d8cd98f00b204e9800998ecf8427e +080945adaf8304688ce778f8acc821fe +300cd9f93948ef984fcea8e1867901f1 + + +d41d8cd98f00b204e9800998ecf8427e +9e8c8078e241f955763c476a9cab59c2 +5ef3117292cb272cb72190d67bda189d + + +25d6c35728da1df381db408e61137d98 +ff890ffae74d79a90ade34016ffd241d +1e1d68cabdaa8e946ad786f083a114a1 +080945adaf8304688ce778f8acc821fe +a2546e7613e0c76e1c26692507f66836 +8cc4b11d20b0e01eb7e7b7401c2f12c8 +190087a51700f34c1b861261d838a6cf +6cea8bdd89a385b695dda1279e3021fa +e48ba3cc3d7d8641f31fb4d1e1cce67a +fbe31176a2ece8671e34270b56ed9224 +cf7fe720eedb6cef5c6cb67feb5a31ea +4aeaafb21fcc66d532de0612676423e5 +b7c3b27785924f5b023754855bbe3177 +526b1578733967a53e9c7ea0d3687334 +9e2d3bb695cfcdfebe705c171aa299ec +d7f98378b22bf02d1e96caa8c354a518 +60d139c55b1533b31a8fcd4150ac35ed +d02f3b80bd620e44b248b763a745c555 + + +d41d8cd98f00b204e9800998ecf8427e + + +d41d8cd98f00b204e9800998ecf8427e +6534c21938d98c00bad6449081c65979 +42a382d9a7146ddbf4c31c3aa55d6623 +7a69303716cb7dff3ae011d2202de8f8 +8c209ae5445bf45531c133034a243439 +b4987de205c69745a11bb3ca910cf99f + + +b9ef591e526bb7585e2e9e7224d9ce66 + + +3beda9cd6565bab822fd85e21efcf733 + + +5c1835dec2225168f2b28b4e8153da09 +d41d8cd98f00b204e9800998ecf8427e +7118a3ccd0d4403f808b65d776e8855c +d992798ae83fe2da2d0501997a8bc9ca +d6662baeac15aea3f1c80d09dec20995 +6ffc1d90d72e3ed0f20b128231e61593 +1f21cfd913214a20cfa2f7ae3ada25ff +ef26c4f25fa2beb7d37143476b866754 +62b787e74da5d6c50c1bd97b356ab764 +78316df6af32ee9da5ced78338216bc8 +2162a76e15dc4342e7fe861bfbec64b1 +97283e3a351b02ab30f1d6b9174a6ca7 +a5b8ce85067c27e4ba0d40f305f84f8d +a211091c4c91768c4fd48b81a261be92 +1d41db13a55daee5b2fb5cc28528c32c +0d9c006af2fa9a68a117520b8fb0244d +0a3bd48209e8dc9cba8cbde6a8acbdb5 + + +16598bc771454bbc6c4c7e0313b36542 +59b3b68fad9af75f017f642e1e2e073d +b2fd155ecfcbdd44d054daf678b0a834 +cc20fa269d0799ec512aed3ad36d9d85 +080cdf15218f357672308e9feb1d354d +6648383dfcecce0fa8010ee26e19c029 +10d80a81dab8b4b36bc477b7d06b2c89 +d41d8cd98f00b204e9800998ecf8427e +bd966e5b800b4d63bc3884eb6c4dc944 +f0e5ef9a4d74a8c802f1b67415f319a1 +d67feaff91ea41dbdb614dce38ba542f +6a42f85c4852916c71548c179234aeef +0db78f95e23062feab46593d28704532 +639d7ee6567e210b36ecae473c5ce5fd +14dcc1c1453ec2180a3bdc0cc53fc18d +2de8820df5ad2c53044c62ff4ad718b9 +454ff3948173d81e3f0c7ac1b77fc91a +98b51504f52bc57c9d900d0fc1bdb4ab +84fca517a57320901e6f4d09aee570e5 +47fdbddb0716950e3754211aa67c8c43 +f01a62497c9a085386bdc7c1defae763 +ea8f7edcca4e35f95a3f2b7eed940d90 +66809106d19298be518b4f947dc0f323 +a14866ebe77e5755d7b9772210696e42 +b28954162df69981caec0998d15b77cc +447cb865dedd025c82a0402a41d2253e +8733185af5f2ee9956742aff5cd5df21 +7b53b4073832d6097d69bdf50ccf5ba2 +1b0a44d142ae00530558bf5a6562492d +6cbfa567b0f4153bbc7f74adfe6bb4d2 +b6f90f0325529e3a39ebe651d0f910e7 +88379d7c5cf4379d141f0e277fc2d499 +3c36fca38f15327101e2cc37493e60fa +c3d1e1b3f31c8bc2c6ac7582205a85ab +2c4b8a901ebd2581714ea5b7db8ffd1b +daff44759e4f9c193a667ed427ba5444 +29b823646e763c2e7a64098be3ba5130 +f4d35924864fb87b787ab9a9925fb091 +2cf0c82aa4ed8fa0e22c393b7f5ecee4 +2cb5c8f2cf03c6df6d3b70394b454d1e +c65c84d23e2a8ad950ca58a1a2ca90db +73aae48b832026e3d24c305f58743806 +e7df06c253dee16873fac26b32670722 +d4ce19166b58327ea8fe72de57a8dd85 +507d7fd927984729187a4891f616f37c +ed773b5b64093d6017aecdf1ca79fef5 +4b15299e9a1c837d8e32aafe9abb00d7 +b418b86d6c9003364c5a060946082ccb +16f583734d76081ef1a4b44d1e0657a6 +4dd69e598e667405299c866a9277af26 +e07da2dad2151513bd8dcbfe29d43e3c +a239faf6b54526481abaffe15d1f594d +4b9010ae3ecbf6e792d3bfb687ea2ab7 +fe33e132e503f32398fb9809fe51da85 +4b85147a9ebfcb923038a17487822286 +e639d0ea5fc52734d43abbba8262dbb0 +9cd800459fee7c66968424ad7ad27668 +da8f6ee03ae35e1d6cfd412d7c6330c9 +3338b73e47bcad98695e11e3b32ebcfa +c2b5636da94367d2e46433138f5c36e9 + + +53418757a3514b38f9e744fdec744a37 +d41d8cd98f00b204e9800998ecf8427e +80f54c48fa46d0aaa977e404035aadf5 +febda7bf2f326668d1f627ea9f2230b1 +4e6602a9b00bab8fd936f4800a1014ec +fe8c6f4acebea37d34b626a537db0e29 +90ffdb58422df4e942a1a90cf5225c11 +f1a8c3f9d6af74c305810725f125691f + + +caf6feb450a2c066041c0cff2026df67 +a1bd66b209ee6f52c176d5d0f1c62da1 +3b86113a34125dc6f8a1a2f1cd30af9e + + +dc056bd161ceeab388b54c28790ad27f +d41d8cd98f00b204e9800998ecf8427e +26dd7f4612223f374bdb1e5b26dd41a5 +123e12474f60c1bb22564b4fad2249e0 +327de623b6318783a31bf2402764855e +6ec0274bf7948e86e48122bf968085e1 +7beb5257355c0e3688bcabe98a6e2321 +84b8be2d20c1d6d6811f0298d2234ca8 +73de16117807e3f161b91ccfa5701f79 +e61afe98cecfc359ec57f32be4ef7748 +38da2f7fcc1f2fe80b87db53e8767282 +51e003dd68580f4f37558726f8452b53 +748938e5e5aadef1aef9a8b79362b1bc +e4a93615651fab4af7d9288cdcecc86e +6d73868eae09dc15710f4c71ea25d7a0 +6b58f5c0cad8d233b94b0874a41e4c7d +9596a02e5898fe117ac4d2f080a1b3bf +afee7ccb55d1420cc8e36da4657825d1 +1040bc90a4146aba3e12b547710fd290 +d2b5ecf5e328a75e984f342ec80a60e2 +07e043e1c42a0fe90d2226eaacb013e2 +4cd01a2e1b1d02f7bfaff7792fb45da9 +f12d4e2a7b8866e08c4635b6776c1b02 +ce24eb153015acfdeca2e5559cc41583 +a969dd13ed2ab6f921564ecd22121515 +c2ced639d9b476d69e952e110169346b +c4cf4079ad9a3a1e53b9abee7fa004d0 +3e30f76aaabd46ad9759658b706af3f8 +4d7e3a9cca8144dca5f184f23e63953a +60c540c4dfb653ef65e67a628645f590 +abb811eb8d79dbeb78f5e67711905618 +1653a3d486b7113e331b01813407091a +98ca2d412c720690b46b8bf566cf4fb5 +a9d45ffd6281800146fcfb2e3ab90ab6 +66b21a3ea2de0ae271e470c339c40d07 +9bfcd5451fd684e35ed69b3912791a6c +b416db3eacff1ad448692d14aadff327 +b37a46d1de1e9b957b33881225da36dd +b0bd3479b483ba56d613a91242e0efdb +0bbc469b628cbc940ebdd59f2e218b6c +e1ed3c24b7fa01be0254d5e6393237e5 +0e5a8ff24a2f4bb98d5c6c732e57619a +811dbf5341b537fccdf98ff790cda72c +d868ca6c92ed42be6d193a71b5ae5a7d +11709bdc16ba921e8fe3774a1c7aba5f +503104f81619bf8296bdd1893079765f +aa7ebaddf8d815b3dfd1b3281f26de84 +59519c8b2bd240bdfc50476ea344cf8a +f68235c447fde10de92e0732d17258bd +7e770b91ced138a55a264566b158c1a8 +6caf87260cfa1e46a3a9145ee88b89be +7097ba988bc2e9100b8857863e276932 +3cfbb9ef9c493bf739d501114cbe798c +0d3a43a7afc190f34f52855f28a34e4f +48f9b2c134655de1b0f5f7d50f01b765 +b3c941e7ae9574a1330c98ce07aade9f +70c6fc7d08f3c562322c9f53273f1393 + + +47b61de6de8e6ba33297c340f849928c + + +bd19a5a87ac1f504a5355e88ba8cb8d5 +1b49f055ace5372b0a921984a22feca4 +d41d8cd98f00b204e9800998ecf8427e +5a9175096415541a53745f90e42679e1 +1c86cc615e0a0bbc32becad92c67ab69 +2cca267db384bceb4be4c9117ec8f5d6 +5bffeecac1842d72c52b88dfa38a0d45 +2616ba6e3e277acabedbe7b36114d851 +215e0b3b70724e3a165799f71c1f24f2 +b0641e3c641ece4a63e97f7ee39df1f1 +8ce29863483ab28b83dda0eb041678e3 +1f97fed8fe9c50318bb57340d202de6d +f759f3e6ce0d743fb9a50cfb1d7bdb55 +69ec52d7086d886c9e10717090161904 +71e37258f5fc427f154f008866b0e812 +0bb3659e089d54ce36b617409b3e3d15 +867e9e9c421ce864213eebdab0ad34be +593ce46bc15dab5c4603a5b9c41cd0a6 +f89b2c8f43687cbc0597dcab6c7775c1 +59f6ba257eca6b5a93e882c9efc300ec +8e086092fcd51d0896cb0e34026e6a84 +dfd0467353ed7c44352117a243179a8d +bad676eea7524bc274e069c4bad959ee +ace4ca8e5de14f5b9d9f359a355c0396 +23d61ece0d5dc54bf7289f5089cafc6f +32042dcd19771c7e6284bd7647218438 +0035f9b29bda926156cd36c0a8d1203d +d09f346786a0d3f499c82632efdc513a +5532170a1aca71f4b90b5d61538275a3 +d7de3698a298dbc77285df67b6d32b23 +458f753fd4c0a29c0bef1b4d29b61f3e +da4407057f3825372d0244bb03d4de0b +f719e9ea435c0ebe73ddccc0e45faf76 + + +8c78f30a301fd7c5092ed59d95f2f688 + + +db4b88a7cb7f2e983e9349a0564aa877 + + +f8bfc1daca01458dceb9aebc7ffb5ddf + + +d41d8cd98f00b204e9800998ecf8427e +51cfafc65228242a2b2e5b40b0660b16 + + +d41d8cd98f00b204e9800998ecf8427e + + +d41d8cd98f00b204e9800998ecf8427e +5605c9cfe399c7d6d560149dccac361e + + +7a9feac091b9f087e7322a83b0afdc21 +79292a368c82c64c1725f3e89f0f74a1 +aaf48588ea6e8869af087e971013d334 + + +d41d8cd98f00b204e9800998ecf8427e +c2e6938fa9b2a133282c0df7cd8abf72 + + +10e2b90883ac49fc2e326e92b8a3499d +637487fcf15c0eee4150965305c5ee67 +79a20f938fb5d3f145447ae44db05477 +f2a1930d9be82084b365ccc8819d8484 +d41d8cd98f00b204e9800998ecf8427e +1de24508893015db0757ec63e74a8086 +2ae8b7de36d0e4c3630977569bf93bd6 +7af81ecb2106b1ca78c310332a02c604 +2b19c3592fbed5e4bd96730f87af438c + + +de943e7a2b8a603c3ebc34507309a46d +d41d8cd98f00b204e9800998ecf8427e +b6f2276063e5873825b5928ca09a0196 +b94a53475b0b7b72de16ab96550afa6c + + +9ca2223ffbaaeca2bc607504b6c61ba1 +663de3e0f812c586bf4e76249393440b +b58aebf1a81b0a34e8e66e39e0e9ead1 +8a527c66631be349deaf8cd3c8c65ee2 +357ec41bc1a5c1b9e798e094ac40b613 + + +d41d8cd98f00b204e9800998ecf8427e +7a6ae85d3a8c4c614ab2419ede67abba + + +d41d8cd98f00b204e9800998ecf8427e +4553664f3a8bd058468c8fe3a6622db9 +86a595136563ba16d9b4fbb1cb97415c +f0e4f84ac2849eef8c8da252f2a875fd +fdc9f14617e70aba304986ff7e32811e + + +27f3aeddababdd2cba655e311acbeff9 + + +d41d8cd98f00b204e9800998ecf8427e +e3bb45091c943bb3a72cb00422e0fc65 + + +d41d8cd98f00b204e9800998ecf8427e +7af26733aec623cb978ec9e8c3a6f324 +0610f57a709679458e9057a07ba101b1 + + +2e641a6f3d3eca6cf4a71cd88fd59469 +b9fa1ee89ea983e5cca8148467eb637a +f91e0b1a3c4cd2514e7450db3f040b7d +3bfd2ce4fa4073f4522c912c372a418d + + +d2c1bd5e8beeedc21de40eddc875e0f9 +d41d8cd98f00b204e9800998ecf8427e +97a9f29c0dc31ca7bfe79f69f3425c76 +a5fa4ae23dc2e8283a63024a88016ea1 + + +126f99a723184153f4b5b9e9c65cbaa5 +19a8cd1e9e3b2b3cbec0990c2645c17a + + +d41d8cd98f00b204e9800998ecf8427e +6d5804ecb535cfac0b49152764e90e5c +94e9f6ce17a4651ac325bfee0ac16c64 +50f84816b4f7e220491599eb5299fc90 +f565e3ddf9bc9395ac47dcea255b1cd9 +f45ffefb2e7b1c22ebdb17158c1500ea +855cd63f09025cc1222ad554a4bb0604 + + +ed05055331fe2881ac1da80a5d9e108c +d41d8cd98f00b204e9800998ecf8427e +f3e9f624e0d30fa9a2e8da2f239f2c90 +66041e698cef9296e9c48aa6a80953cf +1118144eead2f41708d6d51c25bdafb4 +38979eb74f1b95e4238a1d46a426be2f + + +b35b044b70ee968efd00883995e46d85 +8ce515fb6c72dfdcb292d4fd49e4662e + + +d41d8cd98f00b204e9800998ecf8427e +f63628897fdb4a183081fe4fd0010d7a +64eb1354ac6c51821c0980ff8edc544a +0a846aab804b6db6c1e9fb50a5081fb6 +2412c043ecec8cd25ea9a03e460f052a + + +d41d8cd98f00b204e9800998ecf8427e + + +e850bb31339f9cead4d722e1a25bfa87 + + +ad04ee1d74848b23ca5b45191b38b2ea + + +d41d8cd98f00b204e9800998ecf8427e +4b0639469c047f10c9c546331f6bba63 + + +d41d8cd98f00b204e9800998ecf8427e +a9263ae175750c4655ce37217107d029 +98696a105fcdecc8f00a2849ed36aed8 +d4cf80342896bf019bc4d3e8b961fa37 +4e99f17050caf177332e013fe7fe9e0c +7bc409d442508ec7f8638e4d710c6508 + + +9f8d361f7a3f4ea69ab74b0ac8bd2565 +350354ebcb6bff1f46b76adf9d1abd36 + + +347df504c0b23da0ae91c9b5a344c1a2 +d41d8cd98f00b204e9800998ecf8427e +9b301131818ad7072d10624d9fce65b8 +215929b6545fc8cfacbb7386e4cbedca + + +d41d8cd98f00b204e9800998ecf8427e +cdcb97001ea2cbedc6261727dff64e0d +642212fe30e6f0fefed6c31c83c71a72 +c65eeac4d7c36b3af73c2408ce38fa09 + + +4dc904185fe2b76d5bc130f22528d699 +d41d8cd98f00b204e9800998ecf8427e +cfd429ee3e4c1e7bb537019d7122ced8 +ae0fb580a2fe5b03172568950e5d5a48 +b71bf029976479ae4f80ea641304f6d3 +ed2811af4208ad49754d4e8d2fda62c4 +5e7d0358103080630683733080afb87b +eec05c0523cb9769a07d04f955e1c72a +7e4900564ecc92158821a13fd6f3b635 +184c417ca2d9d734f73867da2c1287f3 +68fbcc4c093129ed668beca7cbd761d7 +419e09696f74abcf339c3eddc67a029f +6c3926050e8c2c9a6cff10b8059e88df +80af429597316aca3852de474a686ff4 + + +391c970a033d0593a16fb904119818d7 + + +d41d8cd98f00b204e9800998ecf8427e +47cdd134f11d6167cba1dd440c90bfb4 +eb8f1b14a2a6774981d04a6fee92d566 +ffa6c6d30b6f1e9b7140014d35abe01b + + +35063f32bb86ee8cd1460cc9b50460ba +cc44ae6151419f24f801a399a8da8e9a +577a5a6dd151bcd7cf6d8fcbd70677e8 + + +d41d8cd98f00b204e9800998ecf8427e +6b8b8ce50599e40cb74603a883f5d49b +b6e05cae93872a350f3ca2352f15f6ea + + +d41d8cd98f00b204e9800998ecf8427e +c34bf02ed40bcb9f4b41f3d1e5e5ad60 +d7df1b72b8a4b0a354b9d5b0f9d26344 +2c06092e1620c0a27cf264e1fb56ea02 +61328dd1c13f9e73414ea8e64a85405d + + +6b30f5dbc6bf06787542ec9414975f15 +94fbcbb3028ffe4e9db66eb269c6b10c +e2c3c57abca7c86cf8dd772334b5fbfe +4b351c64c714586873ccc475ac8ccbcd + + +d41d8cd98f00b204e9800998ecf8427e + + +d41d8cd98f00b204e9800998ecf8427e +d9448e87c67953d80696f8cbaf6c1175 +07bd495dc9dfba8e2600e88be590e561 + + +b6897110ae9267fb7f01d49aeec0c801 +ee19a99da183183338ea6ad5362ccd13 +065e6c85b9a555fc7280e14a0f686b22 +711f25ae86a9b0767bd4b50e40280c08 + + +d41d8cd98f00b204e9800998ecf8427e +70b0380559e50123f150a6f30a4d6699 + + +d41d8cd98f00b204e9800998ecf8427e +04876764536d2c0ff37e0f1c9035c639 +3621a212806836a2b3ca23f601c1b670 +b3f46a3f7cc553bcda255db88fd2309a + + +bd2bc7e196f60efcbd3a834e9862b333 +6bb3fb472a3ff31f31945a68bb806cde +29977b078710f6ebe992f5b534b7d897 +e1efd5d8bc348da70c325a08fc8c37a8 +610022638254b2075ec4bba535c5fe37 + + +d41d8cd98f00b204e9800998ecf8427e +b2a6f62ece363c1bd536bef4ae190d40 +b5537ee018da868c569acc68b18f400b + + +d41d8cd98f00b204e9800998ecf8427e + + +d41d8cd98f00b204e9800998ecf8427e +4763ae206f354ad791ccff7ee53ca907 + + +d41d8cd98f00b204e9800998ecf8427e +a6d0b151c8a54996ae180aa38f639394 +8d9da26640fc68bb5b410b1e2b045146 +dd6a5fb7d43469dbd615a20d87f3d3a7 + + +c5cea88b5dcd2165e6463342a083333b +479a15c5d54330ed02283720b48ba8d0 +67aacfba9a773fd702d1cbdb527c2389 + + +0db9ca7613d81d5ec9f2f5ecb9ad9dbb + + +d41d8cd98f00b204e9800998ecf8427e +25d79a0a47b2f7f08a7519050fefe7c4 + + +d41d8cd98f00b204e9800998ecf8427e +c8c72a1a816e54366773a6fe813a99cc + + +d41d8cd98f00b204e9800998ecf8427e +641809cdd14d1a4d72cfd92cb37c2c33 + + +d41d8cd98f00b204e9800998ecf8427e +6a04d0a55d694688b7a8e43c72f63891 + + +5ba605e1b76e515803012ab67abe2e4a +0276bf6040d05e80ab5f6c6910f6ddfc + + +742cae1d17ee4f74bd696aaa67fe2e12 +f941a92cb10e7ade5038ce94de4a9dcd + + +d41d8cd98f00b204e9800998ecf8427e +9450b4d4b4006bf67e6bafaef58f3d57 + + +bea23817aaf13e638fc0e6d274b0a63f +d41d8cd98f00b204e9800998ecf8427e +2f133b07231a558b4551cfe813b6dd92 +c304ed5cba54aec736b4550b472a1337 + + +36473125e09319a9870285bf7302b83e +d41d8cd98f00b204e9800998ecf8427e +db3734d67e45bf4a5140fbb38effa947 + + +0918b8607cb8267fa8c5938d3f70444a +495aa857820dd25a74ac8b725c135c45 +1dad02eec4ebae92e1da5754f9c38fea +8254afe150df9a7f4a160a8e2f3b4702 +0ab8fe506db31d3e1a2a40b8d0eec509 +ca96fc96ed612e73229b17a153fa4dec +f8a82c0ae674bd5d378298f8afbd05e6 +8b4c716b906f0c72d326fea013c0551f + + +b5b8aca26aec574d1ab401fe8411e144 +d41d8cd98f00b204e9800998ecf8427e +f1dcf0ecfd2eead2b4615deb2593668f + + +d41d8cd98f00b204e9800998ecf8427e +bd77bec5b425c9fbc1a4830a3ccccaa6 + + +60d1a2024e5d8c9d6cdc0c295a243652 + + +d41d8cd98f00b204e9800998ecf8427e +d07b23771a6639fd5f6216da796ff343 +290e1eed5e28283e741bea66c30ec042 +5cba7b9316b591829c756097ae0485cb + + +d41d8cd98f00b204e9800998ecf8427e +1f669f066fd46b6c9ca05177e177ed23 +bef21989e641a45d0f362fcb97281341 +00b8f993b58e8278a8115fb82ba7db57 + + +32cfbcb58d6ae71455e0c58f951f2849 + + +bbdf49461b8f7bfda4446af93641d362 + + +710958b3055ce271a53ebd4e6325eee4 + + +2573e46733c7208e2235284e4e09179e + + +d41d8cd98f00b204e9800998ecf8427e +4dfcdf4d3cb3af826834c1fbb852f513 +9ee40eca1f3111186855090e11978198 + + +d787be1614e93a5b0dff651c2d1962b8 +d41d8cd98f00b204e9800998ecf8427e +fc2cd8f1b832bcd093d8f65cf48d6be1 +94d4a670a65a20356db9e332884b5b3e + + +05afeb97327056d436d21d891b041057 + + +ed6fd0cc2d0a6e17f6a1b258572fa54a +d41d8cd98f00b204e9800998ecf8427e +ee214e8c71603d61080656642677e373 +5142e675c05915758d5da85ebc75eda9 +ef340739e50f5c3f03ee33bf7ddb2d6b +1be28ef0c48511a574aaec4e85b82042 +ea1fc88b5959bf491d98ef06a82efdc8 + + +d41d8cd98f00b204e9800998ecf8427e +61615b827c5713d34655cdc8d227b294 +1c5229194acda10b85b7851bc12675a4 +17fd378a48e2e9575eec057d9881cbcf +a971555d0186562ea2adbe990508764b +6d3e6d6ff9114516a80456e5a6834337 +aaa73e4fd80976e78fec2ae8ea9c3d07 +7e24728bb80f7be5ff656fb47737baad +f4938bd6e57a721cf8a7334599513831 + + +ceaeaad44575b3b3f84c6785cb0d2f27 + + +1390ded165db331385a1a0b5873c2da5 +d41d8cd98f00b204e9800998ecf8427e +cf774530ccfde3af1a4dadb6c4a5de30 +254b5f623a4ebd0f52af25fa0851d62e +a24a4e8582b19a3d805e6cbf21a6a1a2 +bcff6120a04c2644c3139ab28b982506 +e1e875671e566acb90ca03d16b7e63ed +be1a34c1c77c5431dfcee9caaabcfd88 +f71705be8958fd18f828eb64eb254202 +36602e78494c46c4704cc578d4fb90cd +d0889baa672fc0c803bf11ba7f57f6b1 + + +53e129589b3c6fca1362a2268dd4e875 +2690905832c581954b227ffe9e416040 +7343a246539a3f13f93a24622939ade1 + + +d41d8cd98f00b204e9800998ecf8427e +24480f30f59fdd7d62df01ab54dc710c + + +d92251a50ab286a466dda724e2417454 +fb2010dcef48409111bc5d619e48cefb +600e39cecc179fc8dffab41c2e519862 +1a47a847fe417086b3f0b8d467d35d1b +b69b43bab30c28687680635f91a53017 +311aab84570c363ed4ff7e5069f5d949 +fa7542a63fa8d175b25c6db3d460d8a2 +6ce7b2cb223fead83bb4294741e580e2 + + +4b14954898b55581840caff5d2a6c292 + + +d41d8cd98f00b204e9800998ecf8427e +c5bcfe66377f125e7df564f43a4055a2 + + +c9a74da7df941b7d85b1968474de78b5 + + +d41d8cd98f00b204e9800998ecf8427e +a9a9ff765b1d8f6e41ecbb367e119f44 +254087754eaf5d3a5a5e54474d911ddb + + +d41d8cd98f00b204e9800998ecf8427e +c1a018a8f295fbacb60540da04196931 +cbc57b074b50625844cfa53e0a5793c0 +37bb963c5dadc996a1a96c433fc281d8 + + +3326f270289840f7f0b365e3fc10b871 +11b557c4e0466d9d6c91fe1fcbb7aa2c + + +0f5edd10e423f8ad19ff6ccb3e0f0d5e +d41d8cd98f00b204e9800998ecf8427e +5c64a4b4685177a38b565bad7b9b687d + + +d41d8cd98f00b204e9800998ecf8427e +83f35bccbd9a8b11c8d657930bb11011 + + +13b800220276edeaac3b1434aabdc185 + + +d41d8cd98f00b204e9800998ecf8427e +6a4676f26cc4774608c53cd47ae76efa + + +5cdd42491af381a414bea885fb5c234a +8df084360e41bb5dcce4719ba16c4804 +a90e349b1dfda275772af8b109e8be6f + + +366995b763c1aead04b0b2f0a125038f +ce7529788448438a60e5cece5e33bae5 +8d9a81ba49cafdb00db9cb3651672497 +fda753e7d9cb23ff2436f21728bf5cfb + + +d41d8cd98f00b204e9800998ecf8427e +8705dd72341375d93961d8fe65ac8a95 + + +79b8c989d344fdd08b832d875fb1e161 +506ea9d1421de557c9e480881cf331b8 +a2c3436e9e188ba9bb2653ce58bffc0e + + +d41d8cd98f00b204e9800998ecf8427e +86b05756ec73691d2b88e25bbce1e86a +b123826d90b2ffa257bd9880c090a6ac +f454a5cbdd36bfd22d6240b85e503e3d +59d8e23aebde2396d3440271828f4e20 + + +d41d8cd98f00b204e9800998ecf8427e + + +d41d8cd98f00b204e9800998ecf8427e + + +6adde0c9301533292f1581a8712e56fc +d41d8cd98f00b204e9800998ecf8427e +48f7678b5664784c7eaf3f295b395d1e +264405e8b501b39458cd09ef5a196807 + + +ad397de49ec0d9551c8e6a3b82eba821 + + +1d3a243056d8d6b4c511306f32b8520f + + +d41d8cd98f00b204e9800998ecf8427e + + +42a55a23a1f1b8f9a16e0c2f67af1101 +d41d8cd98f00b204e9800998ecf8427e +beab4c4161bdaa1a850e545aace54e1d +e46cfd196ab75f7cd15326e58f2b9de7 + + +9b21272e9b7dcd0da322787ee5e84beb + + +bbc809a90f76f56cf3846553635a49cf +7d95b5c206c23603add3ad81c635d45e +5d5f2fc381b89e2b3b7e0f865eb830ec +b515c78b50581e29acaa9da0fc28b7cf + + +e952176e5510b8da19ce706487cd8495 +1921a40ef2e203a9c7e33e33d8481630 + + +84c13b91d89d2ca2851e10c25a0cd166 +3afe82801f5cd602354186397efe9210 + + +d41d8cd98f00b204e9800998ecf8427e +e8e8195fe6a3dceb0cec4fd92061b213 + + +c39db402b4563497e9c7270ef5db4cc9 +7d040a1858a6f1e8b3d8e7fc68b1b008 + + +2d1bc07a8c28954534f37204c02c33f5 +a267dd6d9a787dbaa95ee81e9812a81a + + +d41d8cd98f00b204e9800998ecf8427e +90bc49dfe52d6be339781906352ddbdb +b3586b44a75323dbf02f85aea44e25db +e4d79c5376e95d08abe328aefaee064f + + +1699071ff4bb09210ac267d430c05352 +4d460db883bd693a816b29931a993917 +202fffca61e528efe134dd32a3a44c64 +9db7bfe5fec55a085d9f0dec8717479c + + +d9cb53a9d7329a35ccba6560d05ca39c + + +d41d8cd98f00b204e9800998ecf8427e + + +d41d8cd98f00b204e9800998ecf8427e +4f59d852e2d338fce7d751555bd28575 + + +cfdf29629eeab4fda683f7ce2db6e68a +cd5fd550b699c17d943e9f7758936537 + + +34afc4d66edcdb3d11f43f8b647b194c + + +d6fce7ac59cc15dc63656cdaaf69c1ec +884f200f728cff6292071327f3333432 + + +3b3a6cb8fed3de208bc9a97209fed209 +c4b52ea2075814429b8a00a486f74baf +3229eae002e5525f9b545644256aede8 +583594a72118966d0ce436acbf5ab344 + + +43681ad608774f61647ec0434bd85c64 + + +8f950f0c02a403cf239f8e47bafdbbcf +69dcd2d08e96bfa3e71b39599c8754ed +3dc697d1a8e9f73211e05cdbef38aa7a + + +1aaa761fff1db6880a873b2f7aba4769 +73b7987dbc53760d356ad398d8f31a6b +ffcd5053589c705062adeade31ce92f6 +68dc3ea2cd9c6508a925df50fa011221 +95444b95d6bfbb4cc05bddb1fd2d430b +deac83a4c0eda829eedb0f9136a1fae5 + + +7fa9d59225434bed8ab7ef3b0029196f +d41d8cd98f00b204e9800998ecf8427e +40c6a164893bb4a6899924c2558d9b6d +d77310df72aecda03de0c4d699e625af +0a7b8a890ee9b9e9bab0cab59c3b1277 + + +d41d8cd98f00b204e9800998ecf8427e + + +d41d8cd98f00b204e9800998ecf8427e +d53398a9064775d5bf1ad2da53a497b7 +0b343f1d661d5fa75128c811b7bd4459 +202aaf44cfdb9de3f06ecbb91eefa350 + + +289d9a2960e260c7d015dd62c7d4cba7 + + +8065b49ccd1472dffa312f300db8f9ed + + +cca240d50ec70f59404618dff59c354a +d41d8cd98f00b204e9800998ecf8427e + + +5d5efc37b691550abec45b0f303a8133 +866c20b40a82e12f5dfc6167586cdf5c +836fcb1eded545bbd9a2baeec41a4f62 +9415a071a1be518bfc801462984551d4 +62577ca41ec0a0923ac3a9b49cad36da + + +d41d8cd98f00b204e9800998ecf8427e + + +72827a746bfa3eb7431e69e0320e2608 +d41d8cd98f00b204e9800998ecf8427e +1cb6fc6314f828721499b5e5b7724ece +fb0a52c0f6e12945e2d1ea322e8e6652 +5c2c1f531987e5f9b5c35e05a953a309 +4f82208e0ebd681ce990d0da9153f7e5 +f27eb8254d7b1596f0bb8d0ec006be2d +3725c8c2c95cc8ce3148b249ddbc0866 +03e176252b8e5f80587e2d83e15911e8 +5e9d738becb2303ff019772b11a2c339 +dc6576493f80c2b1f45a11699c2dfc10 + + +d41d8cd98f00b204e9800998ecf8427e +1d48668ee19bae12bf58347357fd9a7d +e7ed09f884287afaf9411f78d8a625ce +5e13f22e6a67673acf02acde188a66ae +b507fea3f2bce3c80a2dc2724f8742b5 + + +d41d8cd98f00b204e9800998ecf8427e +7688c102038277d13cef57d81e6dc45c +e50a2b68928dd49c7a5472f36ceee6db +7fba20d7d9af0b9ffbc9b96fe7700689 +bbe44bcb153a4d179a62233f871f1d7a + + +bda3f6f14b6ef2f298a116a9e5e4de47 +d41d8cd98f00b204e9800998ecf8427e +14cf870bc89190b003d4b67d08399a82 +9b4cf41fd9e3065e1849aff895a0999d +b9866ad3e2a12514c3062cf74a711f6e +3b29a33fb5f50c27d39d0645b1d1d96b + + +d41d8cd98f00b204e9800998ecf8427e +3477c7fa74309e4d0519d696663df65a +281d687c04e74253d98b998733b08152 +df651b36e5b7209623d21da1fc2dd395 +4aa230c3bde0dac55d4019cd436b5d81 + + +7d171089060ea808e0135ee422ba1289 + + +d41d8cd98f00b204e9800998ecf8427e +87a15a164f064663c4d567a67b877a14 + + +d41d8cd98f00b204e9800998ecf8427e +51b4e94e74766a82470e5ff6c5753cea + + +3d863d079d9ebd0a4d6450acbed047f3 + + +68ef70376e6452b0db41d188de3e7309 +d41d8cd98f00b204e9800998ecf8427e +583e353c57d884970f1753605d7ab749 +bc584ec274c28d5fd6bc06909523cb8d + + +447dafbb6d90617a37c7f8e9038d2d45 +5d709c9a142b17a1cd1439197ac62ff2 + + +e01dc79eab31ca899f8bd155d989482e +9946885ee4e9044e9a3fab8e6bf4f0c1 +8574e2c0ea7292d815892d241b029a73 + + +0529ddc77e8c681c33c47b9b7687e810 +faa2eda13c5607ace72e34e9c0966a0c +b704dae630c7215138b1f90caf77b450 +285e61a9ffd5231adede10df1871ab5d +714867efd7c071524ee3b0b4667a3ddd +9477e6a93b94cf81c26b5cbcd7f7fd67 + + +d41d8cd98f00b204e9800998ecf8427e +d2d4f3c4b03e226a2ae751d35adc84c7 +f60aa8f7e04400f4af3bab2ea21f3383 + + +9ad62e69014ff23f232dcc43859b6018 +c741e135218d1dbfbcc03a6a4e0271a9 +1960bfd361ca2e7b2582c1633c35b0a3 +07fe07a999542e322404d77a30264169 +18296a04b5d36082d8afca4e449f1ee6 +87f5b2af13b175d47eca8a33bcc68005 +43cc87a6b84afe612af178e9c0945279 + + +e5cd7d817cbfe8c2b5e4f92a892c2de7 + + +9d267f46db9b35ccdf464db22f7a8726 +d39d87a7d8c4163f2f30706cbda22c07 + + +d41d8cd98f00b204e9800998ecf8427e +fd40df0494061d527d1fc1ac4e42cf6f +ed84c415bafb8d11fbc3bd0dde0e5408 + + +b9825fdcf1aa4eb465d00b452acda080 +1d8a8c14f623c3db37a02c7eccda33ec +b907ebcc9f13aa52a6089f8a3e27a8ef + + +602da82cec31cf5a062cedd8ffdb0d9d + + +17e25907696911e40f93dcbef8297b0e +fc343f95c06d15588c922ad8f32d2b2d +d160d6becd2eb7392c9c0383ef3d1970 + + +d41d8cd98f00b204e9800998ecf8427e +826ccffcb07667e711bd3bec250c0018 + + +1a97a7e775584459210363a2a86acb44 + + +d41d8cd98f00b204e9800998ecf8427e +e346aba359cfe22287fc4e2d6c0da1dd + + +105834a4e145cd3717f34d795ed01677 +b12538bcd742e439ce6edd7afab19a45 + + +8c7c756f1961be336a5783d4c841145c +543fe99f0aeb0e9aa7241f30fddffb16 +307fd9cd4c14821468bd0b132a661e17 + + +6f745fb918c6b5d413a7de84c6e54521 +604e7f25ffbe27eebced54943e61beeb +bde48870137975f1fc5bc2f00cd6b551 + + +d41d8cd98f00b204e9800998ecf8427e +7bd2acd718a001933d1b9723411d4371 +6288df74fb85f7c954c18bf614aafcd3 +845e63a81a5b8edfa079c2fec094d6e1 + + +55cc97fa2026cc42b4771d975b45fedb +5917f7c3e28d25a68162575e72ee573b +4a23c4ca3dd9fed9e8b50377c8d477cc +509e5252fcbe2ceaf3da874d2b277861 +4c1216c586a413cba81e46333c1cf23d +2a43f612f1f28c229bd6e9768baf8c27 +4a080fe78053666d2b23fd4759e3af18 +a1033167badb7ecff1c5e71c21e0b7b1 +74c7d3f5175296a3a243b76a7e6c640a +d014f101c786925b6d34dbaed4953c83 + + +d41d8cd98f00b204e9800998ecf8427e +2fdff73e41250121b1ab8849901e0cef + + +af24157e703b5a70015f532d554711e2 + + +d41d8cd98f00b204e9800998ecf8427e +cbf93873197cf6bdd0e36cd66d2a87c8 +86da383df93404580615782f4265bcb8 + + +2758f3882de560e1d11d208959c0627e +e40683c017da1b90fbef6b4df53a501a +696135365bfc6df15c7363f284f1023e + + +b0853ae9c443c345ecebcf3a9d53e9e2 +c585ad6e9c12a1f93a454046f42aeb19 +aa9359a83ab46ec261a694986c900461 +56d1e0d53151eb953d2fe37604f540a8 + + +19ff8a52a9056fbaf0fcf50bd50ebe48 +664212857d2e3d234fc5af9e30bf78c3 + + +ab88360e0141e3ddb3c8be3ee745008b +099c61f85742fec38c0e6fedff80d7eb +f15cbc07a79882808b31c59831725260 +2f76a335578ef4412e9b3b4a222ccb08 +6fe5e34cc37004b4342377afa27fe78e +65306d3a5faf1ede100f0b433e707aa9 + + +d41d8cd98f00b204e9800998ecf8427e +5baae840658acdb066b3294b07d6ed63 +e2e322bda8e0a19f571796b5ca46a266 + + +87ab6c05827eaa2db8236ca2c0262ead +04e84d93b6851156225d86b33bc68056 +748fa3c47dca5861db4a736455d0f981 +762d623e34cb8c1d8b575801543027c8 +e99a525c7011b5cc748b27040716cfd1 +abcdf41603da0d617bee025c713adb41 +c7c981cbe885fadb6853ac3250aab799 +b9a967a29731ccf78b3693d680e3790a +848ba012f7bb08ead96269cac742157a +ccf2ea9b4262741181a0cff7c620146c + + +cc9dfb6056adbdcf46540758d67979d7 + + +e854307851ae766249ef55a1552a2c6a + + +3f31801db3d9e624f653a75448637560 + + +d41d8cd98f00b204e9800998ecf8427e +a6120adc19e0358a5e7be74b2ab341b8 + + +e099425ed1f339312a9cde737d9e645a + + +2cc99d72a8dbaa097c6e563b127bdad8 +d41d8cd98f00b204e9800998ecf8427e +76e6aec3a1262b7b199fd88ae651d049 + + +1d00dfe3dd378ed263a943b10148ffb6 + + +479aca46b8b848649e96c290319deff5 + + +675f04e532731cb5e0cdf17648ad095f +d41d8cd98f00b204e9800998ecf8427e + + +2c2799657fafc999e86d3a9823d9061c +59fd86d4a02ed3f788a6f32ca94b4fd5 +70fb06ff7fb7e61644e7852213c00dec + + +1da2f789f3450fc4af6002b84d30706b +d41d8cd98f00b204e9800998ecf8427e + + +d41d8cd98f00b204e9800998ecf8427e +4c3fefbce8919598e7f04618a3e54ea2 + + +03f893c7c0667770a66ed0fd11f1a710 +d41d8cd98f00b204e9800998ecf8427e +0d39677613072296fbda7f35c0ed9d70 + + +d60fa512ab394825284751728195161c + + +626bde3a24da0abdd179e086c615bf32 +cf7beba0674c611eca3eb40103a9d56d + + +c61793fa62504e540c4c08fc387776f1 +d41d8cd98f00b204e9800998ecf8427e +cf3df8807edf32bdf31d3d0d148cba77 +d93f9826f6e8ef4bc66e8a92ae30020e +6d0f156645b7ce84c269ff3adb915803 + + +6017a8fd4e63cc43cf24ab91886c991e +289aeb68be3c5ff2a4cdd57a64257b8e +31431bfb5d4f361b35887e63a0099655 +55b6fa30dfd9b7ddbcf58cbcc1202902 +b5bf892046658e477a3d43a7ddf70daf +9f9938cb9fcea9544c62ae041158c44e + + +62ae9bf64fe11f60d5244ea2fd0ed4ec +3b4b2f05247661a59fb447dd6572ddb9 + + +d5f05bdf9580ca4481bf1cc03d37f406 +d04b744c744cbe623194c2b644636543 +c156383280c428c267a095bf0befc7a5 +831e6575098342dfa342551494097a24 + + +062c91c56e9a1aacf0045ba9ef2d295c + + +d6d047f9389cde6f11b9175ffda432ac + + +a60005bc1ec9d7d32bd3f20f41d3a5ad +1351e4de8c5ad72c9a1c29c2d0ac9e19 + + +cb26417ed98d172fa1fd331e1985d799 + + +595e93e44d846e5411686b4a0e74cbfb +946760ff06abcff5d8863b1e782893f5 +2908a5c020820d6384f85a8161ec5626 + + +d41d8cd98f00b204e9800998ecf8427e +3fbbec362765a7d6cdb8c0be9d9cdc21 + + +40fd56dcbfd9c50fa9735dbc0306e054 +91cf8da547bb0f98e54e75f2d21507f5 +1cc5902f4c6ee1798813175f9e19bd79 + + +88d1c17e50db3f7e9ba44f6b39c3541f +0d3c61fe782083a1c8e4de41caba7e91 +fc9bde4001ef44e613b445c76a5a806c + + +d41d8cd98f00b204e9800998ecf8427e +589b43d3f852eb2abbdadc7a7cfbb7f3 + + +dc8830ebc56b46f47b078a25cd929e1f +af528677086b2c26806ac47af95d9d9d + + +fa82bbcd66e5d31ac2f43c52caaa4acc + + +d41d8cd98f00b204e9800998ecf8427e + + +d41d8cd98f00b204e9800998ecf8427e +f0f8a0a6fb32f39b9b9f40199670371f + + +d41d8cd98f00b204e9800998ecf8427e +11827393335516b52bd9a8644ec0314e + + +d41d8cd98f00b204e9800998ecf8427e +006da78b11f7babb89e930b835695263 + + +d41d8cd98f00b204e9800998ecf8427e + + +d41d8cd98f00b204e9800998ecf8427e +c6bdcb7ce83891f04c87e2ffa5f9f5e1 + + +318ba51c0457714cf1b5861400a96e22 + + +d41d8cd98f00b204e9800998ecf8427e +8be23d776c1495d2c25270d31f043b15 +fde1dac27ff95323136138883a8cb086 + + +020e671dfeaf92176c35766720c2b8ec + + +d41d8cd98f00b204e9800998ecf8427e +917a8778ebdc3580c03a29025a0cd12c + + +82c81d64fd67aa3de6e67fd588729f3f +09e73babbd467f0a02e6cd799bf04974 +007b8d828ec11856ef22bad7fde0dfd3 +0dac5348ea6d6e03298409b873de2e24 + + +d41d8cd98f00b204e9800998ecf8427e +b3c7a210b2be2599c7fe2af126eeb062 +994337d7c14c76b4537aa2e748b48729 +b77816831ef40cf1b79779e1ada51d8e +1b526413dd24dc7b5d6910cf07f3aa1a +319b65909579d3ec171265423a48e35e +d6a0e0fc84f08a62d144e63ccd0f798d + + +fe62c00b682dd677dbca4764d5f0fe97 +bfe225a7a6f3dd1d398994dead8172eb + + +d41d8cd98f00b204e9800998ecf8427e + + +d41d8cd98f00b204e9800998ecf8427e +307e28d0231a9721828afbab06739222 + + +21055e6d625cd5dc3e805ededd1f350a +bcc15386db16f0050d01b4d80fe68dbd +d77e4af5d17f15fdfd920ec8fda7fc45 +95559609c47c88b112952073fb77410e +b79674bb1410c34f6428a0e392318740 +ee9a71add932db04def7fb3a6d8af20f +375c1191868677d9d32910ecceef8248 +2accac2e7486bca7a2d57f646974d54e + + +e2605c19e2029efa999dc98306e5a834 +98b0d3cc2035770083a37dbfbb7ba640 + + +76698169fea8c817165cec07292a4d60 + + +d41d8cd98f00b204e9800998ecf8427e +5e5c108e72c655d02259b64195f74a75 + + +ea1a3bd45013d291cafdce135ebbd13c +c78c359e1ac036fa9a991e635efbfac5 +221d0b581479c434f039e58da4718a8d +a6f5b10b14e766e788351b506b6f6024 +48ac89c72e2794fbcbb1078e0fe7d9ba +9423e6de63cf281df2bcda0892da0a88 +c8506bcf84839f36e61a555912e7c31c +2e5082f8e6d7976945c0e8e951d5f261 + + +79fb102cf00e5bf2a76cf1330fb51577 + + +d41d8cd98f00b204e9800998ecf8427e +445d21689c1142b2c98614e296c15fc3 + + +d41d8cd98f00b204e9800998ecf8427e +0e991faf2e0d897954ea76c55190b9df +5a28912aca5195e4ee88a965292421ab + + +3f5993acb1427876c4ca8913cddc9174 + + +d41d8cd98f00b204e9800998ecf8427e +07d2097f5a71a50b264d0b8454c2280d + + +2bb25c5563c0f23357ab8023a08c7dca +e382c60e94762914d4451eefa38fcdb7 + + +7cb2ad4d3c377ac9ad46e3e80c4b2c75 + + +bef639ba5d15fbe93aa7df26bf6c3a70 +32160cab79f75fc38ed26bb590037169 +d00dcd6a42cd0d91cbd5639c56a4b6a7 +008656d6620cb1ef43935edc30fd2994 + + +7ab5486f4cec78b1c4d93a1df0d83b51 + + +8b9453a22ca4ec5cd5f504b0f3338238 +d41d8cd98f00b204e9800998ecf8427e +0e3fff0ddbce47ecce252c82a6e02fa7 + + +f47f735ec8627b7b3e9ce6a5e1643d4c +fff5ddf9542281c2d2568153781b4c73 +16e1a29a5b79d4a3668b3a71ca3d86df +992dde85a7ee2f81661fd7a54abf7f89 +78a3befa9a3a9bdb40420e432352250b +a42439ac674abe10958f58d747f7cde0 + + +d41d8cd98f00b204e9800998ecf8427e +0f24a63c207b78287d7ca008cde2db97 +7bacd7312e900d8a02f452305d1eef14 + + +ebf04ef741c57a95bd3dea65a55704e9 +89de9fce3150d048f17e6048b90875de +7966fd3f84f7f71721764ead89db7eef +f2a9ae7cf26359de1759e68bd733c67f +a4596770c270b224727cd33f4704c7b5 +6ca06b02bff35d86be76ffce63c771a3 + + +3d8c8b3c771ab778c0b6a80b94b0116d +5469cbf0a4979c5748c7cb74336b61d2 +fdcbf9eb91ebef8c251c7ae7d0f74b18 +715fe9569ea1c14a9429bda25614cb8c +684ecc4df76ea5f854393b91fc97d51a +ca46a3b415ed7087ebd20ea11c9a376e + + +801dededcff0010eda5c68783293b665 +9b88489c5cb23c01cb49c1a882b3e6b8 +af5b933e2c38b422e297b175feafbfe7 +f7b0af87d9207b59379e180aa3be5107 +4c1df2c93f8bea9b0f314b093d383c93 +458d70e686a207a21618c43bb1b9779a +0678a8411ed29d5b8297ecc8b0419437 +37e6c064751c71cd82a008eeaa428389 +8b55a317006eb2e75bcfdec7a0f03134 +edc2555b237dbc9aae4679971b8b424b +73ef86c6047194a43a152f48099642f1 +7a3a40afaa184399b3341c8d3752ec7f +7facb92bcf34048a14d168838b7f80e6 +2bd7816e37190fd3452622202ccb6be6 +f0611d137ba7872878a1ad6b6985ae2b +6aaf77a113368a8a09fe2586abc98459 +d3328f22bef875e75fcc41b404ce8460 +0a5c40d34cc8023d7d32ead997fad057 +01edf46ab8cc0796e5dafd51f645d229 +7353c73dcba6a3beb03620ccb68802b3 +fd12aa1cb525582c59d5e2bf0797cf29 +d64c67ad98d5cc3c5136298f715b13f4 +c3fb35dd0fefe93bbf0dfd8976709bb7 +e22f001a43b558ee15fc2bd56a3b1e26 +a7d9e22d7ff36c1da81e13bbfa449cd2 +9d94a90161657e4a6a6cbe94c7c22e89 +459a9508eb6538bbf7fbdf224bcd4e3f +6ff052e55a1d1827e5d79b2899ed3057 +b7f38fe9df82f9bfdeb39d490bcf2273 +a41809298a3eb22c0a024f66b2f2520b +d5126823e954af0a43d506605cde43bd +94fdb8c48a6e469af0a7f8f20f33ea4f +1ff59633773f6bfb4dfdcc413018166b +aa467be31b2f50dbd9fbd3c5bd9b8b3b +afab86bd75994dd422cde6c39712e684 +9ea4d03b7e1c1b5486f6e6a6c51c43b5 +ddee3ff7a1d361d4d0ab3605669c10b1 +cee521aae0dff1ed9b575aa792b3683b +0b811b8a0f1113a872111a69e771d294 +ab1bb9d3855f406b678b18704ee188bd +1194ae8b155ccc5d1bd3de39e4f02643 +1887a8aa9bf2a6baea0a5c07c4f45614 +3aad9f2326dadabbb17a4c898f55cb7a +aa3dd95196d0ec83718e74c22d0a0da3 +e2e3cd92d8221808b6348ea0dce50716 +2b89db2c940374d7c69527633eb17a27 +8b3dec78b853fcf28e9d82e991bf9a9f +37c8cf292316d659b712e3e792776e3f +64f7b62adcd9dfe00379cf6fb07da0a0 +c645a6250b74b54324da8f44dd996042 +7c72c5d8ca3ba58cabe89b42769bdcde +2aa36b169dd5033cbfcafa4437109e53 +2f1dacaf90694890aa69ed02db1cfd0c +e9e437b0e54d0b0f215555a8a0aa3691 +ed3b811dbf2f5f0da999aac45470a2eb + + +277b0af8103ac5f600cf95f5d525cf8c +36d8c10a2ce5713bc959bebc6b9bb3af +7575aaa5cb1c801db431e3d7d6b4446f +e550661f181c2a1cf9f1a6717942e90d +28073f574e86f78328641803546c28b1 +e5dd6b1b358e3272090f1048086a5bc6 +30146d788fb36f38cf9bb7c9cc2fa45a +626a134bad2e9f8a862220c32e2ab416 +f73b1da5514876526feca98957b769a0 +8e49cc0daead5830960facb5ea2b5281 +e1161971bb06488cabe9066c8e827741 +20bc209548a48b3c27a03ca806196327 +34e1c37fb13396cfd00099eb82a819cd +6f51fc0d3af07819e5829d6ad6e02d04 +4df936634ee1c5ac60537708419854c2 +abdc5b264864f9054c2bd3582aa7f290 +55524e29fcf3ea59269779097753c3ae +01edf46ab8cc0796e5dafd51f645d229 +7353c73dcba6a3beb03620ccb68802b3 +0e9467229e826166f553c1274746cfac +c98de14aa386285d059b14a65f94277e +97af8c6ef82a0f244fc815e6e16ccf90 +ef16cb08bd0f3ad2c442ce05a55328a3 +42d457fdac3acd77c0a324361820c298 +36d3538ff1c7f12c2bb0a4d9d102e0f6 +171adcd57eecc43d8ebea5bd3cff21dc +72250ac3aec56486761a3340d5c292de +bba14bbbda547b0bd1750fc47d66193a +ebd2cc37ecf6d07bcf09d8be25a54cb6 +a6a7e62112de7f893f377bf4d5cc7ae3 +0cf82703e6c6d783ea91a4605ac528db +d6463f576eb9b6827cb151c7ab651790 +66553924d038ec668ca5b46d255e7e0a +93d774d6b836aefe17651d661cb94ee4 +af05a1fe3715626ba296c555d800b2a6 +7edc2579a44cf11a6590b6a56de20751 +b15ae44116433535141362a3b730b45f +9bc9627697f6507eaac340ce462ea48f +72ab7f6acfbe2a0482f1815b71969222 +c9d5cadd5b283418c5aa85203a74aa2b +8f10ac953936bc4623f3d41580bf8473 +faa2995204f2d7fa690071468d5cca0b +4c3b11586abcc5df7e395609ee7131be +45bc4e783f1c8f3b4cc8887ff320ac8a +94071a967896cb76ec03034a3c0021bc +a3b41a323ed11ea41894550e79a6198d +37c8cf292316d659b712e3e792776e3f +8d88a14352d5c7b05f212dbec4eb1f25 +2ef522d6cc1c739ac79ed1a20ba843c9 +61bfc817d2b654aaf31d48b07ba0fef3 +bca0b3e6712fa4c12923b2fb07e3f46b +639806e9dccf7a901582d3909a16c68a +e9e437b0e54d0b0f215555a8a0aa3691 +cc7cb55fcd10093b51653f527584159b + + +f8b7c904f5476cf5519f9c87f9bde6b5 +f8f33045b76d228fbbd1f3431fa3779f +974acfa15f73f607a0f4c34cc5f54b43 +af5b09289e634577a1a228725bfa6855 +6e9a688096ef98348c81a27d4a79f1e0 +4c8b9a119834f5802ac02f8bab914bf3 +2a2a453e6e536c61788f5ca14441925f +6b68f856bb848eecbabf671c034a55c2 +d0a6b786bd6f4089500e5ce4b5823164 + + +071a3ee176d252b170c161a00272700e +737685ba123e361bbd63da12001d1853 +261d2325e97f1947dfa1715cba5d739a +aefc559232e19c9b1c24aada36d13944 +9b0318dbcf0f27edb2511461b2bba071 +6453cb1090676cad038531e097bb5389 +c3646e03f2df786dfa2ec31ee3ab80d2 +06d37e1e8b0a905c10c67cfc352a3b41 +8f06a045e1f9439c132eab7b0ec1013d +fbb442be183b6171ba2aa760e37e2990 +e1161971bb06488cabe9066c8e827741 +5c8304d15cf5e937417b4a584e9b3760 +ab35e946907310d95b8bfb3745604400 +d3b1b0f4d1358656e7e2960e749fab1b +aeeb81c897bd44557e92f5205eadf9c8 +d24bf4b9a4393542069015b77065f59d +2c3c0e44d963da70631ef5845245c361 +01edf46ab8cc0796e5dafd51f645d229 +7353c73dcba6a3beb03620ccb68802b3 +672cbf05c892245a778a1478d6abf6e4 +6b5e849f3d43ef3fef1ac53d781febda +a1314605a33f143e8730909f6688403c +57c33544439cfabb45532ea670afb002 +1baa54f74183b5589cc0eb4e19bab976 +4155fad171a9e5ef17663b83b38b0400 +bbf6109af99a85f4492dd98a94a6f7b2 +8619d6f678b5c35f529442dc6240d6f8 +d819c152ecb177c120f1e3c9eaabc2c6 +de0566221f5134a643eb1ee0e4e40d5a +a8174bf1f86230ba7afb78aad699c4e2 +8dd366d96e74d9675892df3399191503 +b64a703248595261d97b96416e8fe66b +7df666dbdfe89fcd5bd9547cbfb9b981 +a631db566a79774fd71e1e4733990636 +59028d068b1ae9dfb8c12b1e005f607f +d3fb1b726d230cd1d7bbf2f47d3e95cd +c6aa5d300ad94789a9f2c4cabc6cd8de +f5e9da89cf45e535117232b359317405 +29340550ee1de8205f4ce8698f5b7401 +eff46a7ef7fe0f9948f9b1ccc306e52d +a8702e6efb19edbd4e34275d803b7ff0 +ca74892ab17898b5c68a005ec826680c +1d7a55d13ebc889af056ef71120d26ec +0b789429faca1afa1608764e198e08a2 +b99f23c57218db693329dea5e53bdaca +1173ae5f768e9451b438fa9abe518d81 +37c8cf292316d659b712e3e792776e3f +c365dd9338d9be33d005483b108ed0f9 +607d3bb04543ec6ac54ca7fb097be17c +61bfc817d2b654aaf31d48b07ba0fef3 +f1f41f8ed3c32b97e30ceb1a9f2de2a6 +7230de6d9826ad0e0877a1f4f86cc181 +e9e437b0e54d0b0f215555a8a0aa3691 +cdfa3838283c176556fd986e1d077a37 + + +571f14e856b08e7dfbc7252be9a2dbee +c9310d0a5a4f7e1f6b85201c0dc2fc5e +7883b003313ff4acf806158e7821e206 +a2e506c143037c5bb6add7d49bebc772 +582d3840b57ac01071e79b054ec3443b +8991edb708de7a411b42d99147475b40 +83390246a5a15a70c0115927b6ce6392 +d34fda783a6fc6820896dc90f1a5c0e2 +536d1e5fc0c0db495a44906b959abe87 +689b03714c6aca65c47031f4da01ab2d +86b10d96c3a969dbf3a625859ee245fe +e57926cda04d8b129ade51ccaa0647d6 +700573e20f246b9d31d1484172c6253f +a056b5b1b9e60d4566ccd0ef2aa73a03 +c0a56352bc124341ab96489d00a5167b +f8e9d0e2f7ca86f855a1fe6a39eab4d1 +47f5569a8bf751eaa70fa105edd2293c +ae825bd177c0c93c475c0ec7d9d6aecb +7a75cd5ac5590263657b0fe81c2e9686 +989a0abb9001a25c1ecdbe3fa083e001 +7b99c6b195af997027c07bd9348c7b1c +4bfee5904f91bea7f89e69b65d84edef +a2e1832c57b19513176a741530684c87 +b862f2f6c8261be10f3c18faff22fd22 +1f80e739843212120c61324f88ac8b0b +ece08cb7ed6810cdb3f0c1c917ec986c +415710f6d8f8caa5326a56688a20f3f3 +7f1cf10b121b601826c8160b97d9201a +811d2f2fabf672d37861d4cda118784e +102163267365402aa9b5bc6f2c5d163d +22aa8d4af78e8c2cf1a2c578b1a32607 +2c8bcfd130f75c11098a1a143e256dc5 +53edf5b4cd1685a65cad0836a910d044 +bf1409395306f2b2924a67beac05dd56 +714f717823a5c35cbf5be6a60dc600bf +df4d1d873a80aea2f31d76b818e366fd +e0a2135bf8ba78d71c0162491021d9bb +ae2a39ed84e9a8b31e97d34efd50bf79 +665469b73e3a416dc601213cb4e8b9e1 +cac02982af1a016e225fba5f78dbaf9d +716392958d58abff5ff2b04aa8a3c256 +b057ed88c68f66ceb4fc3f7c4ad8e61e +2ba914ba1f287a51e96117c8734d0370 +98035fec612b1dea0f11fa299377d2bd +a84a45468793af4fd1090872ee93d0f7 +560ad01d1554b6347a51e2341c05fc9c +599dc37a15c362ea63096dfbf7f57bf1 +0ad294e13b73e36581d61c6c7ab7c712 +372bc71f7dc03daee0e49d8599e4ff4f +2f5aa1a7a5d62c667da6954402e22796 +254fe8bf07d0ce1583e99261f873a52a +72811bdfd0ece6be95ca95d087084c00 +639ec4b2d4e24fc69f96928831a2f9e8 +98e1082970a865bf1264472c0367b2ea + + +8132df66fd38270c43de7d9a97ae5ec1 +b0532613e4b25e1451fd0d40c4026b74 +c46178f7d6d683783ef1a6a9c4464c58 + + +097c39ff445ff49f14e4e7aebb2cd990 +c4000c3a5f961950001bdbf0eada3ea1 +88d5cb60dbe10ed6fa96e68b6edb6918 +e27a20dfdc6f5fd27bb498a0ccb6a355 +29ad231222dee6ac3012844d12f578aa +98e71577877984bd41f18fc1b640068e +f3dc7bbde140ac9260f4aabe219e874c +c75c6cded8ea2c764ac158c3d233cb3b +0bf4d5e2e2dc108c9d7bf4709c95c1c1 +8f4b79b39959181ea70b9c231bb9ddbe +a4f7de71fffb7fe66bbe1ead04e43890 +f8a9ee9349754eca7dd8fa4a3b30923c +7b0e15f3fe86826a144056261fdb1390 +9934607ec9f1d4a65082ed20f36eef7a +362c6615b18d54cdd83844e5bc153adb +c5a47d84317264dffb6a23b278af27e3 +426904859bbfa17b03832bb45bb04199 +19bdb34ebc6cb393aec07df216ff5065 +0d6c28195a3e67b97ba1211fbe041c49 +2bad6855dcaaf4b18c3c92f32d94893f +2c2fcf84edca5a188faa53a08c2ccb35 +20f45c49e3159e93486848672ee4650b +d2eecb1e8e4fb988dda81bbeb97746c2 +506035c575faffff4df76ac0cbd0e672 +d06039f65616165ceb95e9a140e017e8 +318fe97b75c67ca76a381dcb2fa8c235 +dba59ec36d373ca112d6392ad83b0006 +5c10d604a0e4afa89950b5c8ea4e682f +e9ad12e8ccc33746292e9e23f1b8f140 +7be23572a2abd91a63b7b0164215557b +1c1fc0e217e32c5e5f6b7288e162a651 +62dd799f728e0b9780bf13b3994e0b36 +356004b343737cb05194e021dcc61caa +de6049d388af2f4e8eb601b34c636ad5 +2a5e5c20e225efad5f6b841ad0847617 +349e9aa9ebc8c00330015e3e81b93df8 +bc51599a08ae4696329d8c96cbff6cf3 +02117a18e23e6d3fa6af33209fb0e6b4 +491fa67114d3c382ca11c8beda1d2481 +9fe0cffb3ac84e5b1b7b79e2951f711c +348843a224b0ab55e3d51c0ef701c55b +ff2e90b1e82d1f359b64a5b256343f6b +f135465130fca1966eae06b57a3192d7 +f0b4dcb4ff338aae365219b7c90568c9 +0495a2ce04fae425dc6a1d880ceb1dbe +f7261490003c49efcba34cb82f632fa8 +e505d0ba7060f00c05df1c7f63461965 +bd3097dcdf63e182214dda4005b47019 +470d873434141ab51cff2a3be3c688a5 +fc2d28b6431a119e3a372a4ef381ad4e +345f98a0f72eee4efeb8305a5e6b57c5 +d287970d52ccb6489601cd57b50945ad +9e1403314ef294502c325a847e94e007 +eabc62c20f3380e78359bf942b5657d1 +381fda47b3c28be5e86909a54ecf6f72 + + +b518752ccaeea156acb4450b5263c2ae +9e04b2cd1b93f421705034d5206749d8 +af56ae8f3240a1cb51bf1a10154a81ab +395e11cf3a9af41ed0012d435f5a8d88 +c93c4c89173fc683504c599a41e8c128 +57b84394f368bb400dad3591d8ceeaa8 +0178ccd0294eac78322bcfb837883e9e +81ef576837cf88973f407a18f2bc1594 +fbd7c6eb7947061e1cdb26596aa97f7e +e078e6e155aeadfdbd41beaddcb80abe +544d1e567d9c598375d0b2d08cf632a1 +771c74b2230182471812f2cf4a5b63ee +f67bbb49377ad41691a2560e5db59c8a +b8c0a0b89f697b6e2cded307c88d06b1 +df9268b2d0dc39ac9d7edf21773e98e9 +87204bb4bc4b2de9530578fce343498a +4b2f37e2efbc07cb96a3c17df7f132b4 +01edf46ab8cc0796e5dafd51f645d229 +7353c73dcba6a3beb03620ccb68802b3 +3cff0fca31b6bc15881e15137184a92e +14284138d5f94467eb25db3495ebd96d +a42be7db361dd5993f28868e4a3f358f +512699b0027618a3031685da1faf9210 +2557b24410d1fb00de290259c8102fd9 +d9e5975cb7abbf8cc23b9ae0909c1291 +7b66369f2447bf5361d9460cd162a092 +8d43131041f3d3667982ff5fa6227d1d +5f93e31d32cd99d38e3d59c80b4137ff +1c8caf0658dc96d6ef1749213e7a91b4 +de30767cf0a5d454269ab9986fce13c0 +33a07b8f1c6f7231f2a1e2d5c36dd79c +96580781af2e64271588ef6d49f05d89 +7d5368b1bee0e7367f815ebdcb1ec139 +1ca4e724a542dd90368a4612a878aa7a +74f49c52ba746096316a8fabfdd197cb +d3a94f5738d82056ea2efafb91108df5 +68633b9a396403744b2f3e762bbf5a19 +f326d01ea1f9cb89d96aafdbf65dfcf7 +2c739e0c5968cac73cc93286aa8dcd3b +8ad7dc8c62da0c98fdac28dfda1db0da +130648f855cb06b04808b8deea64caa8 +906adc49584042461b20f130732ea9e8 +3e3baa2a47af2ba7525ad71522d6ed85 +3122c8015a2583d254fbdead8e4fde52 +464e3cd1b9ccd7bb22bfdffb69ecf33b +e40e2e3fb51aa7bcb4d737a1079f7f7d +dbe76f9c3c57b312b0d6e217b9f2a1b5 +ccf43b38dc670c1a539500a2c0cb5dc0 +84db5ed2fc6ee433b8d41b731d4d5cd7 +590d0712e9890163d5f0e2899cf5ba12 +937ea10985785243f5af05fc8c2f6158 +240b11fcb5dcc2be6227a51c45701f86 +e9e437b0e54d0b0f215555a8a0aa3691 +f1f34d8c0f864daa5e8ab56801027430 + + +b7454525aa100e079c56a92ef4866283 +c3e50ad0d4c93692a2810e136ada70d7 +ab274a62d5a3a8ab5f1e745725b83dfc +c4e9cd5c18af616969894e4dceb95f97 +462f3f2edf24c9118a0a6df7f00765fa +a7f112322d606a3807c6e4eff9bf9b1f +90a76b121fb7fe4b51daad580591cc8c +ef12ff29adae2685e120e58aa04e23bc +bc8b10dd8cc1f841662dfdd87868197c +311cb7d4bf06cb181cfffb6e44ed5826 +e1161971bb06488cabe9066c8e827741 +90086ae0090269082c6221cdaff54d9c +4573107d98f6599ed40b01012378fa81 +3222e8667905ffdb07a756fa25a26bd9 +c710e46b08ef99b41b5167db96309c81 +f28164a5a95f0a8408bfa00f4a40680d +d9472c4c816f496c95e5f408e8465767 +4b2f37e2efbc07cb96a3c17df7f132b4 +8d6f552cc37b4deadd43afb4fe774baf +7353c73dcba6a3beb03620ccb68802b3 +4e26f62fce604bfd6b0735bf7c61d0e6 +4ec9196673fd4aebd525032a6b450584 +681bb6760c742ae699ed900dca34241d +983e638c62129d2eb308d63d89402654 +c59c6ceb009eb2e3c935cc90b786974e +3d3824b2934300c588713599638fbd53 +eead927af63207df007d30bbefa0bb40 +3ffecf278a6c726e6b1cef69940945ab +75fb4c310c4f0554d3ac9859d0c5b646 +e337dc8e080a86ce2e187cf3a38d0b10 +de30767cf0a5d454269ab9986fce13c0 +b84cc0bb32567be3d521af1a1d2b4cce +34be9245428cb84ae31c992eb21f33d3 +9eea13d3889d78fdbc614dea77011565 +6f3b6f771da549d8e22263e795ddecaf +818898664cd363370ff725a187fc35a0 +d3a94f5738d82056ea2efafb91108df5 +239bcb951d596b8d3481caaf19bf8fb7 +fb5913e34a812d5fdf9e25b8ca8c9fb2 +3c801db51ff672838b9306c63df460e0 +51a8ed92619d4857e0eaddd369a14b38 +a4fcafdd9412d243c46e1b55d7911f2c +5f5e1f71ef91392a3edee6cdf5e03408 +8cc192424d2a8a3a8439cf6c9e9c866d +228b0316d26bdd36e56a9158eea64ef6 +59b195fcff4d3877045fee21c364d524 +324f3b1c1afefe3296f76db472cbc9f6 +8d2578f24429a8c9863f267bd792fb16 +6ec9a9a11b06059192bcf4a71a34dd22 +a171ba167ab22bbfd25e570f28bd8483 +f0d89af2ab05f3af36e1a4edec69c7db +1a6980f79392b14b3a7e00db58f915ff +0adfdd38f6adbebe6dcf6c7a82205695 +924c656e4301df08646901c0ff6971ed + + +b518752ccaeea156acb4450b5263c2ae +c3e50ad0d4c93692a2810e136ada70d7 +af56ae8f3240a1cb51bf1a10154a81ab +a886ae14055bd6191498cf46e1e21848 +c93c4c89173fc683504c599a41e8c128 +76fca7d3f096bd5736ad5130e020c137 +0178ccd0294eac78322bcfb837883e9e +1f319794fd0c473af4105da7eb800395 +fbd7c6eb7947061e1cdb26596aa97f7e +e078e6e155aeadfdbd41beaddcb80abe +e1161971bb06488cabe9066c8e827741 +771c74b2230182471812f2cf4a5b63ee +f67bbb49377ad41691a2560e5db59c8a +b8c0a0b89f697b6e2cded307c88d06b1 +e06f49e34ab23b7a238092f0949959f4 +d976f528676688719bb4ed9da722c798 +4b2f37e2efbc07cb96a3c17df7f132b4 +01edf46ab8cc0796e5dafd51f645d229 +7353c73dcba6a3beb03620ccb68802b3 +3cff0fca31b6bc15881e15137184a92e +14284138d5f94467eb25db3495ebd96d +681bb6760c742ae699ed900dca34241d +512699b0027618a3031685da1faf9210 +f209f3bbc245afc75bf1fe1c2b74317f +d9e5975cb7abbf8cc23b9ae0909c1291 +eead927af63207df007d30bbefa0bb40 +8d43131041f3d3667982ff5fa6227d1d +5f93e31d32cd99d38e3d59c80b4137ff +6a421190f518462e8f8bfc5f22da2b75 +de30767cf0a5d454269ab9986fce13c0 +33a07b8f1c6f7231f2a1e2d5c36dd79c +96580781af2e64271588ef6d49f05d89 +7d5368b1bee0e7367f815ebdcb1ec139 +92ac14a3dd5307e6bc4429f625ac3f5b +74f49c52ba746096316a8fabfdd197cb +d3a94f5738d82056ea2efafb91108df5 +4e186ea8084c33de3fec3182f57150ec +fb5913e34a812d5fdf9e25b8ca8c9fb2 +2c739e0c5968cac73cc93286aa8dcd3b +e355739b38707e595924a2aae63d78d0 +9d20165c7fee59c3454f8e883776147a +5f5e1f71ef91392a3edee6cdf5e03408 +8cc192424d2a8a3a8439cf6c9e9c866d +228b0316d26bdd36e56a9158eea64ef6 +c95d9dd5cdb6d9a6824a6bdbefb48531 +4ddf34ed8a507480b8e987e8a56a18b3 +37c8cf292316d659b712e3e792776e3f +ccf43b38dc670c1a539500a2c0cb5dc0 +f50022077f0dd202d6e2b9f04c9e12a5 +61bfc817d2b654aaf31d48b07ba0fef3 +d303c8174006e885937802b900be3eb7 +240b11fcb5dcc2be6227a51c45701f86 +e9e437b0e54d0b0f215555a8a0aa3691 +f1f34d8c0f864daa5e8ab56801027430 + + +8adca5c485577c03e4a2cb2efccdb8ed +c33b70522a404b984b8ce226a6525842 +f6efdae4466869ca2012be4bf1e11784 +fbd2774b2f969638051b2df47561fdd2 +6749ca6f4c79b80bf7da15ec0b2a1061 +d0076eb0a01e718eb58b4736e0999165 +841d4baad5be8f3de6dd7c9051b40c34 +2439b6a6e9cfb796be84ea37c65a83cb +6969d474da7d13c1434c89cf5c9c2838 +d3626e710c760f03bdc31e17888c3c9e +39015974e9a1c6c4589591ae58a154d7 +817e3122945ecefbc4ce8abe613858b3 +3bdd5c6d2ebc67d034190fbe60edcb5c +88b1c47f0edec66b8868b6c6d8e43384 +9e236a10d22c8510bc2ef6b3da313f7a +de1cad8629dbfc98424424a6f054bac4 +0d0f009398a7487d59b485e07c6fbc73 +3ebba88a951b29597da0b2b617e9d9ed +f29ddcefb1efd8c0de5c6100187344aa +a5affc357e84c82d0cb507e7d977faad +06406c3ec4ebc8cb487ba4c093dbbf34 +2915a53bd07481deba02d6cd6f8b961c +86c9af02e6afad6b682cab386e7ea8c9 +ae7f2cfcf48b08d701a1695e12fed9e8 +7c063e261e0cec8681ade9a5dc544731 +7194e924928c65375208da2a2f5792f3 +4c9a10303debb2b3c8bc16ac22e3eeb8 +690a8b00f42150a94e4583a17975d1ca +0fc0876df57f7f77cc4ea959f60cde11 +75b6a084c92b49515b4fd151aa2c3c73 +75ee81e361ace4b02e1e3568f0719ea3 +97322d6d4c25ae45eee2eb7eadad0ce4 +19570912158afc8695c0f75def576275 +bc53374222b6d00fdad230938843f6b1 +686ec6633c3b45fa9982eb392deabb4e +8343a78522b9582417fbbb8bbb41a7e5 +354a5c3f51b7fde095f52ddc271d1763 +49bb3d81ae611eb1f8b7868143b2c6e0 +32e21134466b972be3ac1268599f9b5a +c16f269eab57f22e44a226319a318f10 +821ff4cdab2f33e5905258f8d211479f +711e83e454959e1a9adcae668fe3b0bc +3ae0051d35a74c5cb5c85db03ceca6a4 +9cd23f8d97fddad9f3408b5d5152cdcf +578c7ef90ce4f50122f14d6630079c47 +db18fa6d13acfd83d28575f83a3f395c +e74cb6bbfd2894743b0016a19a7a81ef +3226fe6588555150ef8772f1b2c1459b +3c949990d49628f0a337afe51d9777f7 +f9ed7521031b29d6f4679bed14592fa2 +ad72d84e7560d12210105da113b93784 +f10e590fd9631bd90f850e78391b5787 +8646e6f709a7dfcd525a224336e447fe +3766597a5f2202fad338cbe2d019a11c +ccd8e25db8a9a768172fcd2e45b95162 + + +c948c70c2b4c8bb924a24cce7d4686f7 +223494e86e72306be4f941b847db565a +1c6130fed29864cb803e50a64f57e8c1 +daa4f8a70b7e13c1991b8a9da448c68f +c93c4c89173fc683504c599a41e8c128 +b3f56d6a2eb46826cd2562d084ddcddb +f5fa6dbb09ad1dd809a37ec0b63e8e75 +0ad959ff84515eade55d80d902cdbae1 +fbd7c6eb7947061e1cdb26596aa97f7e +53a2102f21d7bf43ebab081a73feeeef +e1161971bb06488cabe9066c8e827741 +91d0b66ebc6f53d0c6760225f33bc0ab +db6ac20a78a21670a36ddcd802c9a82b +8fb29d938cdb4cc1ec38d55885c60bb5 +c76d9c5a0a9f881bc29850458bd6461e +c0c0cda5b564e56624844d49d7592502 +734c487d6d93236287f3a0630d59e1d5 +01edf46ab8cc0796e5dafd51f645d229 +7353c73dcba6a3beb03620ccb68802b3 +967d54ceed8feb8d6530eca8e47319e3 +14284138d5f94467eb25db3495ebd96d +3d8ba71a2cf2af3c2a9e9bda1cba64e4 +2e409823b76afae887f0cd1ef103f36b +d0e18a85d792c8e18a7f4b26aa5b228c +d9e5975cb7abbf8cc23b9ae0909c1291 +2fbda69e2a3f012225508714b51c0f89 +8d43131041f3d3667982ff5fa6227d1d +5f93e31d32cd99d38e3d59c80b4137ff +ca77e8f0feaba3291cf67e156b720b98 +2857f25afc99e3d86d2977087075989d +33a07b8f1c6f7231f2a1e2d5c36dd79c +bf4ec112c5d4979259e78a1af923da05 +29a7d47016217cc8e5aff8639d494ca3 +1ca4e724a542dd90368a4612a878aa7a +6e1185d7c47c5a7dfee00cc6cf7d12c1 +fab339dcb69a0b5f71fded661154ba34 +262b3b0bc7533232290f81311955da86 +f326d01ea1f9cb89d96aafdbf65dfcf7 +2c739e0c5968cac73cc93286aa8dcd3b +40c351e5b7ca32e0a4e4dc2054a4803a +fd96b4988a14b826d476b8b2682791e0 +16e1ea08ccc5c0175fe35a45c19a08dc +71976afc3ec5e0f9c2e3711d8261e0b4 +5dc4c70ab6811882ea50d20e2c4ea6e5 +f9f034777e38a444b4bde55bc7e37b1f +bcdb462afead49580440751a345b2ba8 +37c8cf292316d659b712e3e792776e3f +ccf43b38dc670c1a539500a2c0cb5dc0 +53369076a748560882abaa4a97e3d8c4 +61bfc817d2b654aaf31d48b07ba0fef3 +7079ebe8f20dc40ee9e54c78683fa429 +458de02f34121d8ca3c60daf22aa32b4 +4945ef66c3f2e96f728cf01953d25417 +efb80873052a0acac270873400da3e43 + + +fb4265f7f33760648e649d1afadcf377 +5e05ca65e7644db5b2d14faf197bdc10 + + +e51654e6b3079a0c55838b5e601057b1 +ab07c46fbd99585cf69935bef969c5d5 +b2d52cba7611db338fc69eacb189eb0a +5cc288214562e1f12727c115068929ad +a7cfe89216436b2b72d61ae0bda2da1e +a97399a4d3b873d7e3ccaf1a57d3d9d0 +23831d8afc12a3f506580f107fbb5fa7 +2b3bd53f98b5cdf76acd5f4e5bf590c1 +358e6df85e70619ae0a3257138848d00 +e69ed83dc84f4e7731565b3c55fb2033 +e1161971bb06488cabe9066c8e827741 +165a38a013aa22091abb78a8abab34b1 +f9e1df618bb3b98980ec43ddbdf85f3d +c3880aa348c593492809aac1bf702190 +ef31a558d4dfc09ad960918e3b3f26a3 +593a0056ee80a54a01c01c0c266034d4 +6fc34f4a50e6686080d4f43e54c3d6d7 +01edf46ab8cc0796e5dafd51f645d229 +7353c73dcba6a3beb03620ccb68802b3 +12020debc25145e5aea5b921d3bd35bb +0f4ab2ea10dbc7c437ae308fb67659e5 +8ed0c3b65f002cc1c9ee534820e5f961 +c760c229fd8d2a9edb3ccdbfb863ba6f +a95a4db66092f50a62cb2f9e6506d199 +80e0314d294411bd1f20032ad7c5cb93 +b62ebea33a09fdfd3cd7eee4ced9187a +595efe5e7ba8ea24b54358923fab3354 +311ad06ab23f03ff3440597edf1da3fc +494a07b3d89176b926979d3010d6a5e9 +62343df4aa9515883bae06774007f889 +a4f012cbadff458af0cd1657b295c219 +5befcb1cd6a2a52be8381db21f458e25 +d74031554764d1f91dc8f04e9a1c024f +15558c69fd903afd9e88439226123622 +96bea98a7fc965e90e9702ac9be08033 +aa747601d63f80f109117ee3bc96a990 +6312dc067c98595bb72d77dfcc9344b4 +95c15ca3dd5f1f6760ef60df52b6dac5 +d3d359fef6b56289205f06a85e5f45c9 +6d96a2b57a9f870c1681dc84908e77ad +db16916a971c83dded4c3b0d976d8e43 +ea54f8ac9fb2daca1b5e77987af7df75 +2c7e63fd6233af8fabc598cea968cd6b +16e0a85f28a66c9fe5ef46a42e9775cb +536398fa35f4c75fa3c3d65c98c37939 +469d2429d2209e2f46a2ec9c687e3246 +169b60e8323c73a4dfe741da1df9fc10 +fc2b5635d3332fa32d6b3814b4b6374c +307c301456fe7e741dd0cec8ad10fb49 +45de62d78c0c4b66f3663e265498dec2 +4397127d6b4a2f13e0833ae6f7058a98 +ac51c6d5a8c4551bce923e009b26650b +92ced7bb9cd9b749d9e805f8976a7aca +db1b7476ea8ce223faa772b7f66621b8 + + +f3de494a87b03cd6db09d4f8483a7618 +afaf8c79e4a90aa57382f99ed2d40f1c +8349f371a2e2d9097bced4723a9eaf31 +444d2820d5981f9f720ea7e4e08ae5bd +58dbc78a3d7f35e6123ce263f3c2bcb2 +2ce826b576519666c1879130bda4ec8e +54c1893b5e27e3345d78bac145ba272f +75d801291bfd8b682fa6eba87647eb57 +02bfe9c8f1744e69021e7f1e2ebaaf4c +1a5852f4d4002925cb7fd54937bf3a20 +e1161971bb06488cabe9066c8e827741 +6abeed47fcd585f2a32ed3a00125e753 +1594f44126856c91144ca801d38252fc +865c92f8da49ec76788260ec46483d39 +ad61c77963552f376bba351d8cf351b2 +7e2ccffaf9bf9dffea7c800c687a3a6c +e4534f9c018442d67ea08de411aac198 +01edf46ab8cc0796e5dafd51f645d229 +7353c73dcba6a3beb03620ccb68802b3 +6bd6137f9227e13c53eb1df958aefe3f +cc7ce504ebbf3f1c869b43e2a291ab49 +6373b95c48af4f71972938535912fc8a +cb73a3a2e7e141686435b9b7ec22067a +0729ac12981fdf358948ea82e6c3cb2b +9e4be8088054e25f29fd9490486059c3 +1a5e128366cf4e045d2679f34f956be9 +d50c405aee4bfe5af080cb061afd77c3 +69a140a13b73949262053829615d06ef +cd97b8dfda3edd10f62734b89289ff30 +f5ab530eb3d883a6900ac867162e452e +8518c823cbe55bea733955ab01550f89 +5150b8d59527ebc9e74ed87f3f46a237 +f16dad9be9b87ea0337457070a2a333a +d35a21763c1765d888ce5e9f7192d161 +87d324b30d4aee35c96aea613f766336 +5f90fe1cd3fcfa8948a5c614d1985e80 +2af14f6c4b858b8816b24c596aaa0888 +f326d01ea1f9cb89d96aafdbf65dfcf7 +479e94a0a2997a8b21f4360fd9ad7795 +b21434f3e86f7387b373697f21bacac4 +1bcc17e7b57fb146e43bfff515a3d9e8 +d3afd148684ee2162cd15d37ae73f583 +d9f11c2cc6a7b5929a915d7a998e925a +ef8d5f107a66b6aacb79a8a4f5d01757 +9db68f434b6113836433bb3a671e71d0 +3979c94575e56cd6509f49921b29e6ee +37c8cf292316d659b712e3e792776e3f +5d6d088a5d66ef22a67016cdafab726c +7cd78d94616577efe415d8fed3dd61ea +61bfc817d2b654aaf31d48b07ba0fef3 +f8de27562d6bc47c4b3d88cfda992908 +6f7eab4dfec30d7e589ad53e7cd3bf96 +e9e437b0e54d0b0f215555a8a0aa3691 +f249c5416780b6370b92514232af8da7 + + +7add374b6102d33ddfc0ecb8618ef11a +179fb835c4f72373484a106ee4d0ca09 +6df80db36a8139ab065ff313f8904e0e +86123aa971488d328dc82ed842715db5 +4e43d75a564806a4ed447b4e738e363c +ed6377ae8b66973d58346a732d642efe +4f7d780a21c597470d534dd0172b7f06 +11d062615e92ec655d17e5c569da8301 +43f5b491c84e1930aad9905708a4d294 +7610c304b9736f8f8ec09d1e08b26614 +97cc211d1f644d84b1c64d80857830fc +3b9eebe3fa01da100d1813d7172e5870 +35986421f26e7fe9263aa1a0220b8a41 +1364dbd1bc08297b25d2d77861ad997c +cb5c377936fc38ac4faf253ae55fd1f7 +94bb9cad9889690d55670af89e832ee8 +3e4f3f70b46a284afca9c9abdb9cda83 +bf21df5e0b05b24a5a564e5e5e60ead1 +c36fa900ef2e082506bccd1fa51eed31 +bdcac13d704caed565435868f2fd8132 +030c1ea07719cd702afc5d57b7f7046d +3080ff9fdb247eaf98b234710abdc34b +8700c93b2fbd9b9253c933ab44c5cb40 +94650657c28678a9af723da999195a1e +8528fed3a7fc90688590a041ae575e71 +4764ffa4f88e609a9404cb6a2e6beb5f +e1f6580b93af6040addf448b40de21c7 +64d4f3497d67b4e8da246b865501955a +6b865a60dab5e0cb1e49ac13e6e94b66 +bde1ccc10056a34c0c2c33b4909bd33e +41079c0dfcb430b62e712ef426ab0d66 +0003ea4f9dff322501b983baa95d1552 +2abbf6168bc4fd809a7e773db8ee2b1b +3ab25479398b7ddda72e2f2094b5a453 +f5cd3678ffaa97ffd79f44ecf11c77b1 +59c8a8cfce22f05267fc3a23a5a1438e +3533fdfc61408e851bdb68653ea870f0 +ac3af87ad173e577196c12e2fbc6eeb9 +ed906322b4edfef7d01d7a60df295e29 +5bfd4193bfb0fcdd301fb1a918af7f90 +ed7500c42c6ee6f2a4f8bd36aa6bc42b +d27472f5adfab0a1bc7265aba3535046 +04116a7f8e902da1f3391a34649ccf5f +8f8b08ea0127e8dd80c06c9e79896a61 +d5f04bbafc19b4c2ca7df2bbd29c44d3 +4681f0150b8cd3b70326d2402b157dd3 +b43766d46c0c896da22215c352d0620c +74e42985dec595aa8c7c25c2681669ad +3d34aa8e561ca7f64372272f16e24403 +6e5dadac3fd4d20d8dca800b686a8d51 +9794247d9b70ca2a7154bdd109b6a0b4 +b4e3aab133abb5b8eb77a166b48829a2 +1211544b56769071089689f4b09e07c8 +6c1987133f9ff41562c17276f703beda + + +0bdf6b42692e8b2c35bafb51bc5db192 +39e7555c0678b99df4f0de459271b3fc +58249aebcf5329d979caf44339ac5651 +6420292db0698d7cd9820ec3b7724d2a +c390d1ffabde61a27b78eb96558aa125 +72a8fd75f8252a1d045e76c1fc779964 +5edfdde675195be848e98a2f751ae78c + + +e7d2b1b771b97c29b58dfa5198728a31 +055d1c1ecd19be7fe0fc879d5b9e3920 +af56ae8f3240a1cb51bf1a10154a81ab +d639b227faa8071af89b557c1d98ef77 +ea2d9fcd5768ad6ee88813587938fbbf +7bc0673cb5fca10a3743bcb85645747f +fef14ea7e30b02f47e4558d6e763464f +040a7ac7d5c37078a568ea5bb7d4e0f7 +38c1d984b6b2672beac82bf09ff21aad +591333b057f19dbfd48b0dbe6f25b5f3 +e1161971bb06488cabe9066c8e827741 +8574d8f49cf38cc991d611b4709104cf +7d419c3258737adad7db81820a0319a1 +c7a75fdaa79112ec01f52b61a63e345a +37dd5167c0c69730967fa2fe247c9b58 +f6a494807c8bd81146bf7308b9e74507 +e7c6ee7a9cd603a016d8a95b082e7263 +01edf46ab8cc0796e5dafd51f645d229 +7353c73dcba6a3beb03620ccb68802b3 +6e957be32fb81e15d2ae1a2a9e5ba0b6 +14284138d5f94467eb25db3495ebd96d +a42be7db361dd5993f28868e4a3f358f +1b94553ec0be2a1cda52f2a441da2937 +b5ef631067ddb4adea1a7f883a8395ca +d9e5975cb7abbf8cc23b9ae0909c1291 +7bc61a1f1daf334bc893dd1f0b05ca37 +a0ff1824daa098e74d326f5327b938e0 +5f93e31d32cd99d38e3d59c80b4137ff +1064df1f6a184ea1f1a53a50e9dba316 +efe666263ece3d65976cd1d5a432e071 +33a07b8f1c6f7231f2a1e2d5c36dd79c +5a2621103cb59d37db5658c1879b4766 +60c44a04ad95660ec00fe9d321402f54 +1ca4e724a542dd90368a4612a878aa7a +53a4e01e6d7e0de4767e8730274244d6 +822e8258e3b9091f75218041d4a460d3 +68633b9a396403744b2f3e762bbf5a19 +f326d01ea1f9cb89d96aafdbf65dfcf7 +936a3826ab7fef826773fe47ee2685bd +8ad7dc8c62da0c98fdac28dfda1db0da +2f8923ec07c81c8c61fdf2299603f71f +7467850d8ccca1f266b0344f7619bf18 +2b7b7694e9c574c9017760d04b71d385 +336e659b54ee694568f9e17c14ba4a44 +6f225dc643f02ed2509b857ca08a1695 +7aaab4fb184c28801de5a94011684405 +37c8cf292316d659b712e3e792776e3f +e363bb2bc57e1c0fa0c14b6a5381d7bb +92923a754ffc4bb7a20594d85b13420b +61bfc817d2b654aaf31d48b07ba0fef3 +c55dcdf6e8f282d9e52a4f09cc687af9 +83e78bb82847cec89e9d767926d27369 +e9e437b0e54d0b0f215555a8a0aa3691 +f1f34d8c0f864daa5e8ab56801027430 + + +978bf026c812ac95e435560c7be4bab7 +f3c46414a349aa8f14f7b2bc4224c2c9 +bb86a43e02b27e96f1a1a5a4757aa567 +08574a10079a93ee7a8029be9b73b2a5 + + +c14feb8dad0700988ae6f703f0ea89c7 +e77b7551332dab6835edc3a2da25379a +43eee6b5058a3c2e177ac50a918af332 + + +c66dd0f9f630f411f524d9afadd6fe55 +cf956add0c79021627f8d296bd9c0bee +fe3477177a63330945e4ead28104e233 +fc628de5a36b7c13afd89f072a81d83d +f4c518a2e831d32a20311eded74ebfa7 +3319e81b708c815574b97d7a4093e51b +a2ff8b3df32118f73d1878f0a2f33593 +42a0dd9c730f89c8010010a1d33dd8f5 +bf0a23492645c5a983f7c71f63b786ef +c3814a0c44395ccb7a7fa8bc1cc93abd +2d07e3dc90596e3bf5815017b9fef1cd +4bab6c6dbe6dba72eea63344b1b725fa +b5cf52bbf33d35674407bbfc3b13368b +10699a4b525332caf77fd70a75f92785 +84cd94b454769667780d7673b5341c0a +0c3ea1ed6f3bef86e72457af9d477b22 +a920d82f372b341e3ce9b736ff9711cd +d521ffdfdc56b7df468651c6f93b1aa3 +f10cedbccc9475f55d46269a683f0cf4 +ce952abcea808bc4f982b15535585072 +4f4d173435d76648a581bbc19df4a435 +8cd714c35a68b56c9190c03579baf70b +8653d9e0bb13430d74e1ef13d4fbba93 +7b1ec84ee854edb251afec2f1489d472 +35d7a670fd58b89b1927a524bd74357d +16ca8987db92c91d71d494e4b4721d5c +7114d694d059d0f7eb949d83012e4ec3 +5a6bb3c42b5a0bec8c86824f1975083c +4d3b7e70e7f32db67b1311349d689790 +06a8fc6223f19856aba6e4493637d558 +db649236b72d5c78d95b5730dcec549e +00269fc24641e5d36d70c5c8ef6fc209 +be4b41ade8443d0112aadf0582fe32d3 +abeec7cab968b8b816c16b0dea5dd6df +1839a9a8d5acb647fecd736164218fd8 +b4f1dc4050b120ad1e3562da7afd2b92 +d9f0c52c0880cd2a167ea745276e7d34 +f89420ea2cea158b44d851d13331691b +d840896ede7dff5e0b188cf1d3a142ff +88a03a09be0856616b2f86faa08aef5e +c89654c4082766e7c7d308041a45cd48 +ce4878e523819bdbf53429123e7f815e +354a01f32d385c5166d852822ad9d471 +02e5e0d91e8cc1b008004845a60230d7 +b86122de22bca131f7b1e591d0ad05d9 +d771da5dcb9da1876af5589f8a2086a9 +1c203659d8fbe2117d8da349a757ad8e +120cb4111496c69e8fc17c9c2d62e159 +8cb74c863279160fa7b15339ec07d66a +aaca3f24307cee9df9b59a953020be18 +f5f62c73ed9e39ce256471120746468b +8c61ec84093ef3496503ff1b87698eea +a2335b6d52059adb0365213a82258ee1 +fb318dd514da9a7e91e4835a22a8b317 + + +b518752ccaeea156acb4450b5263c2ae +c3e50ad0d4c93692a2810e136ada70d7 +af56ae8f3240a1cb51bf1a10154a81ab +a886ae14055bd6191498cf46e1e21848 +c93c4c89173fc683504c599a41e8c128 +76fca7d3f096bd5736ad5130e020c137 +0178ccd0294eac78322bcfb837883e9e +1f319794fd0c473af4105da7eb800395 +fbd7c6eb7947061e1cdb26596aa97f7e +e078e6e155aeadfdbd41beaddcb80abe +771c74b2230182471812f2cf4a5b63ee +f67bbb49377ad41691a2560e5db59c8a +b8c0a0b89f697b6e2cded307c88d06b1 +e06f49e34ab23b7a238092f0949959f4 +d976f528676688719bb4ed9da722c798 +4b2f37e2efbc07cb96a3c17df7f132b4 +3cff0fca31b6bc15881e15137184a92e +14284138d5f94467eb25db3495ebd96d +681bb6760c742ae699ed900dca34241d +512699b0027618a3031685da1faf9210 +f209f3bbc245afc75bf1fe1c2b74317f +d9e5975cb7abbf8cc23b9ae0909c1291 +eead927af63207df007d30bbefa0bb40 +8d43131041f3d3667982ff5fa6227d1d +5f93e31d32cd99d38e3d59c80b4137ff +6a421190f518462e8f8bfc5f22da2b75 +de30767cf0a5d454269ab9986fce13c0 +33a07b8f1c6f7231f2a1e2d5c36dd79c +96580781af2e64271588ef6d49f05d89 +7d5368b1bee0e7367f815ebdcb1ec139 +92ac14a3dd5307e6bc4429f625ac3f5b +74f49c52ba746096316a8fabfdd197cb +d3a94f5738d82056ea2efafb91108df5 +4e186ea8084c33de3fec3182f57150ec +fb5913e34a812d5fdf9e25b8ca8c9fb2 +2c739e0c5968cac73cc93286aa8dcd3b +e355739b38707e595924a2aae63d78d0 +e39395accdb3bcffd52f2518788728e5 +5f5e1f71ef91392a3edee6cdf5e03408 +8cc192424d2a8a3a8439cf6c9e9c866d +228b0316d26bdd36e56a9158eea64ef6 +c95d9dd5cdb6d9a6824a6bdbefb48531 +4ddf34ed8a507480b8e987e8a56a18b3 +ccf43b38dc670c1a539500a2c0cb5dc0 +f50022077f0dd202d6e2b9f04c9e12a5 +d303c8174006e885937802b900be3eb7 +240b11fcb5dcc2be6227a51c45701f86 +f1f34d8c0f864daa5e8ab56801027430 + + +f54250f7ea8799aa8cf77d1e0a09ee1c +3f805e4b34c62fa1471efe04d89304fa +b0fa6054c4127dcd888c56e4500dfa6e +dfac692419577626a3d4ac26b8aee5b1 +8f226949f2f1dcc2d543fa55217d2e01 +4d8f5946cc3cdbd8dab61f6581942107 +ae4941e6a3fa8b6d8d65146bbb99dd65 + + +86edd8b14802f697dde804a0b134a9f9 +e8db18a3758a6660f1760d5a86a01d77 + + +fa476ab10e0021686cbca62a37590073 +fd401a3ffaf6041c661604a3b8829433 +2ce348df9fbc81f316ebda901c673a2e +96158be7f9f084bbde73d88ec07bcb81 +dbc9673a5c976c7beb59388384fb9f14 +b1b7aaab7b7932757856dbfff7ecfe86 +120f110346817209a75f91e2ad6768e1 +763919c179d578786c214bf6126aa0c1 +0bfe6d33ab9e711efeddb3dd96a1e82d +be5d82281f411cbfa5dc10fe5ee4aa4f +e1161971bb06488cabe9066c8e827741 +eb81a66ea64bf704f316761e173ec239 +50fa549d9b240f7226b509041c64c0d9 +43c581c321c303a3b59011b37a558ef0 +f3721a08b89b802dc341a3fe9840ba79 +9f8037a9a12a3775f77152459d1d56eb +3e5b88253e668dadb7bb35266683719b +01edf46ab8cc0796e5dafd51f645d229 +7353c73dcba6a3beb03620ccb68802b3 +815c17a65c7320230a1053af02cf39fc +b7c3fe1a140db57e8b81210c6e91c32b +8533867c20217e5aeae7d0dac180cd11 +943a1c51b1f92a4263138c7d60ae79b4 +3f0cb6ba394a86cf0336df967eb3c0c7 +0d2c31d7789e5bc07bd6603c70767da6 +edebaaf030b310580975751b4b7007e4 +13a76289383f2cee91aa326ecb2d3e3a +2c27edeee3a6e7883ed719fe44d6d145 +720d30f0821e90db18ea8fc426ed49b8 +8e37c7fa9059a72f2aa60e4c15c9e97c +4521fb4569669a9452e510c7073ecee0 +3e5963883aba5a640ef12cceb8c8ab02 +e0ce965610621ebcae718cce77fac1c3 +791d08fbdcfe6f2029c0c400d4f3778f +58575ddeae46121cd633a8f07153786c +7413a2b2042814b48304c12cc83309be +1364b5c7f6f46e8a9d5fe21a4aa0b8fe +f326d01ea1f9cb89d96aafdbf65dfcf7 +04efd2f270cc99079814de6e3fa9f9fd +21a16ad96278005dbdd81c4025a9eb01 +483c66aecf659f68b16f0b28dc666720 +339f0a142477e11932a52309ef39132e +44090991e2c1fd2d2fa0df9a85dc239e +abfff4dbeb6fb2a25396303105f5642a +ecc8a0bde690b00e0836ea7764a2fb4c +046654462316a1cffb3d3db261917013 +37c8cf292316d659b712e3e792776e3f +38752b632fd39de4d2873e29a9a95900 +83f1129fc2c84d6c8c95eb0c7b125187 +e0b04ac47f5d5e76b5d204c50018d59f +315cc47a7a4dfe139e37f181d9495ba6 +333bdebd970556adc25ce3fc2da4f1c8 +71447d62d4cd620a20ad4781d6add66b +7e2d917c34973b82cd21c55635057d46 + + +03bdd99193e0b45f059ec8ab43b58770 +e321a919bf6a416fc5225d6e9c3bbac7 +9d2d9f9c6caf457c693c1193d7136b4d +77fe938ececda11bf8dbc014d63e6002 +7ae6bd8e56ea18f94efb81913b1eb329 +10bc1ddca03b2af96dae69ad3a25e06e +62b8ce27076238e3c5d0f6f6d24f49f6 +a9b9b83a6e961815e077fe1ad5f3e904 +ded3497d6d9cc18818fa96922af3e70f +8541e3783dcff662e7115e27604d7a87 +e1161971bb06488cabe9066c8e827741 +d7df0158e09210e45d4de8f45e2c3a9e +0b28b44f643e672a9badc00525fa681b +3d6277015d1de07ef4d0d5b32d738d3d +296e524bfaf83707ad65714c26964bed +44a4a6953997a93c2f489833faee59e0 +7e3197ce47be5c2e36bac90a9bf063b4 +01edf46ab8cc0796e5dafd51f645d229 +7353c73dcba6a3beb03620ccb68802b3 +7b3f2ef8f1c9a3eea21bcd95300c846c +ce4995cf90dd19e55ff44698f47035bd +b39e88d2e9c83f2e3e231c0b4709134e +0070e172ed877ebb42c0ce5a76455c2d +e4c281fa45cf7c9d93f1fc22ee305408 +a8040639d1093019d49318557e854cfc +467a3e47bc4afd8cf96b9611a27e47fd +25c7a83826317b15d895751e11446fd8 +40f2ba1ead0948ca2e654abd30e3fa9f +78bfe9d3be2ff976970544de41772eff +46279dba7432975139fdb024b5b10c4c +83e92fd0616bc81a989e933048439bae +e2098dc82a558a1ddc64bd0070a215f0 +c5fb1cf72f14c5438641b0f5b02cdd55 +febf106ae20c652084d6e2accdf168db +51ca3c2a24208f226906c2a055addf59 +8d3ba8a390e8b769061f56c83c422ac9 +477ae995b637ffb03cf6a191cce1725e +f326d01ea1f9cb89d96aafdbf65dfcf7 +72eda87d6dd40fbff726d08f56c3237b +2fe4b977ba405e3e85b0f36544ac7840 +450bb0e387a8e51b85a34034ebdf6952 +ddcef9ecfc22c54d86118c173267b2bb +50bf0381abc0f8619095cfba9e2a8584 +441e0f2ccdbec200a6056f9fdc0c3c97 +15f741742a192add51c3939832f47ebb +6b67cbae27301cf6caef06697668953b +37c8cf292316d659b712e3e792776e3f +b3a01f38a068960475328820be38df52 +42f1574d30f086bab59703b503707cb9 +61bfc817d2b654aaf31d48b07ba0fef3 +a250f47bd4b44fdcb637a14c85833b16 +d88c639d5fecab50aa948a7b11b7ca3d +e9e437b0e54d0b0f215555a8a0aa3691 +9fe347f867d80653131d51a9e5046dbd + + +ece14744728e3aacfd919b616af33e13 +705804045c7055bb142911f56140b36d +0f4cabd5c702824c0432a5b16dedf3ef +f77f8d163b2e86cac266899dacaa9a9a +c6b98844e586d53b8f9a4b5c7cc05399 +f8c35e3878a1834751fd9ceaf8e6bb7d +ed92d742de3415fde0de3efc2b84e990 +c1f61d4c7d7ddbfd6d0c3e00dfa7c91d +467604093e3127dfaa5690fc4497f4a3 +8da8b58b041069c238c92cc6f7a25377 +616c29b85368aae480120bb30455f2e8 +8f869a6b5f96d3638f00d087f9b1f2ee +5e5684f776f1a7354578715682f38651 +fedf292cca2809a18d78f474c1334447 +b1d9c0b57b93cd0b5584fab53a6c227d +dcd4b0caa14caf886102e9aca04e8b7b +8db88368767449b61ad48b02ca40d8b2 +53660a54f13d65683276b89655b93493 +10d13de263c10784da8c24dbe9f58a1a +48774123b922c982e9db9735f78cb033 +f47f15a53c307b7b6b14ce44989bc3e6 +7e99379d64b67784419dbe4472109e8a +f02aa204b8f08a2b24b5259e84d3ab65 +5707af36b38fd6a63cc64e6852320ac9 +d2a16e475bb3d3501ca097eccf16f3f5 +af3e9d69a4cf87a7fc578c4982f62a33 +4a208b83b250a5fa06add548e5f4675f +82a6941cc4dc14b88f1053af0b499e4e +59addea31dca998c1b712c1ed87d3f9d +13ea1e3d78db1beb3e50c8af9a08ab29 +420760f1972b026edca932195d6528de +85086256e7de8ee29545bcd5c1063a55 +5695f95ab75430e71ca7e91b1d4a7993 +831a02dc86edbefea1c6c98d810254b2 +5a8e27edd39a5d187e866ab28240d571 +1fac7e50ce5772a8edf909ab13f18ef0 +b5ecca54092aecafd5a65dc0d95b9739 +428baf81a8ef213be49b3f9096a78fbb +e5dabc12813a485062ab5b77b5426679 + + +3c8d1e8787ff0b765064e1a27a8ee940 +632d62425fd80b2ae185fb09da005b35 +e0d0388f6ee033647320ede72dc63735 +6ef4ac33fb4a6784e63e5570ff94ba35 +7664370ef500a0b5cb2e25175318d095 +ce741d03c6fd771179281dbfa14d39b3 +f8357aebb6d24dfc870ddb4ef63d4fa1 +24e906c5c641996285edfd8abb40322a +7099bf85294f531cbdb56a95961492c3 +d626f61d727893fdaf13395d3bf09e45 +e1161971bb06488cabe9066c8e827741 +b1f6b28b2f8d338fe2e71589dd12103c +fbe0cfed6c15897baaeb745edd13a26a +7e672998211ec6468729ab0a25949c4e +154030ecf6da9733e3995f8ea18b3b01 +49070aa4eba7e3e1b439d12caaee9952 +787b405c8c6d3946a464df04ba694797 +01edf46ab8cc0796e5dafd51f645d229 +7353c73dcba6a3beb03620ccb68802b3 +d48e0ff7d0b3984e9c748dce29cab113 +23b283c2a11223316c1b2d99e13a03bd +83fef6c66e36ad20cb4fe764f9f68e06 +ae1696c13871513322a5f7a37ef7d5cf +b7cbb01f27803c44288d26309ca45973 +384edeff0560731bea7d71b6f7fee1a9 +effb241913bf2477516477291789d0d7 +21ba353a9e2fafbe322df761ee7e3b0a +a0057248da365d8652f6b193da290302 +a34b020fae75857b35e82c53197e38aa +fba9860bfbcea0b33d10f393420e321b +61320ada24d1eaf2d249bf2b3ee5c092 +5225a59901d5398e50a3d02f04c7186c +67a9145e62cf896181712572df065399 +cd19eae6497fdab036c304d1de48166f +b033a2d3037fe189c5d6310c5f7d9836 +ef35a51a63a765e705cb8fe6f1310c2f +306523293000765d47944a1d49176227 +f326d01ea1f9cb89d96aafdbf65dfcf7 +9288a4a00a32c0bbbd2528519b70d804 +4c3fe05f72b2d8c24f241ea8d3ad9731 +4b8761f12f4c432c76612805b6b1b17e +f40a6855e6a861fd2c7c004c9b290385 +dd0c0d28fc4a2ed9db92b4ba84a9a561 +62412b0b947b92addce88be9b0d465c1 +e3a663c28cda435414f95b1683b36d3e +0b5f02a9d656a87180e6392953396221 +37c8cf292316d659b712e3e792776e3f +cbdaabcf63b8933cc42e87eabd8e6e4d +919cdebea5c5ffd230928fa9179e1bc2 +61bfc817d2b654aaf31d48b07ba0fef3 +ea939cefa5cb4f9153c0c089ea14bf6f +3f4209e34d83edd797e1a29e728f1036 +e9e437b0e54d0b0f215555a8a0aa3691 +96c57fcb231c8ac82ea65c0892a50555 + + +752ff849b3e642a30370371a37e414e4 +150ef0a3188079477ca03d406201c48b +3f0d25c580c941efa2d6554fd021fe96 +8bc082b237308b341b106e8ec4b2b074 +f69fac9e16153c3acb8fa4888e9f46e4 +c8f4a5753f271bfbcd5d1c7684cf7a51 +ec8ce242fd76f4d419233b1e4c65b745 +aaab56c70c755b321ce63742ea8b5e76 +ee353097d2121cc7e1f36e2402c4af90 +f81fffc1c919c91ec4fbd998ad571989 +e1161971bb06488cabe9066c8e827741 +0764f4330a3ab8d489776e2dc48d58f2 +e457aaed656cd73521f6134f1a50c7ab +312190f506e4a6bfb54edf83c627d70f +0ef4172aafe603bdbc2fb7697d41ef36 +54ee3269dc7dc1a5ad6b8e105b6d1c4a +2b8fe3b9befd458de64b2be818fb038a +01edf46ab8cc0796e5dafd51f645d229 +7353c73dcba6a3beb03620ccb68802b3 +263b5ec14e9dec310d47f6771793a630 +ff657da941a0ac497a561afdd1deb932 +d4a4ee924ffb170772d19d8fb868d8b5 +f521a4107e74b62b2d21e97ee0dafb1a +1976cf87682a67b3a453046f78f8d732 +0e382fcdcf4ffc8c497b6e40e4c98a61 +369a11697afc5fc08c9d9a119312befc +683506bfc5c86f0014878d8e904c73a2 +5f249fd236d741add5cd1989e73a179e +7ee6b855402c106e4146e44756df80e7 +dfb9f3894a8d4eedd5269461ba73b613 +07001ab0c611e2dff9fc99882b4d465e +39fc2d8ae07cc976e812b7d3b2b9c7ff +1eed84901b495303c7482256c682657b +30af1f1daa6808bc69afab5eef6d8777 +4769da6e55bbc8678f19dc1b68dfdada +36356b34b3a725cca161313bac3c80be +e2590b64c46acd99b18bf01068bda97f +f326d01ea1f9cb89d96aafdbf65dfcf7 +d70d3a1c5809439c71ada51f48958982 +62935f9a39e2525b3e434a981830f02a +f2b4c6e82c9efb8a67e74092b5b74d59 +49575eaa463695e2b9d36d0d7178a896 +14de703774957e32462615ce075e168a +d7076d1ba0b16124aa157994fdb7ec3e +abffa393ae08d5867b30e2b23c686fae +ccb9fc97d797d909a93b2a50c2fcb5c5 +37c8cf292316d659b712e3e792776e3f +0491956cb19671a286fe68771007f214 +8571969137be464407ffa873bd78fae8 +61bfc817d2b654aaf31d48b07ba0fef3 +3e36b1655686b8aadef324aeb474da8e +340206e2f1b9e16a1dc49a34202ddd80 +e9e437b0e54d0b0f215555a8a0aa3691 +ef990f1dec41193b1367ff9ff985ca67 + + +35213de7f44313882389fa97a536d204 +8102364333a2bd7789a348e5115a069e + + +b518752ccaeea156acb4450b5263c2ae +9e04b2cd1b93f421705034d5206749d8 +af56ae8f3240a1cb51bf1a10154a81ab +b59cdee2b1ad7bcae09ae224faa8f858 +c93c4c89173fc683504c599a41e8c128 +5615db79ede9dac702571bd948faf99b +0178ccd0294eac78322bcfb837883e9e +1f319794fd0c473af4105da7eb800395 +fbd7c6eb7947061e1cdb26596aa97f7e +e078e6e155aeadfdbd41beaddcb80abe +3d553783df165b8fbf3ebee134c980dd +771c74b2230182471812f2cf4a5b63ee +f67bbb49377ad41691a2560e5db59c8a +b8c0a0b89f697b6e2cded307c88d06b1 +d3967ecfab9f1069abf1d8a676c38719 +87204bb4bc4b2de9530578fce343498a +4b2f37e2efbc07cb96a3c17df7f132b4 +01edf46ab8cc0796e5dafd51f645d229 +7353c73dcba6a3beb03620ccb68802b3 +3cff0fca31b6bc15881e15137184a92e +14284138d5f94467eb25db3495ebd96d +a42be7db361dd5993f28868e4a3f358f +512699b0027618a3031685da1faf9210 +6347092f90b7e44ae61df59af8552bb1 +d9e5975cb7abbf8cc23b9ae0909c1291 +7bc61a1f1daf334bc893dd1f0b05ca37 +86eba190302f1d2ffa2342cd0a181be0 +5f93e31d32cd99d38e3d59c80b4137ff +6a421190f518462e8f8bfc5f22da2b75 +de30767cf0a5d454269ab9986fce13c0 +33a07b8f1c6f7231f2a1e2d5c36dd79c +96580781af2e64271588ef6d49f05d89 +ced606faf1fe20a17eb7862061f86f27 +1ca4e724a542dd90368a4612a878aa7a +74f49c52ba746096316a8fabfdd197cb +d3a94f5738d82056ea2efafb91108df5 +68633b9a396403744b2f3e762bbf5a19 +f326d01ea1f9cb89d96aafdbf65dfcf7 +eb13c5e78c9fc9918ac64766171a967c +8ad7dc8c62da0c98fdac28dfda1db0da +4507af4962ab9c28d54a18608feb7335 +179eb7a9b3e9b67b01a36c8ffe84ce87 +8cc192424d2a8a3a8439cf6c9e9c866d +3122c8015a2583d254fbdead8e4fde52 +6f225dc643f02ed2509b857ca08a1695 +4ddf34ed8a507480b8e987e8a56a18b3 +37c8cf292316d659b712e3e792776e3f +3e9db96fe72455a7dfe37afed01c3e7f +f50022077f0dd202d6e2b9f04c9e12a5 +453381dde1a557931af6bf3d85c3f361 +d303c8174006e885937802b900be3eb7 +240b11fcb5dcc2be6227a51c45701f86 +f18bae68f60655dd11f792066b6d45a7 +f1f34d8c0f864daa5e8ab56801027430 + + +7864745b6e16ddc5251920c7a15f4f14 +fad9ffebf9d9ebfc6be41e9ad00869ae + + +86d9f65d7d02769aae605272eafad1b7 +8a54b70546ddfb4c37311eed7fe97f37 +e79c6e7285b5106095a07e4cccbf406f +b0c36f511f37195cb7dc1931e8a8a708 +2af5ad2127c07806695f56e96142ea7a +e5be118732781f7e32a1bbda3cc7136b +53c59830c0b8e21669bd450638a0aa24 +484dd371d8fc5567fffecefa657d06a3 +ccd92d7fe7e97e7a33bada943b287470 +62c441d4458ff63d8e88d1ae56bdaf21 +299d941a9f02e17c8b02434fa9e8030f +de0ecbc9edb63dd04e37b313d2232249 +5ff52a96336d9b2720308c109e067018 +67a8f1e3a74c585f1a968cc91050737d +083db641c997ae5c8d487d9b04e824de +e131a7ffecf41104dee00ebbce281fab +b5410e21769b5290b1eba238dff65ce4 +e87ac956a8e9005dcc4d88b2cfe0ec2e +a1b4f1a132ee1c2910d45a3ddf0b116d +7b02fd714f4e617b52a592f866acdac7 +c4430027f89011992d470f7fc4ed1ba1 +184f8b89087e7c5bf304a8fb05056c81 +7d3f325b8304bddfc92dfc67d6b19f17 +ef72a74ee0e4262f1064a0c1dd2251e4 +d4bcb45cede4f90f42bce9cb382f4189 +ecc6587f01a3e2b2fbb938a01ed61ff6 +827e24df22814a8944c48039c2731a91 +953b6481373f49567196fa44c135b46e +7d9fbc5051b690698a9d26ccba110d2c +1ce85d3ec8bf4020aaa4e5e1adef393e +3e9c513679a5d00daee458e8074af060 +98b5f31a54bd68f5efa9ca2e8e580ca0 +9fc71331760b7752c84f504143fc78c2 +ac2e49c27102ae56b3deed5e8d7c4175 +bae9be49ff5bfbc4d914b027f5ca4970 +e45d1e768769df5282df82d16740515c +3a4777f67a135a1cfdf7a47069d350f0 +1b7f4ed47e2733ed7daf1f068dc5a43a +b7abf9906af10dc5fd4ba91cd417799d +873b92d53e67d087fd795c9ae488d80f +c917f91833ff8142100e4b8badcb176c +9f571b2628894bebc827633dd59dc98f +87286fa247ed09647335fabb2a9ea2c8 +0b44cc53b25de22d65ec652eb81f2709 +f941b0dd2760b7fbc53b3ad0e10e50d7 +ca93051d790624d7b8201ac34f585aba +caff61b2f2d74c3b1224049158c71564 +d4d34062194fee88417c72ef0d8cb87b +ba31b0d364ce9d08e5dcdd154a5c07b0 +f9f8c3fb160d2937acde467f520ede7d +18a504020c06f590d4d3a6f0d53c3efd +c37c443a0d9233a543b0c421a6b01630 +f3d9b693dd62c347b2c6cbeef1f7d1ba +6ad1e01b6d442e0d1300992628e095fa + + +b518752ccaeea156acb4450b5263c2ae +c3e50ad0d4c93692a2810e136ada70d7 +af56ae8f3240a1cb51bf1a10154a81ab +a886ae14055bd6191498cf46e1e21848 +c93c4c89173fc683504c599a41e8c128 +04dbf7922e7127a66b32ed38f7f57171 +0178ccd0294eac78322bcfb837883e9e +1f319794fd0c473af4105da7eb800395 +fbd7c6eb7947061e1cdb26596aa97f7e +e078e6e155aeadfdbd41beaddcb80abe +e1161971bb06488cabe9066c8e827741 +771c74b2230182471812f2cf4a5b63ee +f67bbb49377ad41691a2560e5db59c8a +b8c0a0b89f697b6e2cded307c88d06b1 +e06f49e34ab23b7a238092f0949959f4 +d976f528676688719bb4ed9da722c798 +4b2f37e2efbc07cb96a3c17df7f132b4 +01edf46ab8cc0796e5dafd51f645d229 +7353c73dcba6a3beb03620ccb68802b3 +3cff0fca31b6bc15881e15137184a92e +14284138d5f94467eb25db3495ebd96d +681bb6760c742ae699ed900dca34241d +512699b0027618a3031685da1faf9210 +f209f3bbc245afc75bf1fe1c2b74317f +d9e5975cb7abbf8cc23b9ae0909c1291 +eead927af63207df007d30bbefa0bb40 +8d43131041f3d3667982ff5fa6227d1d +5f93e31d32cd99d38e3d59c80b4137ff +6a421190f518462e8f8bfc5f22da2b75 +de30767cf0a5d454269ab9986fce13c0 +33a07b8f1c6f7231f2a1e2d5c36dd79c +96580781af2e64271588ef6d49f05d89 +7d5368b1bee0e7367f815ebdcb1ec139 +92ac14a3dd5307e6bc4429f625ac3f5b +74f49c52ba746096316a8fabfdd197cb +d3a94f5738d82056ea2efafb91108df5 +4e186ea8084c33de3fec3182f57150ec +fb5913e34a812d5fdf9e25b8ca8c9fb2 +2c739e0c5968cac73cc93286aa8dcd3b +e355739b38707e595924a2aae63d78d0 +d4e3b60b743d6c642f6468c323814566 +c359b646b2d4d943a311927b568d046a +8cc192424d2a8a3a8439cf6c9e9c866d +228b0316d26bdd36e56a9158eea64ef6 +c95d9dd5cdb6d9a6824a6bdbefb48531 +4ddf34ed8a507480b8e987e8a56a18b3 +37c8cf292316d659b712e3e792776e3f +ccf43b38dc670c1a539500a2c0cb5dc0 +f50022077f0dd202d6e2b9f04c9e12a5 +61bfc817d2b654aaf31d48b07ba0fef3 +d303c8174006e885937802b900be3eb7 +240b11fcb5dcc2be6227a51c45701f86 +e9e437b0e54d0b0f215555a8a0aa3691 +f1f34d8c0f864daa5e8ab56801027430 + + +08aba653888ccab9c86df7a427fa654d +8c05bca341db9c1e806bf122cd6129b0 +2f4e5771aeefb03f098258626384e271 +f8b1152776566df5246380c687a34d95 +43d9ba406e72d5ec8e6a0062822cc0e7 +c6ba72a10553774dd8fe16c9107b9e00 +67fc891278e84c3bd8803c1d161d684c +977df7e247c549c0d8eff6c9b620b960 +3481a3a227684c9cd2d321458baafc73 +cf0a24b1fee3f3ef9ecd61f56f4f21d7 +e1161971bb06488cabe9066c8e827741 +26938cb2cdc86778bc85ca18d2bc69c7 +989de54c9aebc755dd5681b46bc0684b +99a872fae98b981b1495bd46e9c5245c +c912ebbf5efa0a726eda2372ac466521 +f5b0214673d66b795a0b2384d50a0f6e +611c53b005e2081bb40a50c0ac2084d8 +01edf46ab8cc0796e5dafd51f645d229 +7353c73dcba6a3beb03620ccb68802b3 +e06c3b79aedbda27447869c346b1d192 +6c5774bc0f316d2b8901b910f5459018 +912352c3ea040bb64208b06524d3e69f +513a6655ae8ef9a386422f71201e6ee1 +f26120090328cb48d121cbb4ec62debd +932eb3439b371046ae7416e11a02bf35 +cb9aeac6d97c3f64441c933400ac7c5e +66474773f8488932cd33af56d5a33091 +29274ab30398ff24199850dd8f263b78 +42b9f7552bf834107c4baf04837e50fa +4b16894f309777950f0a576ce027de98 +38d744affa96ff0a897619e30e14d848 +44aba6f4b9ee45637603fe1fd407a260 +14d9e10395a1a5ad05b1a4f32a5d6d0d +4c37f0937bc0bdf3829712cb5d05255c +afe4f25f45dcd3120c8e16f12950bd92 +6ecc6225f9ecf325eb1c481640d05027 +fa985871fb4d0f74795b3c61bf129d8d +f326d01ea1f9cb89d96aafdbf65dfcf7 +7f88c5135b48f54fec58647732694601 +be3e102f28f8c0079efed49eedc41453 +e21897e052dcd008149659df98e1cd6d +fe687c0b5ae1311388e7d6b676e8f3cf +c734b464a1378316c70ab63dd8a36e34 +46f4fd2960c180e57bf42a4003b95789 +d855926b2e6609fa7bce6078ee3fc9bf +23f3965bef1e0073406abcf61aad6078 +37c8cf292316d659b712e3e792776e3f +17f3373ef1440bccdefd737f1d048f41 +2166cc8a47347b0558f5dfeb8fb7aba3 +61bfc817d2b654aaf31d48b07ba0fef3 +3b7079896cce7b94ae65425f96be4ceb +ddd8f1492164232700ae2ea1c3078337 +e9e437b0e54d0b0f215555a8a0aa3691 +e4fc2e43ec963c474b2f6f9ecccf3ea1 + + +b518752ccaeea156acb4450b5263c2ae +c3e50ad0d4c93692a2810e136ada70d7 +af56ae8f3240a1cb51bf1a10154a81ab +a886ae14055bd6191498cf46e1e21848 +c93c4c89173fc683504c599a41e8c128 +76fca7d3f096bd5736ad5130e020c137 +0178ccd0294eac78322bcfb837883e9e +ef12ff29adae2685e120e58aa04e23bc +fbd7c6eb7947061e1cdb26596aa97f7e +e078e6e155aeadfdbd41beaddcb80abe +e1161971bb06488cabe9066c8e827741 +771c74b2230182471812f2cf4a5b63ee +f67bbb49377ad41691a2560e5db59c8a +b8c0a0b89f697b6e2cded307c88d06b1 +e06f49e34ab23b7a238092f0949959f4 +d976f528676688719bb4ed9da722c798 +4b2f37e2efbc07cb96a3c17df7f132b4 +01edf46ab8cc0796e5dafd51f645d229 +7353c73dcba6a3beb03620ccb68802b3 +3cff0fca31b6bc15881e15137184a92e +14284138d5f94467eb25db3495ebd96d +681bb6760c742ae699ed900dca34241d +512699b0027618a3031685da1faf9210 +4865ab7e4d789a51075d4f780c3674ea +d9e5975cb7abbf8cc23b9ae0909c1291 +eead927af63207df007d30bbefa0bb40 +8d43131041f3d3667982ff5fa6227d1d +5f93e31d32cd99d38e3d59c80b4137ff +6a421190f518462e8f8bfc5f22da2b75 +de30767cf0a5d454269ab9986fce13c0 +33a07b8f1c6f7231f2a1e2d5c36dd79c +96580781af2e64271588ef6d49f05d89 +7d5368b1bee0e7367f815ebdcb1ec139 +92ac14a3dd5307e6bc4429f625ac3f5b +74f49c52ba746096316a8fabfdd197cb +d3a94f5738d82056ea2efafb91108df5 +6448daf1b06217c7dc989bed6f3709a2 +fb5913e34a812d5fdf9e25b8ca8c9fb2 +2c739e0c5968cac73cc93286aa8dcd3b +51a8ed92619d4857e0eaddd369a14b38 +58fe7c897e58dee622ad01cb30a4d6a1 +5f5e1f71ef91392a3edee6cdf5e03408 +8cc192424d2a8a3a8439cf6c9e9c866d +228b0316d26bdd36e56a9158eea64ef6 +59b195fcff4d3877045fee21c364d524 +4ddf34ed8a507480b8e987e8a56a18b3 +37c8cf292316d659b712e3e792776e3f +ccf43b38dc670c1a539500a2c0cb5dc0 +6ec9a9a11b06059192bcf4a71a34dd22 +a171ba167ab22bbfd25e570f28bd8483 +c9432581cb013f3ef7310de9ce213beb +240b11fcb5dcc2be6227a51c45701f86 +e9e437b0e54d0b0f215555a8a0aa3691 +f1f34d8c0f864daa5e8ab56801027430 + + +b518752ccaeea156acb4450b5263c2ae +9e04b2cd1b93f421705034d5206749d8 +af56ae8f3240a1cb51bf1a10154a81ab +a886ae14055bd6191498cf46e1e21848 +c93c4c89173fc683504c599a41e8c128 +76fca7d3f096bd5736ad5130e020c137 +0178ccd0294eac78322bcfb837883e9e +81ef576837cf88973f407a18f2bc1594 +fbd7c6eb7947061e1cdb26596aa97f7e +e078e6e155aeadfdbd41beaddcb80abe +e1161971bb06488cabe9066c8e827741 +771c74b2230182471812f2cf4a5b63ee +f67bbb49377ad41691a2560e5db59c8a +b8c0a0b89f697b6e2cded307c88d06b1 +e06f49e34ab23b7a238092f0949959f4 +87204bb4bc4b2de9530578fce343498a +4b2f37e2efbc07cb96a3c17df7f132b4 +01edf46ab8cc0796e5dafd51f645d229 +7353c73dcba6a3beb03620ccb68802b3 +3cff0fca31b6bc15881e15137184a92e +14284138d5f94467eb25db3495ebd96d +a42be7db361dd5993f28868e4a3f358f +512699b0027618a3031685da1faf9210 +f209f3bbc245afc75bf1fe1c2b74317f +d9e5975cb7abbf8cc23b9ae0909c1291 +7bc61a1f1daf334bc893dd1f0b05ca37 +8d43131041f3d3667982ff5fa6227d1d +5f93e31d32cd99d38e3d59c80b4137ff +6a421190f518462e8f8bfc5f22da2b75 +de30767cf0a5d454269ab9986fce13c0 +33a07b8f1c6f7231f2a1e2d5c36dd79c +96580781af2e64271588ef6d49f05d89 +7d5368b1bee0e7367f815ebdcb1ec139 +1ca4e724a542dd90368a4612a878aa7a +74f49c52ba746096316a8fabfdd197cb +d3a94f5738d82056ea2efafb91108df5 +68633b9a396403744b2f3e762bbf5a19 +f326d01ea1f9cb89d96aafdbf65dfcf7 +2c739e0c5968cac73cc93286aa8dcd3b +8ad7dc8c62da0c98fdac28dfda1db0da +4507af4962ab9c28d54a18608feb7335 +941286dec9631202d8c809fa73c4bac9 +0ad67108567f99662f7dabc9585331da +3122c8015a2583d254fbdead8e4fde52 +6f225dc643f02ed2509b857ca08a1695 +4ddf34ed8a507480b8e987e8a56a18b3 +37c8cf292316d659b712e3e792776e3f +ccf43b38dc670c1a539500a2c0cb5dc0 +f50022077f0dd202d6e2b9f04c9e12a5 +61bfc817d2b654aaf31d48b07ba0fef3 +d303c8174006e885937802b900be3eb7 +240b11fcb5dcc2be6227a51c45701f86 +e9e437b0e54d0b0f215555a8a0aa3691 +f1f34d8c0f864daa5e8ab56801027430 + + +5fa50099e41a92a8b0377afaabba7123 +4f3dd930710082c606d630d8399cb483 +80367c46ce620b58d334413d636a36ca +4f12507d0540030b91a6dc15843f7a43 +4639d7d3cedb750d7c02ef9a1a8f581f +55ca0445e8a82eff5ce63ce2e8da1e56 +c02878c8a237171dfd1b9d473fa191c7 +2760b4ddcfcc81f1ec25dcdd48f222a1 +94e84e28b4c116e41d0f7e5e60cde90a +99c4c0feaf3b82b3f60802f3f8bbd0e1 +e1161971bb06488cabe9066c8e827741 +23739601e903b6005a801e9bc5b8568b +76ecd9eb59a9b6b6d64f8c25a88e053b +2a050ca0ea2933832079928bc450a945 +210efd6b5049aa8c37726eb144e255ce +63a1a0c3dc2beff496d15938130fbc1e +d5cd6a3e9331d4b83a543a3d9ebf53b9 +01edf46ab8cc0796e5dafd51f645d229 +7353c73dcba6a3beb03620ccb68802b3 +c53b9827107731f045595c0c871576ac +14284138d5f94467eb25db3495ebd96d +6b2bd775e06aa7cbd2f7a8848f5aba67 +cba371c794afe92f2cd8197239d20a27 +394d73e0cfbca0cdcadb4961b508b5dd +f84f647cacfc125a7b455fea94443ded +10da288c55fecaa85ef7af08f041e3f6 +2f7e43b805cd2e5d2936e2303aac1a99 +5f93e31d32cd99d38e3d59c80b4137ff +3fedfbf71bbae496c45bb9759ba10391 +2d744747e57d3c18509a6cc6c4506d1e +8baff9a562ed0ec2f5b3723d5bf0be44 +710a87ec6e72c49ca1d5c3c03198820e +2eb0888e8c2e25e225ec0791f377f99a +aa04bdeb89f5b4ddbd80395ebe09c29a +1b0495d65911708d1ecbe68f65c4d9ac +2ec4c88ebc82466ed548b7e0627b949a +2d98e7040c9565cf8ded9a6e4e092692 +999992f3bf87ecc74a951085c24ab54c +7cdb38eca6e2c226c24180ecda7851cc +a3ff0b759ad210bdd9b6b7c31e5620b6 +837437f0cd3c9cfce5c73db324470fd7 +59da6ad26f081ee9ff063897d4fc8df7 +3bdff0ea3ff709e917be270c3e96a1e9 +c0ce2218241f69e739b177fd5c140033 +9768913e4af639ec2118c264a5ca3583 +e0b1b7d114bcce05f50cf94bcfc66b42 +37c8cf292316d659b712e3e792776e3f +a7229df8d68254a89a364ec69f6a6c35 +0a8a2c612db16f4906670b620e2a09a6 +c54906448e7c43a025518b66b35b2a70 +15465c79ac78efb54348f5c0b88a97da +ac2d5f8f28c35b0bc7883cf3e5afec7b +e32a2e05eb7560d7911bd6ab353872ea +e77cfae1b2c9124ddd567cc6f0bcd7a9 + + +4684d4917e5449f333ac359931e7dd72 +101640191cade09807aff3959719711b +1133856a174a6f27ac3543061d0cf777 +f11bc76d1434a85de766144bb1e98766 +92602ab17078dd9fe7379bddf3534696 +e07bc8a7da9351c5b254b0fba2801bd8 +7ed60b27951614433f96b842032b339a +a46011062ff5494be1a1a2fc1bed44f1 +e8f8e13780dcbf0d5870a355deccf63f +5f0f131bdb993a0f458214215d128572 +4b392c539d68aa99fd193ddd822292c6 +614e2b173f38e4c1385933e52a7d2120 +9a1d94667c35aca95934d556d7e78cb7 +f7e045d899bf00a9dc4c5a9e91b92390 +437ab568c511a96a88885b98b8025b3f +f3b88d42b0607b6c83b1eb0771d0f166 +8fd8119a43990c6172b33bdaf4789acd + + +dc739b6022b376e25d86610e888b794c +1267c262e4d4a11353de05ed39414cff +e3075d612e92094a4134b11ff66e4e9e + + +a8aa564bd6533fd41d89c882044ecf12 +9218a6ca6a221631ed3df2bf8b86e69f +bc9bd785b725e6207b5686094cf75d43 +e87c1b421a5ebd90d2c4489335243122 +bc1c92bb271b1483e018dc2ecc4a1bc9 +f79cf60e6fcc037e4db1847f2cf3c39a +52f55c471841f57fc90e8cec05cff235 +770e2ab7f25b3e472aa802e6c28ec618 +8b3710699f69f77af106a7076ab2432b +1abdc7bdc807167558b363ad209cde6b +52617af5059503ff1f2e342f6f64b729 +9a13db56e8d33a3225e5a034d45e1fa3 +299a289cdfd2821625e55b24022798a9 +2889e30d30c097b279bde50b5b969552 +26aee2b928cb7c730be4e3f341505ce2 +873792794d37040095e03b2f706c5e88 +c2f9d05dde63be9e766580c186f14790 +784e8b81afaab9108514472162532414 +826f390e791a08be2b7fb6bfe4df179b +dc464f0cc88ec03965837243ebaca8cc +c2d7742f87130bde6c3b91332f04c837 + + +26f01264f0d4f2022d8d4aa66218023c +76391c0def140fedc6931ffbf18ab295 +39705d060c18f97b4c7f4948437812fe +5a04b74b0d1c7b3fa3e064f0dcb61208 +15ea4565daa48c716649049e0ea1db78 +8f7e27d5fdd078d147dd5f8243a9c8c0 +bc2b70b940bc312acc65a02f2c1c638d +1c2e7835ea5e226f6fc25bf952e640f7 +34fee74890b73a52abd12cfe1b850a48 +84514130dbb4737c23c7c9ef98c8cd4a +978c57249da23e3f3d93de87b2c135fb +cd8c1d21b83bf043226c29095760af9e +c922025046a1ced888957386802b7a1a +d15c124f360597bb9378072bdb318596 +736a66ca7f239176808e27b9ca0bc913 +31f372c93f03315c680f0ccf7d1df897 +e88ed127337ee404580fb0800352c21e +f4bce47663370838d1543355d79963d1 +3f6ddb2794572f52a73c619c80734390 +10cab97d744e06765b4e1b4421677a8d +1cfb457b21fb0cf994e6bbc661ff6ade +e296aa7dae0e0d5d91a2a7cab148a042 +f572354a10ab0376a20f8f27a39fcc07 +fc357b2047442442ce84d3f1904556ab +9e080704858538797c4e4e79402c64d2 +68bdddeadf40d3061dd009fe77eec5d2 +e6480ef4d95c891a7b1bd330e7cd8098 +bfdffc1cf6e42979f52384d3125b72ad +82ca8eb243f0887294bd91eca809be3b +e05eb5b94f52139e50c47a559ccb4297 +5503a5d591df2240f214dfa56a500ce9 +70b34e253b55713b85f8b2e0e46030a0 +d92e2124156e3a61a173338214039b5e +c7e70b20d22458e1c7625cde28fd7c3a +66eebce929c0e1313b636ef7a9f5fb02 +ea31b7312a74a5dda3fd2a9f237e9c93 +ce9447e5187596bbbc50d0906cac35fb +c35de5bd5cec0c5e363104a2e2e4bef7 +693e906d984c65092685a29f2dcbbede +34e9b8c9933f92c532b9cf91942762f6 +581027137813cea8a8e2aa1a5f725169 +4ced3dd080fc4f418c459a4449041825 +17835e9b0f75e2f6dcc0345f888cdf4b +5d8da5928c310fe821026ff6eb52477f +b3ea4105cec2b19d69aa8e72ea483525 +5c453f172b1754133316a71bac9e2573 +8d5faf8e36b5e4b4da158ff2d6bd97e9 +877c106bc57e270722a5f361a06ab714 +8e2cb39651670c4118da75ffd8a17f4d +8b69572abd8ad6f82eceb16af43ee0d2 +52faf19e9059289d04b5d5beaed681ce +3d358f98fbf611ffb785d039a9e80eb9 +d95bac487dc8b05c0a44f86e740d382b +5cdfe2af14a59731ac7d27ae796c538d +3afb85eee792fc054a42df621767b520 + + +9fead8788e57a27012f3b3aca41b5bd9 +218bda40807aa861161c930953c7ba11 +17cce633ece3d815462391f998080acd +c06091aae80e76102024ec5272e3738f +7cfb04237de67a2fc3cf26a9723dac9c +6b69d9ca5c92ad146f3680178793788e +acaaa13e10f6147efb78c7b55d53c4a6 +4de903225426d7b38514fab4fc79b526 +1c902208e32692968de5c26908ee0dd9 +6cbd781ebecac429afc832daa0c14539 +e1161971bb06488cabe9066c8e827741 +f00bdca37228a584e878f0dab5f8b22d +1657d9bb1a7159da2f9804c85b58dff4 +4f2f8f830b84973e80355d10cddeb3ef +cae932031c73d0dd6a4be280d70c54e0 +db6c98d5d67b4033e5b2c0669a0defcb +2a22928cc7f56983d441f117b4960e91 +01edf46ab8cc0796e5dafd51f645d229 +7353c73dcba6a3beb03620ccb68802b3 +1bf727c6a0cdbeee4efbd448e0bc6654 +48f08d8f3d2ead8c5083d39370b1aeda +8568e4d03cdcc1874f6f39e21f994007 +368454fa3e073fa35b2e9345d79bff0d +14aa28cdd295a64b2e0d4bbe0baa7c33 +191c0d03a039f0d36aa55ad2efc4dc19 +418be20b4d4d50ff450dfb18734e4722 +f7f4807d9ee50d2e1146fe48b88eaca7 +c101b90fd10577eafb85a1e9adb6c0a5 +3df54967dc360ed1a72d7e4f9936355d +b96c1540a488d5de96d40a6d9cc52ed8 +7d311ba4bf19c7ffc5fced0e178b75cd +af99bf138a27d60144895c6230c31c13 +e7dbbbb84a113066900d6ea69cf4a778 +976e6f39654ffd979a1633da2107011e +a11d51a97a3ff7edc6c4709cfcc1b4f1 +f9e1cfceb1be7ea486093f225cd54980 +2b39e01ef2d55c7b3a24671fcd570e59 +0b5290b5856769452f96d8557ae4af4f +789c45a497d6ce7f80954beec8882c8f +7bd380b51bf2a243c136730220c3a2fc +b327f3e31781d3d0f2ff722370896072 +0fbebde407a51315a2d98cac08ab312c +eed8a78914dc69097046ef05aaefbc39 +1f1976a8a42bad235f1ed009fbc606ff +4404ecf29a07974f4cf843216d86641c +c09856e4cdafd5ade31d188dd4b4b279 +37c8cf292316d659b712e3e792776e3f +395ec972c9be2779c654a0876e63477c +9defbd09e323f332703375da65bca495 +191a982ab7b579fa76f3c5e132da883d +444d4bcf3144b554c40758c7d77d4f26 +db2ab5c2057abbb910dc0690669821ba +e9e437b0e54d0b0f215555a8a0aa3691 +1e261eaa004ceeffa908ff6569fc2119 + + +ba5ce4b6a48b32acfc7b42b719836cc8 +8a6466c371e807254cad642d6f3d50b5 +573b949f75c5a9f9f7b2c6d1f45cf175 + + +c26f82669624e77cd4196ca984968b99 +b67ea1d6fd056e1eaab59fa8e242ec78 +c2194cfa2ffaf90941c5505f7a35f56c +b0f5c4ce40cfd36ebd5b8d7789caffd0 +4c5bec2e65c96210db6812e599c41bea +aeea2fc1ca5e921e080a6864d58be098 +c59f3755e493691ef602a83c33b749d1 +d11d7858db5d484357f8379a1ad0d63a +4f4326d61f48fca9ece148e741ab4573 +5f25e3e848fe4b7db3a78311e8e97d89 +e1161971bb06488cabe9066c8e827741 +c89db1920e33b2523dd10f6ec41b8492 +73c145a746d2ef2ebf86d803b65a4ba2 +ce68fb04a64bcd388c2e4a803ae33baa +7032305dcef35175038a6154c5376397 +ef3b8f2d379827209d56fbacb1dd0292 +7802216fdd2b92c025ff2aa060aac7ee +01edf46ab8cc0796e5dafd51f645d229 +7353c73dcba6a3beb03620ccb68802b3 +eff13dadfd141a3c39f6f1c558c72744 +c168417448d16dbcc16ff7cc29367c9a +db53803710393c0486f2e99c7029bfca +523e539d7242fad6681e8cfb120812e3 +e8ee6b053bbd5aeb5c73f0d49e8a81b3 +1ad370429518054b68f0a9135e85293c +5ffb6a54b7cb00a3b3094b84c0d76053 +64ef3f97f9d75128dda5890fbcdd8447 +4b64a670806426b390dd182edfa2a814 +f267c0803d9bd649f0867e503e6cb4d5 +157b00e3ede4a493aff1ee281c57cb17 +ae27eea987dd7161bf121f48f7b86fb4 +7c489cdd73ebbe5eee8df7439c784a8e +49cf499aa1827de76f99e14d7db477ec +f57bf287027019026530e37db01d2b54 +85d01a283866ab0b3ff0cd7011b60507 +986d2852e5149b2b475ea70913de9018 +b58d52a68ccd700ad9669ff69b689fbc +3f924c148e0c0f512570e1a1c65d81bf +8c19cd415be1cf3e116abfa2ece382cd +d475e320b2b96e82ea417775a87177c0 +d703cb45af3d0c1b05eb12d775a2c1a2 +b5e59a83744fd6b618f56ba398af7288 +4d96011de54501b073ca0dc8543778ff +0e1a650c3666abf86528bfd3562aa763 +00c1fa26858fa3699d6e0e6d0d2d0c4a +4fc36e29e91b8151b0a6df85a002cd44 +37c8cf292316d659b712e3e792776e3f +c41c16df906f1c562668a31eb50d0189 +e75fdc0f1d392ba538950d95f849166d +61bfc817d2b654aaf31d48b07ba0fef3 +ab0e27fd617e0d3ebfee018778d3b77e +6e88ba6789c07fc00539e1d1027c8d08 +e9e437b0e54d0b0f215555a8a0aa3691 +607480487eb63befbc75dc76b3db9c9b + + +76925cfb76c182fad1b21250e61f0fb4 +bb803131fe2e0f7cf009fb1dca6c4a64 +3c39d19275ebc7bc7be1f9e4a89d04fa +274fb8aa5310894da8490379c70106d7 + + +68c6243871fb84c1a39f341cf21e7822 +b92c9d0ade3690e8f665b0e20178cc62 +91dab87a0fb357d8d128e522314eacdb +99566b75c482deb67d4e470fb41769a1 +67996c02cf0acd62a27207505b08ffef + + +1f362adf76ff1be15effe58fd7dd23ee +ac16b396be4bae4e72ddb087f590c2e2 +51b9b2a06a86026aaef9c6bf2d79bbe9 +13152996538ab4d39e72e31e1c589281 +29cc6daa29c5cf64fef17c44cfe84ff0 +ac8ee0077317269e528200e0d3bcd579 +d59b4be8bc285c485b30ebe26419f5f5 +594feb74a790cecb9c63f791c290f6ed +49f825806b792e6d4c75ab71f8d2fe11 +f9b9690bbb9436afd6265a51070fcc28 +b4dc1d5d3383cd97553fd3ba3df420b5 +82261a40fa775e22e0e0f09fffc7e05f +7c991fe976d4f6c8aa4339b2e335e9a9 +42b451988b89e38bca9280f37ef8289e +cfc224a2681d691700e034776fac540c +007da2b3bc701f7be0efb50a99d72e98 +3dd9452258ee6d6db29a4d653e502c0e +5c0ef00ef8f8f6023887a5d0fe062f9d +d3988891f5f080e84de28bbfde083477 +4033036004878a7ff0b93ff30f114d18 +5bf202e3d88a7efec5e540ed70ad384a +9f887891e44e6ccd4160a5863c49cc26 +5ad579a54f61113cb76d3a2c98c58eea +58c44a16d972b5b1687fdcaa0c7ccdf6 +6c8c352a8cce688009449a8997549f73 +bcb7d212efff9d2f016db69793c8fa33 +90f285e93cc4545f6ec0b882b6d16876 +1099de7c892403a38bcb3f388002b114 +9251990a3d21e9764cac81f97b85f831 +23e7a74a7165a4bca479847a51071481 +3a12d437c6ae223220dfc2ef376fc600 +59c564b68ae5724f0b034477b9bcd810 +182e51c2471f09d5e8502c7f48796609 +0bd9d42b67a73a9b4df222e4245a5fcc +461a5138bc27360b53f04d76fe77e071 +f79c0f4ec8c808361ddc39924fdcf473 +3caeaa1071c0c238662aa44dd4e6ba7b +df6baaf86ed9f3d0e4b94c391d77f33f +54eae8fdb336ae9c5f8456ee891b9d37 +05baaeb7f6a9a1a00e3ad00bbdd9bbfa +dcaa8d33715dabe9d5e7e9e4e29f7220 +e5b06e3d2ea500886c0e1b93907cca80 +641f630490eb384acbc5e03e4cac55ae +a14311660639a521042796c468a23b1d +17645bfcf4473c061cffa6613cc4626f +7c327e24c882a9f62801df1e6ca833b9 +ceba8c6ff078ab8eb79134c5fbdf1ecf +b606626772d975583387a52738c5ad41 +f039c2bb1d9fce227fc031541016023c +85a1049ea3a1c1cefeea47a8315aa0e9 +d518bdbabdb9716f6f4c4945c81dc756 +3c59f80b529af5d858d5a28fd4c19fed +ff434c70f1b072c13160abaed4d503aa +2a02d65f7ee53f1a006212dd415343c4 + + +14d77414d8f94acce800baabd8c240ca +dc2cd95b6531d5b5cc7d52251523506a +38dc204d5ee157d9e55e5fc10b9df0fd +117c192253c9e8e32b273ab4d801c26f +c27b884db8da737a72e976b86945343c +a547fa8ac0b49d743a07be34f8a1f80a +fc5fd6bd64fadc4e8df9a77c258e4b54 +2908e413398485bda9de37c988930ce7 +e97efd98e27d982e1d60fa7c310cdd71 +d0a4371ebe59dc22789e075dbb2477ae +a6bfd4f6d8ebdc770a9f310e7760a7b1 +f77f6005796f224d98f040792ddf6854 +36c799089633b3a4d376767cbc01a804 +464491101ec0e54ed35bed7b4a514e44 +95863c457a525878f5c0ba0a9b0a3791 +3509f62c9752bbac4f9bde2df2c7c8f0 +2be626d00517b65c00275695f1bb4072 +deeb2efd1d832ede0766d2c71f293c49 +c0ed66438514f4d168012039a10dbe8d +d7054e46baeb846c67f554fbaded072a +3aeb0bb955d966af8406506605547e1c +68f9cf0517979f5c5d39b38fd127e9ee +8a4cf10303a03313c80b83dd2585bef5 +48bff4fa8487449bdbe989e53a90504f +4b3416e5ad27f1623f5c9222cf93f491 +ab6bebba1db585128b15907e2575942d +6f11fdfa4b04669635edc07ca6efeca4 +6e7619dd0996afa42c3845825f1e2548 +ce3e0a1e4503033349fe525f5bb8711f +8cf92051189b85e0435008dffa152285 +5bd016e3b7b8e53f6ff170fbf35d4e18 +22136f109804c7805c3fb45304c10107 +838ea08d95f65f9a06957a7d066f0891 +bb2295842dea794d554724091853c908 +90da8a398529c9194ef26197023ef479 +1db9e49d446f770d60dd8d133b654b4c +4941939fc3ea3906cfe30989e3c07431 +5740969422d02dc69ba133385f4ab4f2 +d0a8291ffda1ebe1c347e110b1b4124a +a6394d613d4b29f539d2dbbd6c3fe107 +438c176002fc11950e59ee67f4c9d971 +285145b8adf6d1d7e53a1c102b25c177 +673f3e0c4062e13cdef27b581fb66461 +d74248250355b90443c5340490731dcf +5dc1394b3ce3cbc3b309909fbb255081 +81ddb439091a37636e74aaae613465e8 +92f3a1acc688a40818ed192a9ffaee79 +1112e6e8e02ae8e6fb03a6ff5c12b9fc +922ed41e344ba7eb9a665dbb0e3f458f +15d0c2df93015f87c2ce97bb28692d35 +0dbfb7b5ba0e1e0014419ec151f97515 +c597e7c79c9357960e0b8ab1f9f7e6f3 + + +5e1163c3cd079aec50b898a1c76cc8e5 +5e1ee36447ce06030696225dd064d41b +6265e79d2a9576edb5f13566803499bb +fd05d84bb7a972dfd7d6b479817d078b + + +76d0aa5bb60a03e95e66b81a958fe8b0 +2da9b931d17ade2a435827c23455e872 +612ad9adca6f0639bcebc44b4d7bd123 +81a6d0147fe8f0e6fa2d3b3983c6cb70 +664efb749c849ac113f4a51ffd3c47e9 +4869e52407ffdfefbea97cc46f576d20 +cbb75070c31c07f654d25ba0762f1c61 +96c10b9c8d2fcca004a00c083d8d6e95 +bd32d62609178e9424f26a7abe08da79 +54f03c6e63643662e133293007fcc8d1 +e1161971bb06488cabe9066c8e827741 +415e75e991b01242469cd33d7d09e326 +3c137145525cff48fbc6db4a5140452b +d62fba4ab91fa5bcc4095ff97a6c9fe8 +a05dd1a5f7c030c74e4593fb8f18f0cb +79089255158765aeec5fcef88335c136 +2908d9dfd261bf97f63ca0c4f431f1dd +01edf46ab8cc0796e5dafd51f645d229 +7353c73dcba6a3beb03620ccb68802b3 +33f229381f8245e15c1875ffaad47108 +3d23b4ffe1b853309ecd0b759eed52d9 +7b38146af31c9a2d81c95b41efd3855a +1a53e9a039d23bc5a129653bd03a7778 +e00d04017034fd4c9c002a32436be092 +bebf878f911b09b2b84a359406ff23fd +a7fa3d4ce82fda303db4c0e92a25ff8f +bfaf1fbd860ad549188d71cd85e982ae +19e47714f4bbb927bde7107edc730d9f +367247d45a1052b44b57cdd4e2df73a4 +55b3ad324fc70a0e655d2138b117e56e +7d152726bbd7b3b150d084f61099e7af +b1e823b7426e0e0982ebe3467edb9440 +64b759e6c8bcbd840ec812d9ef6ca6d4 +15587334eaa9a54668859526ef2a173d +bba6591821833b5cc66dec5f6468a913 +d7acd7be0f4a0f400bf396771c0d794e +5c3fca1a0fe9b4eb6ffe3c9d9f8f7062 +f326d01ea1f9cb89d96aafdbf65dfcf7 +6ac0f7d847c757aacd45145f1a0f72e0 +c3a184cc20b828b91a1a10eec15d9f1f +82dbee18794b8b5696c634599a5a3cf7 +eb42c1cc4e30c00a4b3fc8008341536c +2be4d4a4c067b0e7d6abb9364ac01a7f +64d8c175fbdf22de3a58f0fe7a5d568d +64cbf57e30411b123cad22aecdec8857 +33ff1fc9faed5451dcc59e2b33e21f59 +37c8cf292316d659b712e3e792776e3f +90383b0faa3272d28ca32ed25a20b0a8 +241bc126cfebae42bbbb14dd512beb65 +61bfc817d2b654aaf31d48b07ba0fef3 +67cf4ad56867f153e85ffda277f01799 +72f497542576eac0f918c49520a146e1 +13ad60b128af08f990d4de64967f413f +aae9d37af7193f531dd6b5ad8adadd3f + + +cdd9ee8a04fcf483827b3c483356c0be +01053996c184a56d926bfd6df317503d +88d275ae3123e0caae031524e549486c +5b57a2f3ec88af3e1df6e20700f171ad +737c817ef5b28ec06cda6e8f315c5f5b +ad64e8e776e53b04771b562631350144 +cbce7ddc8f712d5cdc633b218088e0e9 +b2c0507286c5c8a4fb7564c31e3a27f2 +4f35b4efaea2857d66755b9f424c308a +c2db6705a7227c99b57e4af0ccaf1298 +e1161971bb06488cabe9066c8e827741 +947661e8c8209827f0a3ec26654f8d7b +c1e50d178f389e4221ac9a8471136d95 +21bea4fd9b25c03b4363c3a09eddbb40 +76a0613508a5a10c24593f42b4e912c0 +e8de10e869e6f8f1f6d78e14b2ba169e +f8c93ce8c3fa1efb737d70304751ab72 +01edf46ab8cc0796e5dafd51f645d229 +f8f96ff7d44cbfc3936eb112c11a2462 +7a66ec6eb910f0de9ef05707d40e12de +e84b5e1984f705f673821ccea796c0dd +3e3f45be57bcb65cafc6165966deafcf +f3688fbb4fa58a9e6c16046e41bf57c5 +58f84881daa432f7d10f2f01bcbcdebf +2d76dd786b831b6e2876a467fbeb84f5 +4041f76e2fefcbe27def47ad7d3b8d9f +60e431172a3368d8372405212ea4079e +6fba8e10504ada973f491364821733cd +acebe8fb0a4058a0189ba67d512d7053 +66310e1e4309c85eb4e7ac7018339c8b +8ed590932c87df8358d789266a08814d +7f93088127b98cafd60d4759df22511b +b61f4154ff299794f52a5e7153946e3c +018a5012f674cce072b298478ef0a9a7 +6520ef400620822c7913c598547eb446 +95c5b1570a88524189d63dd0f571f89a +826d9f074ca77b3526c14c2c1d88c00d +f326d01ea1f9cb89d96aafdbf65dfcf7 +ec84361b95f9daa20c8cc82ec757c928 +e6d9b3ec9b59b75a0f34d4a21c5ad112 +dc7fc2233794b9cf74f52735313a9370 +c18aa39b4d00d5c28c1cc92c65637656 +13c5ddf75492c68962c91afab763ab5d +dd058ec36bc52e02067790a0ea65b47e +48fe291591d6ec39ba47ad755a85894b +d8299b684c3e4302c94d428be5b75544 +414e0494ccd20f84c7fe6e6a1717a9d3 +f9a3aff9cc0d7be225433a36d9961089 +077d8c715feec232bc38e4a127d3207e +61bfc817d2b654aaf31d48b07ba0fef3 +a8de25e1b102e7b0a25881de92f9b30c +e36e04a9498275e7535f9e8aaccd7584 +36c0c9a9f2a666ccc7bd01403a7bbdae +be05aa1b12e3b558de747e470b5731c8 + + +c2f72a6d3ee9b7e45506ead106bc8f86 +3262db34410c13ae4d777e263d779217 +d11569807aab1e77f9bcd96fe375bde9 +c08f79985fa33fe026ef475f840f87b1 +e61deb16dd6421608631ed5c1f671c6a +f71ca57649aece8045b66345a612e20a +48451fe44b83835898ec108b9d9bf866 +98fec0976eec22385c2b735cb80d7448 +b7c27239e68ce6f51296820da50bfffa +60d670dc85d029ed1c3f63693d0d4288 +186dbbf4b11a9684557157006bf2a232 +8e42376332e36c72edf33421d3f12bf8 +cb73d7bfbdae912945ec4d98c0d1ec9b +cfc96587347a77604730af23372d747f +6b1538d4b9683808221f30ddad0414d8 +f5f165bb15c6391fc12ebac3e0a0f3e6 +555145f760c70cf34b190b7214e3b5cc +dd62bf79621c56e565feabc0b84574d0 +7508982db7d5e9e5c7fec3f096de32b0 +aa86f6cb23c2ae8294bcbd6f2315e8ed +c56f3ea358f24bb4e820768e948b416b +769fa149d74c5645c53a89575a1cea0b +dc02836368ba0678cfc7289e18edc4f3 +a3d82ffdba8ca363be0353137e8523b1 +f586fbc887f107945bcfb960fa82cec8 +2da0a1995db50d0752d2e509a3bca37f +78f2edd4512d3859d13e1c90618932ff +10c2dcc555137e38039193ccedfc0cd3 +b0d093ebda261c4ac0a6bb982cfa41f0 +418334153f5b6a5543f6cb5a28f3c82b +bac99d873d638b05891fda9f7c62d562 +021de63f1074cc73a6d83a3e83a5ae55 +c7f8ee7a8d27fb0d86b5386b8cd9a6f7 +199dcc4ae427c0d0e5fbde6c0d2d2f99 +57da58850de2f4591fc18e23473ba8ad +08fc6ae338f02d76f77339c8537012ba +8c8991fdd1f8a737640549006175fdce +db71e7656127c95fb902fc19efa94945 +1b1c896eeb98ff295116453c0ea956c0 +b19954c856288b7fba6053c64471aebe +bc21f92e270cf99791a3fc593cea50f8 +b5084a3059667bdcb2a5b9a591f0f708 +a475fb087b707ca8fa0d87a0a7e38dbd +7c8a83bee9be22e875c81d9fd80097f5 +5146388b914ad2a67ff419d124e12748 +1730063161bdb68161b1252c4baf13f7 +c52a3fd956687b01a7767977926a155d +0ec1da6e17dab4c77535ce765f6b32c7 +7dcd96797a60b5e466e25990e534f588 +1818aababec2539efc6cee74006d4d0c +16202ce23ad23f4f86fcbd0c5d16dea2 +83a5a0b9fdc95c8f1647075e8c63c00a +d95dd0afca51ee1616ffe9550cfc1f93 +87eae3bfbea127d8e90970cf3fe8a9a1 + + +8cbc32702e5f437d6b41e1f576af82a5 +2495aaa5b99df2676b6409c322d2d2ef +b9b944c5fded79cc87f06ff3307a3a45 +4b216ebd4c6424395cb32e9200d962dc +af928be4db8be5d9d1eae35e345d6836 +057f86f1890cfb747464600d498d1df7 +a13e5351588fd0b2d5131b9e0631c95a +39237f6e903801986599c2067566e9fe +318fd1d6e2f4e4e92ecdfd5a0f74afe4 +7b4aaae21fba67db24184bafcc6011a4 +e1161971bb06488cabe9066c8e827741 +3223a430e6448bd2e52570dcb7f54296 +629645b9a1580697fde05593f28a2470 +8c8d1d58bf56ac901daa649bf90803e8 +c98aecab4e971edef9f7ce0dfda1fb25 +606ec4e8caaa77b3b8428f6d048ebdd8 +9898461912d2a91f2b09a7b73c95149c +01edf46ab8cc0796e5dafd51f645d229 +7353c73dcba6a3beb03620ccb68802b3 +7d2ee2b086eb246ec5d5c3f9e10eed07 +322b601af964bf5049308e5df90bf47c +7709eb325cb2fc85c78639890ebd925c +bac516372dd955ad48d9e6a2ef967add +4e33e94d09e7661b999f45ab106a0a45 +9e1c0d69b311264fb17b28f1048547ef +4ce126e3a1d64bf191bcc3a693a4d1e8 +ffba322e346c235095f51cc2308f349b +9af8cb14d88c4c8e0c58571545917dc1 +c1bb1f919ad2fcc7da1726be3b9ad1b4 +79a8abf8e2116dc5cb1d6a6609f6f07f +6e7cfca3dbd1f6e9bb9336d82cfb8c12 +a200377ed90d8ed7c4ca3aa60d0fedec +23e1bba51e40021ddfa5cb1e9f1bd0e1 +ee23c6c8670ec36d43be842613bf1516 +2ec61dddc7b18dbeddf19501c1b06ef6 +2f843d8e208a0a26c7d9e49548dc3349 +62f9203650557bc104780fcc7d9af944 +f326d01ea1f9cb89d96aafdbf65dfcf7 +dede0154d78efc0de11b51e0d673d30c +8cc43a706519260732cf1a54826113bd +5ef1070e9e4b2c6446b6f8ac0673fe48 +1a5d6cf6291c237bd0438f41efb8a0ef +dee392760d4c24a3c7f6a9a218422148 +4f3b5893f55d2462354b05f22afeeecc +74ca1c6583f0481aeafc21696c6df0b2 +74b283dcc40fe9324849847b946a456b +37c8cf292316d659b712e3e792776e3f +9005dfc6f59880a661ddaaa74935acb5 +a5f9828728e016e09acdda4d04b02828 +61bfc817d2b654aaf31d48b07ba0fef3 +d023b1f7ea21e6083db5a12b179d6624 +ed354f0b5f35e8bb9fc77b23851de225 +e9e437b0e54d0b0f215555a8a0aa3691 +8670dccfd7a31fa4c44bc8fffd978739 + + +bfafa0c286495a0e401960ae8af27916 +6d9dff9101358275572a828c358fbba6 +83d729372d5e39fa3939beef0927b2bb +a3843ab046d736a72d29280094d0d8dc +16c302814db822af5f1288b34c975005 +44bc85f4400feb9f9e22e31fd2d4df38 + + +e417a73f5df9fc188f04fea0f7f95066 +dd301d88f6d45a5b41cc61fd0398013d +afe888f46d9e8711233391303a42eb9f +5a35ce341795f7044e65a8044d26d507 +7a3806ed1e98e6c1fdcff3a49f043ca6 +ef96c5c626094743a8d1d80c290f30a4 +c04da19922e5ebb8357694d46076ce33 +9aea864d34dd785efb74c35680025aa1 +adbb0c69548505681300e379ea664422 +c61faf2b4ec45328f71288d22f340d6f +e1161971bb06488cabe9066c8e827741 +934848d5f04b5ff90bad9e28be28ea35 +f3efadc2007bd34bba30f768d4b1a39a +8ea801c669f920990bd11f13cb62374e +1643d2922941fb544744ef2b0e0663ea +a53138e64ad08cc1eeccebf36b7ee960 +fd52f852f1086a7384d9146e496ee8eb +01edf46ab8cc0796e5dafd51f645d229 +7353c73dcba6a3beb03620ccb68802b3 +6122372b62d8abca527dda55b5bcacb4 +3fae4559bed375ac2e814fa2396a420a +c3fb35dd0fefe93bbf0dfd8976709bb7 +0e0413328da3b3b09b35e539f87d42d0 +02cc01e83f4461c0b39f3d38ecc03738 +13f0930aa714c460e67353b84b9c9440 +3e2cfc1dbeef169bb2bec99537ba3acf +c2cbf29a3bf5761e1fe9cc203e6354e9 +3d9f9e874cfd7dc5eb4cb48ce2767545 +3527c2290d4a4ed9dfc3f44f87beaf51 +d11249b7ca6084480f1bc7da7ccec770 +79f6bf1ab06e61958bd9f59b62a2fbbc +126f5f108a9486ee8e5e0855ebf0f7ca +bfbafc2dcf5bbb168ebb3287462b298b +ba65eb70925e2e80ec40306484253483 +1718dbbace82b4dcb1b9386f80122f8f +08fe2be849f9fc85b4e10ef98d82c369 +4b0317bacbf44db749d81e899c0d0540 +1bc2c11dc61564329b6e8db3603fe42d +7bdb143804ae495aefe794056248cb3f +4684b7959bc8bd0f06824995d2b58ac2 +17e87fef7da4bb3bf6e4644e706e541c +97ac713fe88d2fa27d66324b7c8624d7 +aa3dd95196d0ec83718e74c22d0a0da3 +7b3cd67f5f1c421536def5926d137a9d +ed7a4a7839b90c6a2abc4bda4006def1 +0859c6c0cfe8ad851a94b6d61e52b9d2 +37c8cf292316d659b712e3e792776e3f +eded5214592040c435b2a3316e621fa4 +94a4ffaae31dc87963ae69896f1be27b +61bfc817d2b654aaf31d48b07ba0fef3 +a8de954c3f0e5fa84eba747eb8b38ab1 +49491804ea832ecc0e413c7700b8495c +e9e437b0e54d0b0f215555a8a0aa3691 +9e65675700f44cd62f5ce4c4f3aa8226 + + +c53eebc72f2a473a4cf9eb791467f6d7 +3b58c0a4ac2715b915aa50ac61c05048 +25afeceb4591ddebb4e87b139e67f21d +42c1458be4d89e761b4ab1f94544d7af +5ad5cd314dde9ef4e4e20e55f6439a7a +51135a71f735bc70185154fa78eb7523 +f02bb86d60036f5b291b43da59fa4a88 +cae8c75d9a03b56eeeb73cb5ab30ab0e +698983da0fdce081f4d1bca3a399cd46 +6f4a759d77f6e5934dd630cfa1e1d13a +3096e6efc0f60e8072255213788ecab9 +f0235ede716c0e3d2e349d570709b6ea +8f964ed9e1d9d85693329cd4b161c761 +82010fb9373dcb9cfbe181827be1999f +1fe8c016faf2b45b93dd68e1da52376b +d99b7ed121c50b6b1cb0d9ccbc65bbc8 +699d854be6075ea30a977dae0c981cc4 +01edf46ab8cc0796e5dafd51f645d229 +7353c73dcba6a3beb03620ccb68802b3 +a310b65f122ebf1ed5626db731662244 +6c845639a0f7d75104c6841b9a90f934 +0314cfeae04a5fe2c53b979688e15fe2 +665e5d0c3f1ba680add3fa4ee8ec8ac7 +245b7b5f25040fb19ebaa98f48842c4c +4d3d7a0033773f9616359d082bacd1b6 +f6b053852fb105d2ea5213ba6dbd9055 +354659fe434004a563efac3f7d7bc383 +592390249828efaa7ec2504c95443f6b +a18992eb18869c3e2d3d126c43a3b69e +1f3bcbeb76bd3beab87548f5d82b9aab +cb553c2818b8a0c7d5491b176aa1d078 +aa4289a4b2a40e945d8fb97a36d8cb35 +7cee25d95fcd12dd9f7f717f055ba596 +55d24007a85eb0d6649e589f8b7c2a69 +4ae8b171fb58edc6ecf2b989f80f7f82 +3324468e48b189f208e48fdb75ddec2c +ce7a054e6395f10c07302e131d423dfc +5d2f947356ad2e627c7f561215b0eb6b +a3081373de56ecb0e2d109534162b480 +81a766001a796c1a674b07d74c6af5c9 +f75e9eedf0ecb0b94e5e13badcbf3ee2 +b4d6315de3110705a6e624a11d78d872 +116c07ff8a67e2cdc94c62376e4290aa +da0fb653b20f60acb1b32e763c94ee84 +90d24d0196c4f08a95dca839ad18aa08 +76547b492897ceb39b7ddd6980e69481 +37c8cf292316d659b712e3e792776e3f +5b83ebdbace1542e40a18420123ef94e +a6baba8bc577b7c3cd822a72eb37bcd0 +0ef185c1540968b65504846f079f902d +50557d6fbc52731e332d6e12b04c4a19 +acd11fc17de431d151ba507c7da0c945 +e9e437b0e54d0b0f215555a8a0aa3691 +338d9c56e6653c910dac441e3a519d25 + + +4ca616e0d6c5670ecd96c95f87c0556c +63b148030256683a2847c15ca0ff97f9 +2753a6b04e03bbe0d90253a41ca328de +e9e8da8d47da8fe64219b0bcc638be8e +36a41f0c293500e03ae060c200694f68 +ea7814c2ed2c559a4a3e1e26717cfa5c +4d3cee00481c7ae0bb359e0350ae9998 +15244510a8a8d2975d9415fc162c09c3 +df70da4e6b594d272466009a0805c781 +111adfb91bfad1aff8452398fa4d94c3 +e1161971bb06488cabe9066c8e827741 +cf835eb765d8133ec1837f6b6abd84e0 +67f1164671a8a5309bbc81f8ce23ac70 +72c3cac168a19a773c5c91864fe03dc2 +4caf17ea984ad2ae9543ccd808608657 +ba8c8ff377003a9e4debb6092bd7cef6 +9431dac878f7cbd1faa44c7b1e9df9c5 +01edf46ab8cc0796e5dafd51f645d229 +7353c73dcba6a3beb03620ccb68802b3 +2c0aec3fa67d9f058c72bbf8980af06c +6416c58b52a9d2a2ef47e7d43aa655f9 +b5ac41b2d7993ff82acb9a8358a17202 +7d1e66b229465c0a5803e21b89c588ad +247a029b7ddc571ad7c32ee7c7c3bd9b +0f98b1f68cb968ba79071becaae05ac0 +c3666f4bf323f11ef7117f2952a0d6dd +74e40bd84a91dca58cd3254eae209778 +57160d6901b4fe33370e429c4cb06aac +7ebcb8ba156c42fa939d725c74263bbe +91d23747969a9a433bd083b7238b20b3 +517a808449770e37ef5574f7df9072c3 +a451f2d5998e70bfdb9701c10e88787c +47bea4b1193eca7b0bc61b6ec6134076 +1f2dfe32a45c0cc407b1e41483875c6d +ee9d219e267ef4d8c10e50903e01519d +73e4194b6f864e4aa40d050701cac744 +0b2ff41b32ddac3abfdd5615b520392d +4a64102233f5cc6a326d74c738ed1333 +5f6ec2197770062adf2c60d8b5daa5f8 +4665d1a3d64f9139e3baaf973d5a69bf +4cb8973f5d163980e75092f1a46a74c4 +cc72f40a56021a8dfb917af798a0f053 +a2176e70d49f029e4ef345e258cabcd2 +1ec82f780ad10ccf1017f53ad0a982fb +9a2353991fa9c9eb24f8a542ac8bd396 +1b1e7a275fd686cbcf0e9cb3a365f717 +37c8cf292316d659b712e3e792776e3f +bcc80798b175c7483f1e317d4f6c5013 +37ec4fbf4d91e91e704fd6ad126bef65 +488c207a47c487177bd0daa244825ba2 +8d1ce4b7737e2aa076652e2f2ebc74a8 +a18eab1b21b296c22be7ab16725e7070 +6f4a8eac062a712115422039b36c0fa6 +ad72b32fa88b149015f6e9e0f8fd9411 + + +51028eb63c941a363212d26304482443 +59c457c3403be06b525dd7b8c427701b +c9ddcd58c067a81cb797a22327eb9e9d +2feb47d5971e591c7c7bec5c73375f9c +08104b039c63219c3d9cc87e3a9c50f4 +83e0a56fd0474c5f74abe04d97fab566 +e2e02df3d70ee069610c91c01b58f9fd +abb2167a9ce243f9e99fe3fb51235fda +6200232eb997d2423b448f01886b2cd6 +a26efc9340e9d49d7cb1e77bf5209503 +3418d50e2adfabf40c3272735e88bb53 +0dbf0ef8aa513a98ac57db52cf1e8475 +908393b9498ca852b3ff2bcd7b51fb7b +fc93c901c2f354acecee3df36e4183ac +7de0af0a42df53860e39ecb7ddcdd750 +12ce44e31ac8915d825d317ae75ade29 +4e84d5946737440c459dda7fb3de8cd1 +01edf46ab8cc0796e5dafd51f645d229 +2c24fce2ded9cac44faf21c4b92f4d20 +3d2827f1743d8cb221924c2d3fb10c83 +047c5ce175245236274011b316991875 +5bb64010fefff4ea7f80e1ab6a6e0122 +0a5d03d3353fb41864eb8e4d54626624 +9404a8ad606c742d450d0e6453cb89e4 +4bf9745278c2144f2fbf7068266329aa +7952397f4d6f94f800d8c6d06b4067e7 +593254c67ac4f2a951b747b973f2f9ce +fc591b6dcf00663001336aeb2459e123 +e4db6e579229e5a09187cf34ba3b680d +480649eb32df3e359b5d0ee343afbfcd +889559e9ea97f65ce01b88af64a35834 +f36f7f708ea209d9b74902e9a4035cdf +d68cb120db7b4a19e062207fa08ede7a +0f18fd5af1f9ce788f5053e652842feb +dcda1481b5c89ed0fd1f7628b8e8eb12 +095369f2251e8e55e7145aad26dadc0e +6c85e1b7c3071b7b02ffc45894c49d19 +a72a089766a7cf669f6b68270ce8f5ab +0f3be298d7900f5de3c59f71e8e139dd +a3a0d19574f8e53491fbf4f43dd16783 +4ed0ef2836195c941d69077c1441f060 +2812e35079d5b3152e9af32c87abeaf0 +4900f43900b2677888e3f7ec9a376c99 +9c8629c3110dac7a00b21c554e869282 +607e87ee590ab6b6e3c1f2017f310bb9 +9e66d8ed4aed4cd0232745d064fb5877 +37c8cf292316d659b712e3e792776e3f +f8e129f6639f1438ec6f104cd0fbd19b +dc0832a7958eaae7cf4e423bc578f3a6 +61bfc817d2b654aaf31d48b07ba0fef3 +f3ad2a89b6c2467b1e40c0b8f21174f7 +4af0397309a414beb84a05a21fe963bd +e9e437b0e54d0b0f215555a8a0aa3691 +69fb85ac30660331b5ac561d1a885d0b + + +b518752ccaeea156acb4450b5263c2ae +9e04b2cd1b93f421705034d5206749d8 +af56ae8f3240a1cb51bf1a10154a81ab +a886ae14055bd6191498cf46e1e21848 +c93c4c89173fc683504c599a41e8c128 +ba9fc8cb488b591ac546ac6a5db57ca4 +0178ccd0294eac78322bcfb837883e9e +81ef576837cf88973f407a18f2bc1594 +fbd7c6eb7947061e1cdb26596aa97f7e +e078e6e155aeadfdbd41beaddcb80abe +e1161971bb06488cabe9066c8e827741 +e1cd0083dd8b6104b2814cb5fc8c2ec4 +f67bbb49377ad41691a2560e5db59c8a +b8c0a0b89f697b6e2cded307c88d06b1 +6ddb05883d36f3d515a76733d4973a0b +baf38b4ec10a43d12a333a1c2a28224f +4b2f37e2efbc07cb96a3c17df7f132b4 +01edf46ab8cc0796e5dafd51f645d229 +7353c73dcba6a3beb03620ccb68802b3 +3cff0fca31b6bc15881e15137184a92e +14284138d5f94467eb25db3495ebd96d +a42be7db361dd5993f28868e4a3f358f +512699b0027618a3031685da1faf9210 +f209f3bbc245afc75bf1fe1c2b74317f +d9e5975cb7abbf8cc23b9ae0909c1291 +7bc61a1f1daf334bc893dd1f0b05ca37 +68d377f9e5f75e719df27def2d880fd5 +5f93e31d32cd99d38e3d59c80b4137ff +6a421190f518462e8f8bfc5f22da2b75 +de30767cf0a5d454269ab9986fce13c0 +5760d742e1868b44dc2f258accaf066e +96580781af2e64271588ef6d49f05d89 +7d5368b1bee0e7367f815ebdcb1ec139 +1ca4e724a542dd90368a4612a878aa7a +74f49c52ba746096316a8fabfdd197cb +d3a94f5738d82056ea2efafb91108df5 +68633b9a396403744b2f3e762bbf5a19 +f326d01ea1f9cb89d96aafdbf65dfcf7 +f07928593887f8dba4b9570f79f39997 +8ad7dc8c62da0c98fdac28dfda1db0da +b37aafc497f4d18671690df0e9c89f8d +b013fe1cb4509ffe516d6a7d1aefb30e +8cc192424d2a8a3a8439cf6c9e9c866d +d32aa2e1c7b5bd07001c90bc13dc7b50 +6f225dc643f02ed2509b857ca08a1695 +1668f8a3a4b4b453e9510fef09cb1603 +37c8cf292316d659b712e3e792776e3f +11f6ca263fcfb41af8c4d7bf36ed99a8 +f50022077f0dd202d6e2b9f04c9e12a5 +61bfc817d2b654aaf31d48b07ba0fef3 +d303c8174006e885937802b900be3eb7 +240b11fcb5dcc2be6227a51c45701f86 +e9e437b0e54d0b0f215555a8a0aa3691 +f1f34d8c0f864daa5e8ab56801027430 + + +9ed02a80ad8488553e593a4d126e9e57 +a7a17bad11811e39b0164573964f3c18 +9ff187bdce93767cf2f24dbb5b0a34c5 +c04364a46b55ae75b65db731f040dbee +5437aca264069f35e46a3fc46f04c2d9 +438c872ca8fdb808934df640ad361350 +9d95d44e6045f242b1ad717ed35f195b +cf750bc5baeb59198423a8ba9039fccf +b50591f99fa324afaba5e4e1d15829f3 +349416524f35254fa72144bc7e08f9a6 +8c6845892177aee173dbaa73e8cd8ddd +67e2f3ad372e14f9854889779cb77a31 +ed60154cc61545d8e209e9bf72a6ab16 +d80451231c86c2884f11e09893c09f28 +bf17f85b9a301749c310ea52feb41c40 +094e6c7f3663a5537fa5c043980aedd6 +fa8e0f7bba38c31294493c647e897ee1 +7a35302fc4f38830f93e515b9ba74c36 +c336f582881f9f5ee8c96bbc8eaced3d +ab86205f57305fcb3082cdd74c322e75 +df962d37596dbd1a3142fae9eb418bdc +70e166ce8c734b2c4b6215bef0875c3d +3085719cf550230628a2323239f90058 +57e889b845da31e6487290d76a2ee969 +9f7dc7764ae8426026aabe1dea8b4271 +3ce3789f8edd183f821951c1a8d61e83 +371f6e022e8e7739b420adbeb946143f +7db02bd09836446eda5edf8ae120cabc +8453f00f699ff8c76db82202dce0538a +9e542ca6be712dc1134411f391f2ef6c +a43179ff95cf512102b83c59e1750325 +a62baed5e31f7048c3a29f3e02895a10 +206e00a72ab802591b922003ede1a397 +7e597768c3c03c500ade52792b2cfee6 +12603b2b8bc782adb794478213a4dd96 +3bdf42551cfc7490ee50be1fa1a43a8a +be736921cf578fe796803738bcc7c06e +1008cbc1e61ed90dfd79c57cd620c92b +46f6b55d98da9ef1ffec9b1d1a6125bd +e4e03fc7d82d2da0126d8445f09f61c2 +7a0cedeb2e3c160aa33e736ebba6059e +fab14e1ece001f18e03308c4abd5d7b6 +2bac51be88c59c5ee21511836859e221 +0889424a15f7ae4d5147e680d379e3c0 +b8357efaf2331cd36af04b80256e3181 +5a0de7d0f34fd6f63ae32d20e0a32b9d +a1fe9c904ea0bd6d6ea490b977432ffc +d98e38cacdacd9d7c74df773358d6e6f +3bb797554b6eedd86f67a0c36e9918ec +9afb68804040e5f7d92d7c308b79f770 +d7d2fd96c741b616945e848ade9f9539 +7767ff394313f1229871b8ee58c26a99 +54b0579451c267a77b8d793e21540be2 +af1f4c3b96562f5bf2f6a74c89f86c30 + + +9f353748018e5ba447e78c29e51b8e75 +9e04b2cd1b93f421705034d5206749d8 +accb0ffe1f4fee0ce0ac289bcb00ec93 +e18ce0c602eb14be899c6b57bb0dd58d +916afe3783367139a523c568386aec6e +3d7d993b224fddf835a22916ed2ef453 +011dd4cd99ce4c2469ab92117dfd209d +81ef576837cf88973f407a18f2bc1594 +e31524da1a56945a3c72bf5bbcd131ed +41aae1ba2b77aa61bb7239a4b23e6cba +e1161971bb06488cabe9066c8e827741 +d4127fe7986b34820229a0d6094b7259 +b0941e7655c17df6b1db3c8b11bd9ba0 +1b9a68919f92da92e796fc9ab8706f07 +938dbb92e0dd5d3786d4e240f4846024 +87204bb4bc4b2de9530578fce343498a +5f3ca3d85366612c464715c1c1622b69 +01edf46ab8cc0796e5dafd51f645d229 +7353c73dcba6a3beb03620ccb68802b3 +47641a434e1180196738903b96e7d233 +9f8adf4e7324896d5212987036e78551 +a42be7db361dd5993f28868e4a3f358f +440aa4c00b3aa380eefa8e7e0cb82b92 +e07279da1605df1506412455d57d02cd +3e595b3b8b480b30a357aeccb6de8615 +7bc61a1f1daf334bc893dd1f0b05ca37 +6be5dd950754ef5842f346dbd437d289 +5b4959ed0c32ed6a409144c78c8b9fb4 +302604091ecb8d90e263016888535e2b +6667b5ddef7de30ea319971fc84edcee +cb124d7f6ac3cccee9796fc4b5b7df33 +6d144a8da6b325f43d751859f74df622 +5d2f7e3a9d6f9302e32bc0642bae009a +1ca4e724a542dd90368a4612a878aa7a +512c5e594f861484430c9e158d495360 +861128d94e968edbe12c4c8b9671e1bd +68633b9a396403744b2f3e762bbf5a19 +f326d01ea1f9cb89d96aafdbf65dfcf7 +594e7c08fadde5ccbcdbee9e823149f8 +24cb7bb2fbb352110717249a01f55773 +a09559da6ee2d43afd860dd5a605bdd4 +4b5cef6e62a55c9d6052852ee6902202 +0ad67108567f99662f7dabc9585331da +9e73e48da807bd19ea533c4e65a2e6c7 +6f225dc643f02ed2509b857ca08a1695 +1bb9e415f4377ef86f5a32febdc61635 +37c8cf292316d659b712e3e792776e3f +291af0a572f93f3477238440d869b440 +c1207812257872c9d54a8e5d68ea57f7 +61bfc817d2b654aaf31d48b07ba0fef3 +215775525bb7151acbe2d9f8bbb6fbcc +c847d410f9e927b8fa9a8f2eb8294cf6 +e9e437b0e54d0b0f215555a8a0aa3691 +56d8a0b2df579f5cead684b83fdef191 + + +bc71e5fc00ccb87cfcca91e37872be45 +ede4afcf04f50d96d280201986127377 + + +452c2f46a752ae7039d79e525adca108 +5704fbd24a98790ea0d56b4cb443391b +639e1e59ea49f8f9b1bff40cf3404c64 +0329d5abe59198c1d8786f3fd7820846 +6e96bbf2b6474ccf323e4af3dbb91d83 +1b77a01be8677a6f6c86911225f42fdd + + +3285f8a7c9e4d322a2068067f1fed85a +4ec416a711b43858d609a95b741b8a70 +f02782ff85db88073c2177159be252cf +f4fe0457c05827125dc44587afcfc721 +9f0b0c6a5186ab5c5da48172ae76194a +f29bed8e6fd1c99c7ac41a24fafa9245 +5d22af2d16433442fc36311329ba9d8c +827a5e657827104b2565cfbab31ecfe8 +10b082ab22eba4b151b5323769629e4c +b44cece9acd980fa9296541427b3e5f3 +66a468eae09e46ab811ed2ac43f7baca +f179873e459544a3907d05e44d8ad70b +6494487996f49d70fba56c3ca833ebf1 +2882689c7d3e5e0c95852b4309f127ab +2557c289537cf6b04060753a3e0b0274 +3ed38182bfbeac7199bcfab093a2e0d3 +5197d029a3997bbb53042f1542bedac7 +a1af09f345b98fac90247a072dbdd78f +10d13de263c10784da8c24dbe9f58a1a +ed5b68c154af9eb3b251b8de2b929b8c +0322f5bdc95433d78adaed428a0234dd +fbfa69af145d73c89398e4970a9bd2dd +73805d6dbbbe72badfbb00781710cb5d +19f4a42d4fb2adeefca97d8e25419e08 +0dce8f99073b5b1da5a7430e1175d09c +e65a52cf4d36941cd248253dcde969c5 +323b8740b1b8878cdc58c7e24896882c +c566aebe8e1ebaa5cc90bb7b39f2fa28 +c4abfd085229f64c2e3c7a6ff445ca31 +fe93b7b0d56abc3a790bb13850ef4033 +e46061d2ad151668fbd00edea86cfbac +ebd6de6f38a691c7eee2982f0722884d +1c33df12eb82b93867d4c8acaa2e24de +d64014b1606f6cc0d87d76a2153954fd +f9abd5bb8297bda46368bbe8393a2058 +ebdd4f294db2f8213d891402300e656b +b1bc9232fe15e486a24eec37b583bcfa +2b30da3ff0c32ac08a5c37f4321027d4 + + +b518752ccaeea156acb4450b5263c2ae +c3e50ad0d4c93692a2810e136ada70d7 +af56ae8f3240a1cb51bf1a10154a81ab +a886ae14055bd6191498cf46e1e21848 +c93c4c89173fc683504c599a41e8c128 +cbc3240e761eb9eea5e365334290643d +0178ccd0294eac78322bcfb837883e9e +1f319794fd0c473af4105da7eb800395 +fbd7c6eb7947061e1cdb26596aa97f7e +e078e6e155aeadfdbd41beaddcb80abe +e1161971bb06488cabe9066c8e827741 +771c74b2230182471812f2cf4a5b63ee +f67bbb49377ad41691a2560e5db59c8a +b8c0a0b89f697b6e2cded307c88d06b1 +cd6b592800ffee965a5a3c733483e778 +d976f528676688719bb4ed9da722c798 +4b2f37e2efbc07cb96a3c17df7f132b4 +01edf46ab8cc0796e5dafd51f645d229 +7353c73dcba6a3beb03620ccb68802b3 +3cff0fca31b6bc15881e15137184a92e +14284138d5f94467eb25db3495ebd96d +681bb6760c742ae699ed900dca34241d +512699b0027618a3031685da1faf9210 +f209f3bbc245afc75bf1fe1c2b74317f +d9e5975cb7abbf8cc23b9ae0909c1291 +eead927af63207df007d30bbefa0bb40 +8d43131041f3d3667982ff5fa6227d1d +5f93e31d32cd99d38e3d59c80b4137ff +6a421190f518462e8f8bfc5f22da2b75 +de30767cf0a5d454269ab9986fce13c0 +33a07b8f1c6f7231f2a1e2d5c36dd79c +96580781af2e64271588ef6d49f05d89 +7d5368b1bee0e7367f815ebdcb1ec139 +92ac14a3dd5307e6bc4429f625ac3f5b +74f49c52ba746096316a8fabfdd197cb +d3a94f5738d82056ea2efafb91108df5 +4e186ea8084c33de3fec3182f57150ec +fb5913e34a812d5fdf9e25b8ca8c9fb2 +2c739e0c5968cac73cc93286aa8dcd3b +8ad7dc8c62da0c98fdac28dfda1db0da +6b43b9d8bb99cdff24204847f612bf01 +bf4755dcad4fa5a295dd87944ea59531 +8cc192424d2a8a3a8439cf6c9e9c866d +3122c8015a2583d254fbdead8e4fde52 +c95d9dd5cdb6d9a6824a6bdbefb48531 +4ddf34ed8a507480b8e987e8a56a18b3 +37c8cf292316d659b712e3e792776e3f +ccf43b38dc670c1a539500a2c0cb5dc0 +f50022077f0dd202d6e2b9f04c9e12a5 +61bfc817d2b654aaf31d48b07ba0fef3 +d303c8174006e885937802b900be3eb7 +240b11fcb5dcc2be6227a51c45701f86 +e9e437b0e54d0b0f215555a8a0aa3691 +f1f34d8c0f864daa5e8ab56801027430 + + +492f5f2477e6f0e03e3f6e9c8ae965fb +9e04b2cd1b93f421705034d5206749d8 +af56ae8f3240a1cb51bf1a10154a81ab +e986bc80c8b91cfe802bbbaeeafcf8e9 +57be7323a4ec7d4c1cca87ee723d33a3 +a75b3f1ae8c368d2284a5b61ce2ade70 +0178ccd0294eac78322bcfb837883e9e +b5da502be0ba50ad0f30c4596d98177b +fbd7c6eb7947061e1cdb26596aa97f7e +e078e6e155aeadfdbd41beaddcb80abe +e1161971bb06488cabe9066c8e827741 +771c74b2230182471812f2cf4a5b63ee +411334c8b92ac56b78d9c26a64c6977d +0c4087fc445c8446d20ae55d2e51f269 +826390c0c8bb5b74e4d7752f777e5ab0 +87204bb4bc4b2de9530578fce343498a +4b2f37e2efbc07cb96a3c17df7f132b4 +01edf46ab8cc0796e5dafd51f645d229 +7353c73dcba6a3beb03620ccb68802b3 +3cff0fca31b6bc15881e15137184a92e +14284138d5f94467eb25db3495ebd96d +a42be7db361dd5993f28868e4a3f358f +c631e13dca383449727f5406a9840e3f +b9d6e13e227b0cd7b338e5fc10d8e605 +d9e5975cb7abbf8cc23b9ae0909c1291 +7bc61a1f1daf334bc893dd1f0b05ca37 +8d43131041f3d3667982ff5fa6227d1d +5f93e31d32cd99d38e3d59c80b4137ff +6a421190f518462e8f8bfc5f22da2b75 +de30767cf0a5d454269ab9986fce13c0 +33a07b8f1c6f7231f2a1e2d5c36dd79c +96580781af2e64271588ef6d49f05d89 +7d5368b1bee0e7367f815ebdcb1ec139 +1ca4e724a542dd90368a4612a878aa7a +74f49c52ba746096316a8fabfdd197cb +65a6eb25bc54efb008b3c590a39581f3 +309215b54637ec841c73ad9cb60c92c2 +f326d01ea1f9cb89d96aafdbf65dfcf7 +2c739e0c5968cac73cc93286aa8dcd3b +4d321f312bd44b67152064696a58ad8d +44a8855614544c8c15c9ff7b6bd20690 +a7f24d33406ebc61b7639babb8619186 +3c262e53abae368513df941815512cac +3122c8015a2583d254fbdead8e4fde52 +5b30fbe3329f2544372a731e50272392 +4ddf34ed8a507480b8e987e8a56a18b3 +37c8cf292316d659b712e3e792776e3f +ccf43b38dc670c1a539500a2c0cb5dc0 +70a55b87918d801a8018d6aaabf25490 +61bfc817d2b654aaf31d48b07ba0fef3 +d303c8174006e885937802b900be3eb7 +ab15fe0f61f91e8805b18506f044936f +e9e437b0e54d0b0f215555a8a0aa3691 +5e857db1c2b2f3c5b49fd68ef1fbad23 + + +d41d8cd98f00b204e9800998ecf8427e +815cc5332012f7bddded6e6b2dbebdd9 +52517073ee32fd105af7fccfde018e29 + + +2fb346f0383dd975a301eca9a423c12a + + +d41d8cd98f00b204e9800998ecf8427e + + +d41d8cd98f00b204e9800998ecf8427e +073dd6df9978eb506bdc3ec8a1895f02 + + +d41d8cd98f00b204e9800998ecf8427e +1ba9555290fac6190106a623ece3376f +3a9bf22080b7d3c4d3a154affe9d6095 + + +bdd80120aa3357c1ac276e8b2ffb81a6 +7cb5f8fa9f76dae5e107abfbc0e35d82 +8326aa93734dd8035a04c12062e68ce4 + + +d41d8cd98f00b204e9800998ecf8427e +a6eb7d29b6a4649096f384711efdf232 + + +099f9b1f56cae48a1b679ed282e3766d +4f6660f6709655f539d4e56721fc702f +8f3173346d4f0fdc7d6fce0702d49f75 +7c588d92e0178284a33300bcd72fc3c5 + + +d41d8cd98f00b204e9800998ecf8427e +3316c57c8a935bed1ce95c87f13ac8a9 + + +d41d8cd98f00b204e9800998ecf8427e + + +d41d8cd98f00b204e9800998ecf8427e +a6a0362ae831362830d6e63f1d411527 + + +e7bf791432a8d6cd23307b92a1c8bb2e +afc1b063010bbdfd5bbb77f32b9bab8d + + +1434a3f561a240f1f6e4d9da60b175f4 +d9698294981e058cce77824d8566be23 +46c16b40aa8611932a4cf9d2a5cdecf2 +f1d99169e9f6f6e4880a4f2859b53858 +209c606e619e5d9bfde03b7964b2e58c +b4fdc3bfa6f873107eb0cc5123dcc103 +3e15daa8fbf0d26ea41f0f77a8210d04 +d5f4a934ec62542d5273a41e8fbcfe24 +b0ef50657bdf39b274b8001cf04f56d3 +be1afaebdbd273f8e7b3513e55062d3f +c6e27842c8603e8d0679cdcef7cb6504 +f4f33b11ea2cb226c62e1bef772cb8b8 +8e9817e29da34d82aa0ed0a22bf25c20 +70b64d3e4c4df1c3fc3ce1ccdec84c8b +f5afc9b3751ba3156414a2e246de4d1a +7801b4dc9a77a0f381b38e75ebb17555 +dc4a551bab5b102e1ae5dae1765e5ebd +a7b15b8c036eac534611baa3c3812fc8 +d41d8cd98f00b204e9800998ecf8427e +656d0d3d0affb188761b87b55c1d4d4f +184892aa2d028c58087c6b1a3dfb4176 +46c16b40aa8611932a4cf9d2a5cdecf2 +ebedcfd1affa6c99dc1ee3056da59481 +bfd7c7727b1f434510cf197d27d75895 +700b5e229fc3df9a79ac5e32184ae560 +24b6cf2901fc39dbb560d3a7285df809 +8707c43fc89f7fefe22678f3a25fd20c +fbbdeff35bd42e8a5451af28bdfb7f85 +10feed256eef9b9ba87cf7fa3ac0ef36 +18e86d815977d05210bde25bdbe95f99 +b826e95415e3bab01b7842bc774e04cd +1c1dfcfd97b07cefb27d60e989f82427 +bbc9e0eea1564653fd34112a84a9d11d +211ae17d31849410f76fbb9a61958272 +c71eb22739f1c20f5e01d9e6b8a19125 +0ccb504a5d257aa989789f6df3c51fed +c2f816d0775e41583bab8dd232c4543e +63e15270fc3b12cdcdfdb21e5bf3c1d8 +1da8850516d4dc2b70f12a878d6fd4d6 +5c23baf9f9eaa8a5220d5e44e68a9e79 +79fd6aac5f40e3655d449e602def2745 +045a50f182b7174af42c3d67492abb35 +9f4702649068d30fc9ebf5d93d915b25 +96e5cc8034742e399eaf6d29a5bbff44 +24b6cf2901fc39dbb560d3a7285df809 +9f88899802a65e6b0eedc1e73fe4c9af +3de564ee11be8e8c77599abd1e3f3b40 +5c23baf9f9eaa8a5220d5e44e68a9e79 +3539d020cf07e76dbb34c2b2f806a318 +68fc31e3d3c0cb616be0cbe585a4fc95 +1f01f59979764124448840d8e3664e99 +1477f60fa99995d7c42c47777c01cec0 +74983831a6b03a0e45b2337ebc4e405a +6f92cd4deb7f23310cf1937b8a707c88 +5632b97f8db47b036a61cfc515dd685a +f87050f67c6a99dbde1f724a756ee533 +5bdaea0c03a407c6cd9f0976674451c8 +bddf314e6c49d62975e7ce1a98016f27 +b141c3d2a3e93cd1db0ea22618e5e22f +e708e33599499c67f77dae22e8059291 +7ead8fd89e3d36df39f57e85d8608aa9 +cb4bb3bec53b441960a91ffcae8cfc94 +7178d620bb970d5b1c9b337ec3fd4ee7 +e605e982c1935f82b08f81c61fa61b3c +a25cf5c9d33530d9f64a87fd6158f808 +c0bd3c7c4e7d1c006b2301eab5ecd948 +bfcf1bc67c5a000230501dec6f83bf1a +bbaaaad3a969fdf2ff5a3c9c56bc7a97 +817f1c669dc80ec3b88418d9a1de1faa +e4801ed3c2784c90b72daf7ac3f7c199 +88028c932d3ec0eedf2bbf060859b832 +6ca183f901d31980b285e187778a82c1 +e5488e9dca86b7ab4b9262bd8d902412 +74801fd5fd2292223cfb6fe7a2cbe33c +eb13cd08105de7c114006ebdfee345cf +184892aa2d028c58087c6b1a3dfb4176 +39316cba629dcc3ab2c1358f99bdc441 +e24c4e4dda0f2aab887b7623013d9d89 +cf14e73ccf77ab5a87729348fe5f0817 +a67ffa2ce31670c0084995a33ffe69ea +26ce8e4aa288aa38bb10865675d08cd3 +323e98d0535d615c49de20b9e4f5b0ce +f6230a6dad952d01c3ff0dde61abd51c +b3a249e8c5ca01d1fa6abf52799734fd +8376d641f582ea7fbf4334fe8ee54403 +5cbf1c11abbc61f829480909d7ca3304 +6e92e55632a8e9fbc63934919120ee79 +80fac46f6e4995ccc5d57172d19da940 +069211010dbdf6973a5a635636c77e04 +e046eef32f98374dabcc7bcf93e1c458 +af408a99d18343fe39335a64aebaa721 +21b6ec907d91d1b24f05fc12e4ba544a +b3a249e8c5ca01d1fa6abf52799734fd +dc30723e9a013e4fd691ff5e3455526e +74aa63906a70c296b099a83a54d050aa +6ca183f901d31980b285e187778a82c1 +64d94d9b591ba74fe34acdc43f4f0cd8 +eb13cd08105de7c114006ebdfee345cf +33c4116fccc3ff06e1c82060d90c1aac +dd5dba0413ea60a3ed433fcfde0e067f +31264269b629589160d5c159e9301c6f +3d64316fad587349e5d9dd0792249162 +44bc863e69f5199f55a3d5b8ab76d1b8 +3c87509df71fb8c41cf31fce258bdf11 +9728bf99f96b44c2f09c2e03a8169033 +d7fdd00204235a28376c74e5c147c416 +9b70d8debaa8065353104c699e328325 +5646544e739cf70d2a716b8eaaac088a +ec187dda16f6e893dba5752cb5859dc4 +80ea34522ffdde39df621f74f8536706 +656d0d3d0affb188761b87b55c1d4d4f +77199a3c1980e839a1e6fb305c691f67 +2fce4bf86219c914595c178c2d7e13f3 +231c3e883b6a69af4bacecfbed2880b8 +2fc34147737d9a0216f49ea04c64d883 +2fc34147737d9a0216f49ea04c64d883 +b5bb7147b7b10e98381c5d852fc9bc09 +7389cc51b77b11b297ccce79048a1c7f +6f140c1e8e4f1da9fc3dac7cc60d6d0e +0138cd67a5d8f6c45c91a89965af4517 +c15c695089d04360c277f3388c347964 +402676b50ec901254f7c559fa14952a6 +38e31a8fe2f855915ddf43831fd69956 +dfd7216140b53214e05b7afbcea2019e +249cca2afef9ab5b10500d3f183acddc +61c9cc60ef9341b6d9b7df4396cc3e87 +1d6f5a7130f379edee3d05617954bfde +5089f53c8644f49a4aaacca03657aede +58f730f9515282ae9c2f193720b06c1a +a6212b5e4fec967f17c519c9c6ce0171 +7714b390ff497c388fbdcfe8c0563790 +f7a3152e8f470a2c450b0f90d02c2d52 +cb1832b4f5fad4d0d1b7d4a8f002b489 +8596a359d59ce8d05e9e1ff6cb9bf766 +f72b01ec596197be77bad01ac6af6a2d +68fc31e3d3c0cb616be0cbe585a4fc95 +b9e84e2be4a774fce11c19190e399892 +c0bd3c7c4e7d1c006b2301eab5ecd948 +adcea0d1b3addc074d69f56f89874220 +06ad1905f6c0eb21fc7e5d9f2ea85897 +eee919753151d6e7bc3e602f1b33caab +a7321a0a32895a3b6a04b458da311c83 +e9a5a0da7f023261dac8a651c3180d27 +0ccb504a5d257aa989789f6df3c51fed +aefe79f17f49fc74ddc7af2f78c2eed6 +04720837e9a79ca6ca6af767d954231b +b54bca6771c1ca6677e21ac8f439c3e2 +eaf4e2f7a47bc0667929e7d0f1a3abdf +46c16b40aa8611932a4cf9d2a5cdecf2 +fdbd41ee38f65a067194317042dc60d6 +81b0e16377b3fb74b9b8ac5a6529a94b +402676b50ec901254f7c559fa14952a6 +b52f00b91b90fbb38d6fadda3aa156fa +395243ebd988a0f3c8397d4263322197 +7801b4dc9a77a0f381b38e75ebb17555 +5f45af7387a1f950e81bec69ccc6b122 +fa603d107cf8753b24f4d14c0f87fa26 +8343464f7cebeb9f11dc710e123929eb + + +7d10d6dbc1f9f2c0c829547ae9dac5ce +ee824cf6776480f19eafb0e66bc37fab +64c990e913582ce96567f2a33b77e5cc +1b1dbebd7debbfa2fdcb976a6eb8d2a5 +70da629ba3d8a2f001293f990b853d84 +54636246f05a475b133a1b451c03e8bc +857fd4a720646781c073435f64e422f5 +eed99043ffbc1636f470c638184e74f8 +dfc73e8ef77f55c693779c678fc0dbb2 +3bf963896c4b2cd3e69ef4b7a2dd6466 +3f991827a9e917caf795807aec7aca77 +b6c301be8fdbbc7c54b90069d3832a05 +6e053d5694b92090c4dabe2dccebbc55 +f77b85727494a7777fb528d4e74a2908 +e65844b0da53461e20fc7a27cc998de8 +3d447751616d189feb8f4abe225e8806 +b72b3f4c13324104a40db6c02693f6d1 +104b3da52c824c4d21fb90aee5445089 +e7752e2bfe7b417bbf48bb3c9b1932ab +6cbf986df4190b98cfe6007cfbed6295 +f8aa78afcaba3497b9f42a82a75d46b6 +940c5e08ee603fe4de989a53b0a3b305 +049560e8c8792190975b0bb73e88d1a6 +9325113570b629298444a50f1e188d08 +36977f1b691da5a7c1ffa27000ccab64 +076b0683bd9709a424503f44e8114174 +1e41211e961cdb9546abcb144ab50c05 +9fa3121592d69fd677ad305d3f4da0ae +5e12871ea910a6acc073e9c5dfda3bd9 +d9567f70e2b5de39cea3f8ae90b73595 +d407f26b3740a52df5e8c619ad06311b +0cbe025fb20b6db195bb6ccb64930de3 +fe142b8fbc1f170c0f2423dc86cdcb0f +a5dec0e545fbe51ccd8ee88a04b765ad +f42f66c04cc8694fc96c6429f01e92ce +cb68b41ee9ba56e19b1fcd031dc392cb +bc05da2ad2e4e02d2fc2282eac9f6d8e +af5bd4a063b464bc5f02f40eae30d3bc +0d2f6939e820e7e2a8110ebcf41215b0 +5883ede99edc85cf16b80a9c0cf0feb4 +dc0411d15f7bd6897ccffaa8c6de7283 +965eee4c7e1404c517b2447649743d0b + + +09ce82fd4e818461e7f6b47501ef80ca +d41d8cd98f00b204e9800998ecf8427e +3ff399136d04561cc27c3d9b839a9099 +8b066f77cd96776d1046ebaec421c36c + + +eea3e104501f53967997a20a03fc42dd +71a38f6508c64163437075c7d5b717d5 +d41d8cd98f00b204e9800998ecf8427e + + +9810b1cef4c1821ed9909a6313cf1fd1 +35ada07724a911510aa0cb2f20b9678d +b88c100ff05cfa1af092543bf1f61bb8 +d41d8cd98f00b204e9800998ecf8427e +0e8f5f08ceb1d48ce3372f323e2356be +56ca1be6d8e073679cc5c98b1330443a +4f0d3ae4d3590264504070de22cef435 +f2504ee0583ce12c58aaff9c569217a7 +17b566296feac4f9e98afe91a74e34a5 +0e9cfb992296aee33204d1d3e9916321 +21c8119beb6f441ae3cee8ba5f56cb88 +f3d23379be8d4c8b6b802f705b8b5389 +f37f6c723a49a7d2e75e4684d79c242d +089f6d1e79197140a55a05a958142387 +96a88cc2799db0e2ec37d318b12d4bf9 +51f7b61c9921fc7e5aa3400ad960d53d +77abdfb77700f022c7ab0d27537e5a1d +5fa9a7c0e8eb9f88642e19b7361071e2 +f4483404356faa91731805a543968f49 +53de27921ab92e2392b47c4b62f2608e +d3c3bf844a6b83632433bc164580854f +2ff7a61d2bbd8a04df03c8e5a694cf15 +77cb3ae7fad9e2ee7cfc00f8cbc7a91f +a0818d60c6be30ba4b2674df5fea75ad +0c70931cbccf0d0f5711e9f5a235ba9b + + +774aa5e83df34cc3f91576854f011220 +af054e807cb59c2a8862618cf8e7a120 +b6167341a2c1b0ce52edcd03353dd464 +f90a482881b094f398cfea3473bcdcb0 +c49bf80333dbffd2ef9aeeb9ccfa700a +15e3b3359f5d0e64efc557727a57bdc2 +fe1a4f8260d6f21ea9f9d26ec154df59 +231be9007edc9432630b44369f2d819d +70780d43b2301396dcdc3ba883615534 +11e6ed8c7c12811fade97c7fc50d23ef +a10710d2b0e460db41c63198261133d9 +940ad1b3ad78d603c00c6fe0fd29158f +04fc9d2d2d778a1c51f7602b043968b0 +43da1a13de6b74b229e87f2254901eb8 +9cf91bb999511aca9c64f1960b7e5347 +a84b4ac562f48fa0db41bb9482328faa +f5c80364beda6369b49e6af373c21588 +d4dd559531b0440a1ea9244340e3def0 +e7d7ba0591d03fb54886081dba55842d +18ad47ae4370502b626a9c97da302c98 +a1fd4462ddf33d9959511b042bc85d0f +4794032e0a29bc4b968ea9cb25dead45 +31ea4b1b268235ac09b462eb15c1178b +d41d8cd98f00b204e9800998ecf8427e +19bc9d6e776897451da4a42998962117 +b65d09069ec446c0014036cb3fdc748e +4fdaafdcf368b7a90527e8e8c5dcf541 +ff9be4f9f663192885df9ecbeff2d3f6 +44f6219f5d9c34527a71c0cccb2306ce +0fbcd2cf77d097cd0767ddf31d97a062 +956a9467791544af1691056173191f19 +c8d0c70a5fecee469664a73b21baad7c +712730dc8eacbcdde49e3058e87f9453 +4a89044f17e6da2ebaa0b323cb3eb547 +fa36f20b7c0d398fc4385c6cbe00c20d +c3dde7f9f3d18dee3ffb87074c27cbde +792f95535c7f2d242110aa879717cf2d +4ea257c73e8f5c6c12fd12d154e5d482 +d3c4da9f47d4872f8c5c3743ab162314 +4eb34d5348d9f867cfade02a16029422 +efcfaeae59e264f27c0a046f83bbea3d +d296cd3a0c82798fa66d4442b0514c65 +e7d410ae84757632ff7fd39171bdb36d +3e287254af9d483cc20dee24c615e38b +73afde9ef9cae4a2c17bee5094028180 +65f1c8f81f6ea903dc7f721720d18f8b +289e3a21483c34cb3c7163a0b0339048 +9bbc219ad2d289762be4a42cd4156e5e +f9de0a1fcb3c19c973e382e65fc31c4c +05d984d940df2e0c8e95726d1adb0138 +1b21bcf3a31e16eb01575d546a8ddc73 +d48919324ecd66c95b4439d87903254d +7a9b60008090747570d184f6185eacba +2ba292598dca941a2acb16588a729569 +be8e24b74d91c7f072a83125fda2e9b1 +b5e3cb6ffa54daa488d049b692ace165 +b8e083dc6318358cff0019d29311814a +80a5fa615caaf397e32a2ca096814061 +29da23f210ded21179562ef771e281bf +0925474a60a7d087119ae966d5cc926d +dc332a44414046c93eefe7a804c155f0 +a1fd4462ddf33d9959511b042bc85d0f +e11278e9bfed8b1cac83f3c09ad6d175 +000a9812bdcde8014b7b80c58b98452d +d274b3bd9ab6cbe0847492e09bc17b26 +dc4ea9364d8efb3881905f68d1ba016c +99aae625b370db00c75bffa40d22515f +a8dcc9c1af18986c1de6eef93bd9615e +2bb6eb2d060824aae199568f54e00503 +33acf6ed14eeaa977790e7123fae9d1d +2b285856d7f32d4c4c9941135e983ce2 +2d5c1290d23edbcdba1c5425bf16a0de +6ce707c982c104bde6300faf6ee61b14 +9e866e4d54f4d332f44de7f26bee7758 +ede909c44382b72a00e182411787c9fb +f79ff4f531fe57fd76a48b29edd49ff9 +93add805d11b487204cdcbf396af297c +e2c40ec99dea692cc920781b8a25bb9a +01e4f38286a1328cb456ad497df0df84 +66d9642b28c9a9f7ea35df000e6637c4 +c7fd803906579e2870c37f7c6dc1f287 +fd785e8184d91ce160641378dc942792 +f91d4ccc0c3346a1d1541271fa945b2f +99884a8900f579cd62619119a011311f +723903d5fccc803cf724c2bc68eb78f5 +01882be75b36720c3dd35d483f0da9b7 +585642a0258d4de2b55bb520bfbb51ec +dbb6d599916edfcc0e69df3ccbaf11c4 +a4747d339b09c350f180530593b4e446 +df30cacec99cd536a46d4d710d4cd0d6 +40566fb3b79a6a5857623d1828e078aa +a6a731b2237aaacd679c87fbc30952ea +2123bf0843c54410a6360155c292dd07 +063fded4fc55af7113065bdb6a6d13bc +6b88763de381191ebd21b1d8f815eecb +5148c1862c4c06f8bcb22146d8ce0bc7 +5993a2e0b03a08005a23ec0bffec49aa +0f8e90793a5d0075ddd55893d5d49067 +eb1f7b820126acf733ad86f742297ceb +5b998f19eee37b6e4b48984a2778a6c8 +90358cba38f3616a16ff65d2ac76f94f +eef6f3da813d1d13c22e834a01269715 +6548fec65e29cc9437d7a69750d06a0e +4624db3734b1e0d2d2daf2e1a3075de6 +8c47d4eb5625b0fbba21f7badc7e9694 +dbea0c8432a121b189f443ed553ac590 +5aae4c3d4f831d29c58fdd1ea90b414c +c8edc74a6de1527d12f1552554b3965d +fe4eded2e82a49e7eeec04a57c0eaaca +e552713e4d8746959be3840562cedd4f +7cd3cb27cffdb26ec9bc893879022fa2 +79bcfa4d08d9b0480e45ce8943500b75 +00705230d6d3a8a360cf4ccebb6b4808 +3e388f0f6a16e442d7217f7f5ac0ac70 +be2a5064570cce93cb27f66e6c63a450 +7c966e0ac8b005230d2dc6f9c2bdfb4f +89feb1c83c324e468f77f547afd6dcfd +8341937457bd3fe384540c016f44ff79 +e97837e90f79a8c3b9be2aefb707c986 +b04e6c6785146e49bbf046137761016e +bb3cd2dcbd5d21f1ca284ffa1ad07831 +f94d172647e3462d128294621a43389b +d24f6b1b1a4167bf6d452edf43fc43f9 +9b8ef286299fa6cc52c9c1117dc116f9 +f05b20cb0d940946b92d336b3ee16230 +6f45f24d2c2847d3be377ec767ed6740 +560540e2be01c0ab7bf34283ad36e8e0 +e1e9cd63c97e490b1295848e3b6ef08d +0bc993144907f56385fe151e664a5940 +1dfb81be162137cee56899d3747d3918 +3009f0bd6501a7e643490484aeb4fb7a +8da0e7aadc18ba23942146b0b2788fe6 +cc2c1ba385841b4e57e7c3f8d2bcfc52 +0c3ae02d04c3fc7100c51aac8de78822 +20d08112c34bad25f91560d50ab42afc +93e655e7608796ac9d75390f82b58d19 +73e6adddf2467b4c68caa18c8d6d6c67 +4649a28d1a99856537807f623692f5fe +27b26796c01e90c01be2369a04026d60 +8feb74c99d8748eb7e8154762c615561 +1247fc5abf94f9875f6a322242024412 +c31a9db4f598a1edf31700198ec50d26 +357e70827abcd6e1b13e310b22a72cbe +cb4e550f50734e444aef59bf6439c1a8 +85aea855ac1f3e1011d2362d3cfe59e3 +0531dafd783b28ec7570e6e1a311acc8 +afe6a0affb85e6afd2cdc8608dfba913 +eda152bd86c12fa304b0d489d61f8f00 +e7c9ec2d12913127c49c73ee2a643515 +02ab79dfd7f51b02b60b860b7ce8afad +49fe0d286d5b87cf808bf352e5882b01 +7a5b075120da6d2eed41cb179255794d +d4b3d1f5fc991b0582f804eb4478881f +67f5efd3f354d95140a192b2b512e417 +8f4b85af8b4e91a099a99ae6add93734 +c69ae88d065c858479db70c93cbd59f4 +4b47b691cc2ce2801de96d512583468a +aeb2b299359fb35bdea35fa92ea24da6 +70c946e159dbb8bff23b0074ba847a2c +5103ae9bde7811dc675132d8ea32b57e +dfd395e63be421047109a6d2d50f8cb9 +a34d4ed87f508bb060c12b369543fecf +f93e4f18a8515ae7c23e5e6509fe7327 +2dfb77eddf39f9fc6de5677f5070d308 +1d88c537abadf776846ee7004edd7528 +aabdcfe7e06c7512c2b386fbd477b7ad +35df884aed8ffc1bd04843f914bdefe2 +89feb1c83c324e468f77f547afd6dcfd +e8066d5925cedcee8e287efda7be0b83 +6aaa3a31de31e3a5e9e426364a6d750a +06bbeb64c794faf5a9506ead75159d9e +74f4000b96dd405ec94f8fda2981f7ed +130022e7f6155c7feb3a8805eed1fa17 +ddaf35fb0f5f6de35551c674dce5af13 +ca82a0b827867d8e25b3222842fc9290 +b26600b0e4fb912d7a7d0409d98faa63 +e34146dc177448781e5f71137230f06f +15cff0d1924962e116bd0d6bcaf12bc0 +3a981c259bc9f2329c96ed7419d096c7 +b332396ea15d7546b048f5ccc42e7104 +7cd3cb27cffdb26ec9bc893879022fa2 +9bd382f432b178b65ec6e8f34438806d +3fb04ae5a52c47da617faddb535e463d +43bc0fcda05ae2bddd4daf5a07395889 +ac382f23e177acf31f79ce371101769a +50c5e7bb6d90547b30c88a38a2d10653 +29e38139f43d33ba7cc2ee457fe52628 +5becc14b56e314c5f35e99cc6eac3457 +cc986d5a5621587f7d86cc3d60338083 +8233503381ddf79b86cb6f312f4aa4c9 +04b609096db2728072f46ffc835a581c +692688f55f454ba43bfb627269347df7 +4f92ebd3e210ac270c9d4a9e8e8ada1a +03e1ff43ea8046535b3a1e28d2a3d5b2 +cc7f036fa37b5f518b78570821a91d1f +8413bd4ab3429ac93c55e76ce9ff3ef0 +72c68a77f9cac4ede5ea93a8ddcad43c +e7f08d9f0c21f9f57cf6a47333bd221a +98297a39a6394970272a8bdf37c2c467 +05361076eb73c940aee3a92fb488289a +cfa4068beb4bb0a04d95faa83d490b1b +a1fd4462ddf33d9959511b042bc85d0f +a65c16f8dbdf88a88822ebdee750ffae +a0c460e80ae4880e9c1c32ae397503a5 +ea9cd085245a4c6048bf654b5833a3e4 +3fbd3dacb5989dd794dab5ca6ae802ba +316264e658900c47c263e62642485e1a +ffdabf9c9d9a11a4e1070c3de6565306 +c25970d4e32e1ed12911ac276dce9f1d +64c80bc09a3568badbb471e4d7a8fbe8 +5f1f96b69c23bc6d72f8d7720c5de271 +377cb88037021a342c2db782d3718564 +a1cb56d5ff9ea5a9fcb5f879460f8356 +e7f08d9f0c21f9f57cf6a47333bd221a +448fe3d8d40dd9524e92308363fef9da +997c11c97bfa8a076bb99c3f0b0ea340 +aba9db6d3ab58060e1399c434c169ae1 +3cc54618412944027a27f4d573ed0b47 +c79db6af25efa8e7d808c5c3e824dc87 +55ecbbd7019bd1c65e0338e30e354c94 +5a8689e206254ceff9af7228494442f6 +b3277971df94b3cbd68f45e6d7078b91 +12ea19cda7f7f76dfb852ac21ee8121d +4c811494c0413f7ee4f513c2f6622914 +c226e7caff0213c3f4a60d70db7ac5ba +a44dba6545c02559a2ecb2cd96a46fe1 +941fdeaadb5826f363cfa6e480b588fc +60087a56245dd11337328404dcfd9b68 +57cdaaa04cf6aa2fe0e9cd2c3b039f99 +af9aab961fd64d502ef4c6c9037a9e33 +4e2233388b4cf5719ece9d5e4d8ee8d4 +30937ce4f4feb25d781acf8f0d952308 +1ac6898f550c88000b9ef9141500ab87 +e9769936000050d61aecb36ba7a1ffcb +331b9a1b7b9101c7be2f660910e6e001 +419a456a86c786662a2e1258ca40b7d5 +89feb1c83c324e468f77f547afd6dcfd +b5b6c4d5152b8fd193b79201b70dbf4a +192002cd9aba7a5237f2ec5a8c8ec267 +23d92cc0b164d881a2872cbf878f9aea +872db466b81af407670160cf7305b3c5 +7cd3cb27cffdb26ec9bc893879022fa2 +b4cda49ef47c67fda458c6b7a187d219 +57e8a47fbae98efe3ac2ecebc93bfac0 +54537764d66c82a60df8647121aae302 +e46207a40de4c55ebee22d22758c7f07 +48d1afcf90739c7ac285fbfb9a442f98 +9d53f377d19984caf020df658621f38b +708fe2c3b7aa7192e8cec80f5fcf8ca2 +206236098ed73e7c9fb4f76c4ec08ea7 +ffdb8c9ff721c1dc405c07c27b06c44f +48180e06410b3f3d59828a1d2f3908d0 +30720d9dc4dd6183d098a1ef7ca6a515 + + +caf1836f1e59187b389ccb270a20d3f3 +4ea78b1e4b0a34928ec2abc4ba8a1ea1 +adfaf6538827b606a08c514b218ce02f +cd4aafbf96f9ca00ec1ea45ce445273f +9afdc285279a1dd3e17a321e6d531ddb +9257a0e2e2099e4060656a32c57b55c2 +5e5649ad914663e345a5099988dbb88d +6151a7c4134040854886bc5006a0f7c9 +73890f2c43db03a3ed7c1f1480a7f2e2 +f3ba37478e4e4f5e6025d24a1f649502 + + +73c70503cf2dc4a268877aba2bfd95fb +9091d512039b8b0e0d8b1a70c4766078 +a21c063e3ce67f82113249d9a321033d +33e3055c8d99a0e108e3dcfafe2f02bf +d41d8cd98f00b204e9800998ecf8427e +01a0efb84eadcfc47482e3f36eaa6bdb +91d7393c46a5a613836330b0f075bbe2 +2056360fe1539188c7e00a09abbc2153 +f1cb6f0bffbc3ca0b63dbbc51f02f5b0 +fab2d153ebc8fec58518da89099a3ea7 +53f8536dae9fd7ddc59dd58e604755a4 +662b61d9e2cd1527c749db30c7a84c5e +e59bace8bc73863ae6abee0fb8e17801 +52d88dc054798f7076bd0a0c174818db +3114409c3a14acff26e9d052a2b345ea +ca177a7f8289f4ab89dfb86769b2eeb9 +4606fbca4fd91f7c6782dbb86e462c12 +daadeb6fd24e65df65a8c4f11439927c +a54e48ba4d68b9b2eb5152aa011f2093 +8a8c2bf8fd9bb11318840ebe0fab16cc +96196defc1997cade2eaaead0ed86ea3 +1c4e7445b1d02e274233de0d43ad6ba0 +8e011d62a02604e497d41a6b6d87f201 +b08ede2bec19c7a91a16b7320a571c58 +fa410dbce8955725b4c6f9ca7a295498 +f8e14f44ebadb45a20922f45720e04db +c0e8485b73819e041f753b23c7690305 +2dfe1886aaa2a005ca58b3af4375e404 +3251c14ead0497ba25cb9746cd1abf52 +2cfcc31ebd3600aec994a764e357639e +ed0cc9c5c5e4d088be7a1755f07c0bde +b08ede2bec19c7a91a16b7320a571c58 +46b9db57d6e0e660bb43663c34e8e183 +35e12c8186c66c2a2f67846325c4a8c9 +472f9ae9fd09507ef6299f2391bdbf4b +3ce4d9886ebda3d54fd415961d616cd7 +c9569b7d83a6358e34c6a24e6eb3745c +8c49590a520575d276b6a0326149e776 +67707f51c299f4543c60ef1bb6c7cd45 +7fbb218c536d691c6b2d56009f9dadbe +d4392a1e9591b20a9308663373478137 +a3d47f5cd664929981c1484d55115ce5 +b8b49d2126b4a75840c876c0175da3e2 +48703319438cf8bcf4a083ce75582d4e +e8b1b6347c5957cabedcb3318f0178f2 +3ad6532a0682d64f0d1d65d2ce9202d0 +e22fcce83c8d8cfd111e129a3acb8b88 +fc0b12a212a9193b26dd98d1755b96d0 +42d09f0097af4f8431f883bd161bff25 +704437bd4ad9b8e4f312cb61373555e6 +3d667d0964566c0952c7159984118bc3 +c2f13d2c423baed06d1d6f417b009087 +0e2b3241431a43eaf252f31907d318ae +961aeb631f9a41e8401ec7f18a868b3d +7681cab460ea47408a4b60590c3256f5 + + +0c77a1573722d25c3a6c1be4a294de22 +cb9441c877ca30d9c4cb5fd3dbb4bf1e +1c43815c33aca84f12c41fa1bf03ac9c +c9498d80aaff704d6dc9cc8703a7d4e9 + + +afcb155fbddaa030bf66e006370353b2 +d41d8cd98f00b204e9800998ecf8427e +e9708940060441ef594907daf7e51c4c +bd9b10b04302be0e53add9368bd0f05b +ec6685dc57f789909eee81e478235dbd +4650405d73ef5385afa60eea56539fae +a99385ed8f77646021d94ba3facd3a97 +08f95e2a0c68fd61dc33968c49d16a10 +1075cabb9ceb8dbdd282ea942a2aae11 +b5ce0389855bd84afd83bab3343ce427 +b7cfe9e33cab51b6db6b1719b3aef919 +f7a36035b7de1c50116eefeb9ce7ebd9 +102806ae9860384fd3574d4ba60ed957 + + +4b3af70f24c7bce743e39a08dc227f19 +6ade7ce02d0e1a57764ca09034e581d8 +7921881e4e473d7284ea741addbe8810 + + +71b64eb90d9c86236748d5cddcd936a5 +588128822d625e390a58f56f3612f907 +80c455a0847b726d4feef02c6e21c98b +d41d8cd98f00b204e9800998ecf8427e +beeeedc3193a46c108350c79c818dbef +fb07076002b84c04f14f19c7cf6fe332 +9445d29997b70a66fbf5e9430db2b49c +228ee6ed67369e1632959a3b26568fbb +d0ae25b71adb33404ed64bd1a131bfe7 +1d488d377762e65ab4e8b691ba01e5a4 +c25b136c1cb3bb145495c25b35d93754 +851fb8cacaf19c098bc7fd339797948f +7a4337ac238b6eae1362f898c65b4e1d +62becd9604eece6fa4ebb00625ba0e71 +6cbfd3ed29531044aed9b4edb3cca9ad +4edfa5cd18f12847054c5a603c345c50 +8043b6508f6a876a0ee5cdc266238c98 +076db93d2f21b03534bff93f0cb68d33 +be4d3b90a08e3e7370f81557281f346e +fbd3929a893b147ae0940d48d533e023 +e4f9546a7ec7b751aa49620aecddcb6d +3665b03f0b6b099595415224ccc68285 +22bea718176473ab099137f013a20550 +564cf8498bdfe84aa464c7c93c384f41 + + +f1ea44ec38125fab210be1674be67f0e +395a36af64488793bda90511461c1814 +03e2b564224bfb58ff20904bda244043 +b88670b988d1bfcf10d160c3a5f13401 +e997d11209c765632062e4dd60e01007 +d41d8cd98f00b204e9800998ecf8427e +cf1cbaab94fb9e593ea0423e8ba4d390 +12ace1a918403049a6d2fc152f53baec +e217f7a43c29d1ba1baf4fd857565a0b +b3dd447dfc83ed5da9eac072d9998262 +08e1f9036ad91fd03b3199040a865faf +bdcafc9e164189ba7dda7c7740661f0f +4f252769ae9a32ba0d4e1b27759edbdf +8ef569dec9d762a539028f412673116d +b508411bb915ecf32b1a995644f67fd1 +29e72d62c835fdac475bba0a45871657 +d0aec8831504183d456cc4e0de1c399b +7796308f80795e5f6dacef6ff7a2db2e +ab89c085311cd936ebf65d70c1dc73a6 +1f6ec0f59547ec12579adcda6581ecc2 +7c28ecf37a5112e346685801e6f7b7ce +236333d97d78268677b1575df7c334bb +136042c53e8cdcd5c877a55278b800a8 +c3812c74bc524179f4ccf5d2db7b3cbf +0ccf49903689d2f274b8c8a91049c8a9 +608997bad3fdb828797390380ec80385 +f1d191833ef5609e44f2322622805794 +33e8113b927871ec7a037f3b84b9ca20 +bfdc0eda7b92250bbc3af11dc4882d99 +182b591d18dbc56324b1d2099a03ea6b +f015e173f86b564e9f485af1c5643602 +7d7ce82b25e32e97c09f8e1a25dea530 +754c92df6977bb4c96bbdd144f967bf4 + + +d41d8cd98f00b204e9800998ecf8427e +3d50647505ab32beccc6587fb06f32e8 + + +d41d8cd98f00b204e9800998ecf8427e + + +d41d8cd98f00b204e9800998ecf8427e +a6a0362ae831362830d6e63f1d411527 + + +340665046924f127d014eaa81f3ab9ff +fed79fc64fc305b829316f782bcc63d9 + + +f82a70bbaf24434aff018e689e86221b +b15fcefe9e55b29cb20d1b1de229edec +4af4f260359b0ce9c42f77ab47caa6bb +c86760866ffe32b359549745a00f78e5 +8bb0f71417f315eb04c44bf1b07dd157 +00ff70d955ff73a44e75034c2d58204e +a671cca2c79d9135464aa9f41e78b026 +adbd23ce0f80d78b794b1bf265c21e5e +d5f4a934ec62542d5273a41e8fbcfe24 +cab0ab4445e82168d2cac70036925a88 +e9bd2b6f96af06b419608a137f3ffc16 +c6e27842c8603e8d0679cdcef7cb6504 +67f93528ad1ccf9b8b72651e16c2b83f +109a2b54b09935f5a79b887d621533d6 +9f011bbff1b13ec5fd8307610210a91e +5a582fdea5dff2f52a79aaa101278172 +b11a03507e5b25abc28f38627259e6c2 +2a2a087b71d3730e58954da48d65b1e0 +bafaa6d8e8c91f79ee22242ef6fd5dc6 +2862f528c2d606a7c780b75613b90761 +d41d8cd98f00b204e9800998ecf8427e +d84ba5e3a285ad25f96eaf0348e96010 +96964e9e7e85840bc46249a5203eaf38 +618d61f6e80aaea18e3257b4d6cc2728 +4b31ec814f6c455fb7d72f4d32589b3c +ea3351e19d493e039b9cf39dc96eedb2 +a4991dfd1bcc9681bd2dd5688f2e86d3 +3f9fd57c66f10d599f154a0910fec47c +7f073b1e3162a90d38273edab7adac23 +8707c43fc89f7fefe22678f3a25fd20c +351226b86bf32c35da86bc84d37710ac +f69743db39fe49a61499e443879ce394 +d737ad1c6acf2b8e9cf45c76fa750f4c +fb0e617a4e54b963f7c2139efa874d10 +cd26e28d19227f52dbb7af6285f49684 +448c864dda6bfcbb4d6344f5c61a3331 +1c1dfcfd97b07cefb27d60e989f82427 +f46842235b8299668e3c493ea36de3d8 +4f37eab95abbe47905271558dfe2582f + + +adbd23ce0f80d78b794b1bf265c21e5e +b6ca1dfb745e85d611fbe81cccd4da33 +b2fc85cace867cd419febae19227a5b7 +d41d8cd98f00b204e9800998ecf8427e +5e4cee9e9a747519c7ac8d53b72a1e15 +c71ac960b798f1acac68b17b7fa6c803 +e186597ccbb2c1eb388198d8d2a199cd +570463ed73e7c93d0989adca95a0d440 +b6342a142293dc8e125d11ea43972d05 +85a06666e72e0c9522deb1041e2bed91 +b9c630a949e08d2aad90b54cd97276b5 +ae9923bf8191d4cce6f6aff23d7a92c7 +e0074fa750edf8fadaabd21713776fe6 +97a2ce5955231c1b3891e8eee2445c62 +f734bdacbce7337ea1b52b95b295c49a +66657486b605040d066d0dbf6271e14c +b22186030a04c7a208dd219acfe203c7 +35df8b42457569b02c19be41abc87f45 +ee172f657651ace5f45374cc6a5c3639 +22a1d48babdead60060ea6eb841464c3 +6e4ad58de75dcbd3fe83e4680d5a94d3 +37e28b4e4e22b80c1d39d038599e2dff +dc22d6ec2bda0707404afaa8259ee219 +9e95e8dc5850c73b8ced6dd0bca3919d +ea0cd1165069b2c5d4bd5916fe10741d +6d28eea8d332c17dda186d63f9ae2206 +acc3f08c46b50f9b3b66ea831aadf3ab +0ff637bde43375a809e583841634f760 +83063c2136d912f6cf89a173cf71e7d8 + + +b5f3d69294c4e3ab14009488fbd8f438 +53752275e001831a1aa1af926cbdfcbd +85e75bec7eff5d20e41a993927acb5f7 +28d998536cc67795eb0812a1e4c5a6ed +767c14923c466cadc2b4d21941ea8f59 +0ce654c1f24e1190c6c3022435e09ea7 +1c1ba7274a1d26029bf89103ca8dd5f2 +ad8a6bd03901efe7f6d958396fbd5ad1 +8e9667450cc2157e1157e8785b367225 +6d457a2c2911dd34f7786ddebec78a4e +9fe6cd608e8c0099e0aa0c2524b7d8ee +25c9d80f42b34d9dcbfdefdf50cec661 +ae88fbbfc2db402d402b4a1644a06e5d +d3dffe4a4ad4030e443985fa8ae1a91b +c533e3d3e66811df956313981c8fdbac +e6757cb7e9e8dac57b24af8395a27fdf +7f073b1e3162a90d38273edab7adac23 +3f933eec8c50faea176b3e58b18a3510 +3de564ee11be8e8c77599abd1e3f3b40 +2da102ab12fb56c79783cd6b776ce9d2 +b48838edc93500f2bc9d4fe8afe1d6be +034863b5c8459093e35c529af988e293 +8799fab2b7f97df4126c466511f7f88b +cd4aafbf96f9ca00ec1ea45ce445273f +e2c4129a196854d4e004313b67cabbb1 +913a37ec8bb5444e2aebc3e37ac32f01 +6b4556404cf9104d5f44a0b9a072eb7d +e3c2928ed3fdb5baff03efc59a6d35ab +85d404bac8dce61b4c6aaa8023b3a56d +e2e7935ab2ca6ec4318baf7d9e4db6c1 +0bc1e68b3aef15b66b82bc1f4fec9a02 +6ce084d8135a4489f80310f900ffd620 +1b474f0760ef6d41e1ab690197d6c3b4 +de73834d2af73aa83a4f38ff19761f16 +f4e4c9fdfa66cac3028c2db1680b46cd +ac11d37f3fe11993406e0b1b97f70263 +d3064fa8b7429f42e62da1f2887161d4 +7e68bc36bc8c30dd2d6574ff81f00a64 +de2022b0af088c7f59b35e323fd6a662 +80a22ab091f09fbc6bc59839c61ea516 +43d6877df934dd2b5a134e63980008a8 +82e4a2225d7ef9eb5a0c875f08b76ca9 +b28a87c8e679b0340ca2bb5e6bf5f6df +7cce79ebd74e8f71ce17f811dee41f34 +8c851baa2cdfee2a5db7142700b8653c +e605e982c1935f82b08f81c61fa61b3c +43926a83973951e9b41d8c0aab0e2cd3 +c0bd3c7c4e7d1c006b2301eab5ecd948 +19e9a1da7c2e79b9b4d18cb4224bf018 +b61cf71e2798c651c607f48940a4e09f +fde64db4462dcd2dd78d40ac1e490286 +e9cfe12959cf2221fca30764b9e335bc +6ca183f901d31980b285e187778a82c1 +9b143135252fb96d644dbc11c8bb1978 +47efc87b5dd14b2464b2403e038d03f9 +f2930d262bbe944d1a7850e4a18a2e50 +5a582fdea5dff2f52a79aaa101278172 +067a4741fa4798555fa9f528c95d6a18 +549e5f42a9f20bab9fc991b9c74bbb7e +6888fcb054283b54a92755d30b41e5da +b3f7fd8c8d2d111960bc1ce63edd8d70 +5f8d5884338de38e204a4064409de3c6 +db95c9c78a2b762361c7c2c9c1195145 +8a7351ef099da26bbaa63ade1ada8be9 +deb4efac7c2229e79dfac38516e78fb2 +5ff452c2f13647b0f60f9dad9ca3ba21 +f17b1318317516348f82385cc233ff0b +8376d641f582ea7fbf4334fe8ee54403 +1c5563470e1e0a9a6d693d8b00133b81 +7d46d18692c2c3210ae658b71d6d95c2 +30f79c75465c3f1e855a3130c1abb350 +946e88d5612bd35d2f9297a1419ba62c +5e83bbea91f6deaa37b247ac013ef556 +c17a32a624ef386aacdbc3a683f32048 +dad81862c0f72751d6a69a7baf0c851f +26b7b52cf3e0d7132dd00290a55a3192 +f7a04f85dd2d738d83f066800862de7d +aba33e5e98071280db0d34c42349f1bf +acf42861a59faad7e9c5fd30cd9cfd70 + + +d41d8cd98f00b204e9800998ecf8427e +ba1534f65c09d9e2f771405acc34e47d +6964848f5af43d68c6b7218d3d3804f2 + + +90eb802715ce63e5e3ca4a55a42b8397 +810dab21a178dd4bd8acbf6c0741d2cd +275999a532356c158f19fd8a2b06d399 +441617b20516fd76a40c7ff1b11690cf +136042c53e8cdcd5c877a55278b800a8 +33c4116fccc3ff06e1c82060d90c1aac +765e3ee60bd9940d57172336fb3ef5aa +7c26f8ac117a0a43f236900481e8781e +f061264590a29149c75e58a2430e118d +3d64316fad587349e5d9dd0792249162 +0fc42aae027e045136cedefbffb61058 +d19b64d5c33563f03415fb80e3d390a3 +34a3ff119b0f6f13a3cefab63a8b7cc3 +8ace5113760f987144f54425afffd195 +d5f4a934ec62542d5273a41e8fbcfe24 +ba1629cc343a821009875fcc3d23afb0 +5e5a5a366e1296a73953a5a52885a6a5 +5d3b6699db4bdb0b80adcb87bca2cbda +9fe6aca4313338fe6dfb496ee6a37745 +a346bdb285fe8580f4b5b8dd5f5451ef +9b70d8debaa8065353104c699e328325 +c8a144d7c8add753a44e8e8d55595570 +24b51f9de5784485dad0951515dfeb6c +f6c51890eb3d84defb470c9101e0e1fa +7df3d6c0f7590453f08e362b6ce20940 +2fce4bf86219c914595c178c2d7e13f3 +5fdd9b86b6f8470c71db5a04bcb9e11b +9e36c55b53a1b080066d9947a92d2ce3 +9e36c55b53a1b080066d9947a92d2ce3 +8786aa827e5b8b29badd2db51d893349 +7048b07a1e0e0fde5c6a1b4d756d10b6 +7389cc51b77b11b297ccce79048a1c7f +9e95e8dc5850c73b8ced6dd0bca3919d +a9c1b094e5f90641184b3cedc1b2b372 +c5f9a0849fc60d9d903496e6752a8961 +a65c4d66168635b87ecbc720e2a50703 +16f15b5dcb1b133a53de211c024611e2 +3f4c833d31becf6c023f35d3a8140ca8 +f4e4c9fdfa66cac3028c2db1680b46cd +752f4b5e92e81b70cae0ddc1be19e468 +5dffe1f2fb151b5ae395df7c0a8e7b15 +1c081e65c1f4d55f0874c8b3e21e874c +3f995da98d36a1ccea1ed8fec6b9f4ca +798ed84c7b3f98e34a5aa55074cd2616 +deb4efac7c2229e79dfac38516e78fb2 +a6212b5e4fec967f17c519c9c6ce0171 +7714b390ff497c388fbdcfe8c0563790 +c7701209d9f6520754d641090de4ae63 +3a30e6c5fd016911b03b23ad8ddb7600 +ec291d015307e2d4798886aaf95677ae +c39899fd27e0b323e6b1c026e9a9359f +222b20d8427161e4a655b346014e0408 +1059848b00093780cd84ab5e45d47c17 +7791ec67383f276b58e5f8f3c32409bb +e2c4129a196854d4e004313b67cabbb1 +0f35131bd73ad43c77503abbc9b8219d +c0bd3c7c4e7d1c006b2301eab5ecd948 +e945c933045b11d928443a45decf52ad +5f7594cc680f9f8e39152b67ee04d492 +10feed256eef9b9ba87cf7fa3ac0ef36 +2d042b078ffb9cf4e0321fe8a09cfa88 +e1d238ddd4e573b085cc34b028b24883 +ecad6bd4ba98051aa8d375b71b0e116e +a03c8d2492d0ca2404593ec71b479eaf +1ba2c9d892264fe1db8eefb1ecd3bb8a +6959d7207e6206827d65ddd355ba7506 +77bde3efa7443489764569752b420eb1 +98cf56f3f039afe645291a4f8d232d5f +0c4097fb424dfb257639732a19e5c2ed +76b75be7fb2191b64616144f1bb6f324 +79a72d08df258b0ca33c240c1d7746c5 +f48adb959a22f1724228581645cd9e67 +86ff89b103a31b41474b61e5a506c2b5 +c6a9a7d9cc31a6f650c60a8012a0d0d3 +d66f70a41b18322cfa60371361925573 +670fcc17fec05077d89269efc0ca2a0e +2ebaedcb9d2d969084625077785cc38d +35376294d8fe982540141abbb4d1714b +bbe819e048ea168b6c16444dba907c40 +1ac87d92900f2a381db91de8cdf0dd46 +4a436addc8ecc176da90d6f8e7ca0a8a +115c4806f36aeb531699b370720312c4 +55418df59f5b95c989be04f945a0002a +6959d7207e6206827d65ddd355ba7506 +64d3e67ba4a87e02faa08fcb6d92d628 + + +ed715e949601b59d8aa1cae4915e53d5 + + +d41d8cd98f00b204e9800998ecf8427e +f14e522e1e5733145de616ab0ae9501d + + +d41d8cd98f00b204e9800998ecf8427e + + +d41d8cd98f00b204e9800998ecf8427e +a6a0362ae831362830d6e63f1d411527 + + +4e43b862976f2b1a0f0d0d7a5dba9d19 +ad54dd3c9b754980becf7ecc311038fc + + +f82a70bbaf24434aff018e689e86221b +b15fcefe9e55b29cb20d1b1de229edec +4af4f260359b0ce9c42f77ab47caa6bb +a79fba50514b6341e89f4cfab2538074 +c86760866ffe32b359549745a00f78e5 +8bb0f71417f315eb04c44bf1b07dd157 +00ff70d955ff73a44e75034c2d58204e +a671cca2c79d9135464aa9f41e78b026 +adbd23ce0f80d78b794b1bf265c21e5e +d5f4a934ec62542d5273a41e8fbcfe24 +cab0ab4445e82168d2cac70036925a88 +913a37ec8bb5444e2aebc3e37ac32f01 +e5f6f03a4edf8b78cb561640dd021ef9 +c6e27842c8603e8d0679cdcef7cb6504 +67f93528ad1ccf9b8b72651e16c2b83f +131e9c1492e737f2c9ec974ca6266f1a +9f011bbff1b13ec5fd8307610210a91e +c1c1d802683b4599c4cfce0ddfe6be0d +b11a03507e5b25abc28f38627259e6c2 +2a2a087b71d3730e58954da48d65b1e0 +bafaa6d8e8c91f79ee22242ef6fd5dc6 +2862f528c2d606a7c780b75613b90761 +d41d8cd98f00b204e9800998ecf8427e +c78c3ce42e3987678f28f5c2d5888a31 +879bcc7a49c8a8b2dd20672d7fece36f +618d61f6e80aaea18e3257b4d6cc2728 +4b31ec814f6c455fb7d72f4d32589b3c +4b35eb7636936f48c6d40353135af307 +7c7da4fdb0743389e825481f72db8fbf +7f073b1e3162a90d38273edab7adac23 +8707c43fc89f7fefe22678f3a25fd20c +351226b86bf32c35da86bc84d37710ac +f69743db39fe49a61499e443879ce394 +10feed256eef9b9ba87cf7fa3ac0ef36 +cd26e28d19227f52dbb7af6285f49684 +448c864dda6bfcbb4d6344f5c61a3331 +1c1dfcfd97b07cefb27d60e989f82427 +f46842235b8299668e3c493ea36de3d8 +4f37eab95abbe47905271558dfe2582f + + +8d14d57b64e6d0941a4a3da42485c835 +adbd23ce0f80d78b794b1bf265c21e5e +b6ca1dfb745e85d611fbe81cccd4da33 +b2fc85cace867cd419febae19227a5b7 +73936e9491424f1091d860da60e70a7e +d41d8cd98f00b204e9800998ecf8427e +5e4cee9e9a747519c7ac8d53b72a1e15 +c71ac960b798f1acac68b17b7fa6c803 +e186597ccbb2c1eb388198d8d2a199cd +570463ed73e7c93d0989adca95a0d440 +b6342a142293dc8e125d11ea43972d05 +85a06666e72e0c9522deb1041e2bed91 +b9c630a949e08d2aad90b54cd97276b5 +ae9923bf8191d4cce6f6aff23d7a92c7 +e0074fa750edf8fadaabd21713776fe6 +97a2ce5955231c1b3891e8eee2445c62 +f734bdacbce7337ea1b52b95b295c49a +74107c8827b62bfb576c7525db0c50d4 +b22186030a04c7a208dd219acfe203c7 +35df8b42457569b02c19be41abc87f45 +ee172f657651ace5f45374cc6a5c3639 +22a1d48babdead60060ea6eb841464c3 +6e4ad58de75dcbd3fe83e4680d5a94d3 +37e28b4e4e22b80c1d39d038599e2dff +dc22d6ec2bda0707404afaa8259ee219 +f4a0423781100f09efb4546515878611 +9e95e8dc5850c73b8ced6dd0bca3919d +ea0cd1165069b2c5d4bd5916fe10741d +6d28eea8d332c17dda186d63f9ae2206 +acc3f08c46b50f9b3b66ea831aadf3ab +0ff637bde43375a809e583841634f760 +83063c2136d912f6cf89a173cf71e7d8 + + +53752275e001831a1aa1af926cbdfcbd +85e75bec7eff5d20e41a993927acb5f7 +767c14923c466cadc2b4d21941ea8f59 +9d0a732a0ddc0c0ad033e1cae7e8e1ce +0ce654c1f24e1190c6c3022435e09ea7 +9a58dc01b905407823d94c3099ea0c44 +ab59944ef4c329f4d5c3109775c61f5b +8e9667450cc2157e1157e8785b367225 +b3d6f3785d8cfecff48833b17b56ccdd +6d457a2c2911dd34f7786ddebec78a4e +25c9d80f42b34d9dcbfdefdf50cec661 +8e9667450cc2157e1157e8785b367225 +16bb485a90ed5d40b877f42ae2c1e6fd +732ded5dbab1e25ec84bb0d1d021b840 +d3dffe4a4ad4030e443985fa8ae1a91b +c533e3d3e66811df956313981c8fdbac +e6757cb7e9e8dac57b24af8395a27fdf +7f073b1e3162a90d38273edab7adac23 +3f933eec8c50faea176b3e58b18a3510 +3de564ee11be8e8c77599abd1e3f3b40 +809e6f0b71137a2d0d489ef24a383bf7 +8e9667450cc2157e1157e8785b367225 +cd4aafbf96f9ca00ec1ea45ce445273f +e2c4129a196854d4e004313b67cabbb1 +913a37ec8bb5444e2aebc3e37ac32f01 +40132ecffc9bec07aafcc30c6286078a +85d404bac8dce61b4c6aaa8023b3a56d +9c85a247cd59245d62ad33a6f6d8021a +e2e7935ab2ca6ec4318baf7d9e4db6c1 +0bc1e68b3aef15b66b82bc1f4fec9a02 +ddf9cf9d441de3934800e1a2cec8af0e +1b474f0760ef6d41e1ab690197d6c3b4 +9bbcc89b736a13147aaa5aa74b4a0440 +1051c422df2cc6f77c4cb08eebf9a222 +d3064fa8b7429f42e62da1f2887161d4 +de2022b0af088c7f59b35e323fd6a662 +acffca6d808968e0ea67fba273d7ee2b +43d6877df934dd2b5a134e63980008a8 +b28a87c8e679b0340ca2bb5e6bf5f6df +7cce79ebd74e8f71ce17f811dee41f34 +07001b443cc63071e2a368efeecc9ad3 +e605e982c1935f82b08f81c61fa61b3c +43926a83973951e9b41d8c0aab0e2cd3 +c0bd3c7c4e7d1c006b2301eab5ecd948 +8e9667450cc2157e1157e8785b367225 +b61cf71e2798c651c607f48940a4e09f +fde64db4462dcd2dd78d40ac1e490286 +e5f6f03a4edf8b78cb561640dd021ef9 +6ca183f901d31980b285e187778a82c1 +94a9153db495781ee4c317420202a2be +e496a23a58f66890e5c69e7a1699aa2d +47efc87b5dd14b2464b2403e038d03f9 +f2930d262bbe944d1a7850e4a18a2e50 +5a582fdea5dff2f52a79aaa101278172 +c2664fbfabe5322a1a136ef9e6ec28db +d8aedd7beecf9e743f5f49cc11429c0f +ed3a68794bbf31b3c2de610200b5a92e +b3f7fd8c8d2d111960bc1ce63edd8d70 +db95c9c78a2b762361c7c2c9c1195145 +cd5792374200bfcb7337e03e45454e50 +8a7351ef099da26bbaa63ade1ada8be9 +deb4efac7c2229e79dfac38516e78fb2 +5ff452c2f13647b0f60f9dad9ca3ba21 +f17b1318317516348f82385cc233ff0b +8376d641f582ea7fbf4334fe8ee54403 +7c7da4fdb0743389e825481f72db8fbf +70becbe01e0a3028bc1f911d157502fb +f933a0d4e4f4a2f465d48977a62f71b0 +946e88d5612bd35d2f9297a1419ba62c +5e83bbea91f6deaa37b247ac013ef556 +c17a32a624ef386aacdbc3a683f32048 +b57af4b9947810d411c878d3e9caa276 +26b7b52cf3e0d7132dd00290a55a3192 +bb0fbf39951397d1d3737a3d7006d18e +aba33e5e98071280db0d34c42349f1bf +acf42861a59faad7e9c5fd30cd9cfd70 + + +d41d8cd98f00b204e9800998ecf8427e +ba1534f65c09d9e2f771405acc34e47d +6964848f5af43d68c6b7218d3d3804f2 + + +90eb802715ce63e5e3ca4a55a42b8397 +6ca183f901d31980b285e187778a82c1 +275999a532356c158f19fd8a2b06d399 +441617b20516fd76a40c7ff1b11690cf +136042c53e8cdcd5c877a55278b800a8 +33c4116fccc3ff06e1c82060d90c1aac +765e3ee60bd9940d57172336fb3ef5aa +7c26f8ac117a0a43f236900481e8781e +ed7f8a63c16ca6f732b8794ff0cc2d28 +3d64316fad587349e5d9dd0792249162 +8af57d97c02aadd073dc0c67d2546a9c +1d2a82296a2da8e75073715f5b30c93f +c533e3d3e66811df956313981c8fdbac +8ace5113760f987144f54425afffd195 +d5f4a934ec62542d5273a41e8fbcfe24 +ba1629cc343a821009875fcc3d23afb0 +02c9db9f7c03e235dacf85a337b8887b +5d3b6699db4bdb0b80adcb87bca2cbda +9fe6aca4313338fe6dfb496ee6a37745 +a346bdb285fe8580f4b5b8dd5f5451ef +9b70d8debaa8065353104c699e328325 +c8a144d7c8add753a44e8e8d55595570 +c48848adc73b20b6a2e52888c8a7f9f9 +4ab5cf779b6ba8737731bd949438e279 +f6c51890eb3d84defb470c9101e0e1fa +7df3d6c0f7590453f08e362b6ce20940 +2fce4bf86219c914595c178c2d7e13f3 +44854c50928080752b377841ec269639 +5fdd9b86b6f8470c71db5a04bcb9e11b +9e36c55b53a1b080066d9947a92d2ce3 +9e36c55b53a1b080066d9947a92d2ce3 +8782f385cdddac89c3704c05a8a7ac7a +7048b07a1e0e0fde5c6a1b4d756d10b6 +c533e3d3e66811df956313981c8fdbac +ab99e28fc193ffaeee2c33dde09bf167 +7389cc51b77b11b297ccce79048a1c7f +9e95e8dc5850c73b8ced6dd0bca3919d +a9c1b094e5f90641184b3cedc1b2b372 +c0354a0f9fc6655fc9323757e9e0b742 +c5f9a0849fc60d9d903496e6752a8961 +a65c4d66168635b87ecbc720e2a50703 +16f15b5dcb1b133a53de211c024611e2 +3f4c833d31becf6c023f35d3a8140ca8 +f4e4c9fdfa66cac3028c2db1680b46cd +25c9d80f42b34d9dcbfdefdf50cec661 +5dffe1f2fb151b5ae395df7c0a8e7b15 +3f995da98d36a1ccea1ed8fec6b9f4ca +798ed84c7b3f98e34a5aa55074cd2616 +deb4efac7c2229e79dfac38516e78fb2 +a6212b5e4fec967f17c519c9c6ce0171 +7714b390ff497c388fbdcfe8c0563790 +c7701209d9f6520754d641090de4ae63 +5162c215a01d7254e1eba6755450a163 +ec291d015307e2d4798886aaf95677ae +c39899fd27e0b323e6b1c026e9a9359f +222b20d8427161e4a655b346014e0408 +913a37ec8bb5444e2aebc3e37ac32f01 +7791ec67383f276b58e5f8f3c32409bb +e2c4129a196854d4e004313b67cabbb1 +c0bd3c7c4e7d1c006b2301eab5ecd948 +e945c933045b11d928443a45decf52ad +5f7594cc680f9f8e39152b67ee04d492 +10feed256eef9b9ba87cf7fa3ac0ef36 +2d042b078ffb9cf4e0321fe8a09cfa88 +e1d238ddd4e573b085cc34b028b24883 +ecad6bd4ba98051aa8d375b71b0e116e +a03c8d2492d0ca2404593ec71b479eaf +1ba2c9d892264fe1db8eefb1ecd3bb8a +6959d7207e6206827d65ddd355ba7506 +77bde3efa7443489764569752b420eb1 +98cf56f3f039afe645291a4f8d232d5f +0c4097fb424dfb257639732a19e5c2ed +76b75be7fb2191b64616144f1bb6f324 +ed08dbc09e01bfa10b36e7b6ed8bf9d3 +f48adb959a22f1724228581645cd9e67 +30840a6ccd63f38c28920cadb162e188 +c6a9a7d9cc31a6f650c60a8012a0d0d3 +25c9d80f42b34d9dcbfdefdf50cec661 +670fcc17fec05077d89269efc0ca2a0e +9d3d0f55c282fc3544043027b119cf37 +35376294d8fe982540141abbb4d1714b +96ac8ec152e9815e48efdf383dd7e209 +1ac87d92900f2a381db91de8cdf0dd46 +d8aedd7beecf9e743f5f49cc11429c0f +115c4806f36aeb531699b370720312c4 +55418df59f5b95c989be04f945a0002a +061e57284f369a77f4ab7a210edd6d16 +6959d7207e6206827d65ddd355ba7506 +64d3e67ba4a87e02faa08fcb6d92d628 + + +cd3925619f6ff81e91a312711c9695b0 + + +6a091555c6877b544f3aab32b559a6b2 + + +50f85cd5ccae9edeb87db1aec5bd1445 + + +75db1323be040defbae5e7378d882570 +9e8df7a1f97fe092e378ba3b4d2d7a15 +6a091555c6877b544f3aab32b559a6b2 + + +40d19c36fb86343278b2ff8271957909 +e7b44c0883658312f18b2cee13c510a4 +dfe6513320925e9984f2091acd96f837 +d63bd0bbe0e86868f09a0417bec41567 +84bc52fa0e6ddbe4575b889d7ff2b7f8 +ce51785f2ae93acbd1dd7f7e7a1b834b +99366e5814cf15a5c2c8259e997a587e +a4b10f0a9344a902b0eb894c0359180d +e5d1e4f00c145d8bd9d993db8ee2d658 +93fb34aba94f77668017cfacf28625d1 +647b0c730b131d9a0f27421eea94c8a0 +614a21cb219111d41c6c815a18d21f60 +5b4139e37f6513f4463b3d50ee1a6c44 +c960340b92968372e81e9af3f8de8e44 +7269cd3e68831373c75646b04e9ec31e +93a34b7ed224f5aff36219e2e8c73a20 +6b64644d073eaf395442fd320051a0c2 +91552be664c9056ae5a9f299195955a1 +8318269532072d67e8a0d44ee5bd38a6 +440e1f4f9212065434624a18a22b3e69 +30c8c9e51fa04f150610e1d99fdb82e2 +0bf1809b5836f3800efcfdaa8748255e +e609778c68fb073d0bada5bd8e10204c +51035a90fb3016eb70bd64beae1f3e60 + + +48acd93e336486b64bf0ef3c44f75fa5 +790071484a9e1adc602d837f4ea6d04d +842938c672ed1d72bd9403406b3bcd7e +3788c13e8090ae4ee3cf10b6a4472997 +9acf3777aeed1806195e523dc770157f +4a4b8ecbabbd5b3ca2535557d878e8f9 +c900625c572898f3b30d0a70e2daa4f8 +5b869c33d8b4327c3390e845f640044c +d20e3d4388d6a1144798c4d78fa5d9fe +979bced9353017eaba4a9b3570b74b80 +b8bfe774562d7d6e84015a17c86317eb +0dce787a93a8261d4f35c999bce98800 +8fb0a0d627d6a0728e38a9c9cf782046 +c198ebea9e2ba051bd86d3940e6aa1e4 +9033682c03438c9eb24fcfa09809afe3 +e2b64b9fe7a4537612ca2916c51da68b +fa128c995d466ed4b340cbee58be7399 +116dee1fd7d1403d5a193d4e62bda7f9 +9c42f2f9a647b169f22a1c48d3fc6afc +b32c2e21e385ff53b044f1cacbb9db47 +02c14f49e5b15471b41689c47836e73b +e400d12fbb966c2072f7cc0a33122e4c +671707968e0fb4af5cf2591716bb000f +57a642780d6f1438ab5e3c3e43279311 + + +52c88dca6f514810101f266772faf921 +5f09b75596e09347d271f8493dba12bc +c233e8c942774b61043cc7f2ff0379a7 +c822e3abb3af6c7b76849b45f95114e4 +9c2de04e184da12b200ab345bc4f9537 +8852d5db5b074915c73b1a3c1e0e52a1 +04bf269ecfb38525e53f6efb43ee67b4 +4f37eab95abbe47905271558dfe2582f +3cc4db5a802c0558a7332b18cc93a328 +03a53bc1be693bfc2aba3ccf673e7ee8 +767c14923c466cadc2b4d21941ea8f59 +7789af38b3c812635e69248a2ce9abbc +6cd5a39e1374ae4b4730016bdf72a608 +740d6ae30c4ed916fb5cbfd4a2f1519d +1c73a2a312eb2ed8cadaaab777de5f89 +630a6c1d3c7c193b1525082e1659d0f3 +a98ed2055c06806ad5670b398031d5c7 +2cc988b279b124aa0f78bf1778a614fc +5bf1c84daf648dd71decdc6e2a86abb5 +b8bd127be5fe8ad1ad9b4113cae6847f +51035a90fb3016eb70bd64beae1f3e60 +548169943afad4c017d8975ddcf766ce +3de564ee11be8e8c77599abd1e3f3b40 + + +627075d053636990d4a58f26f81c7bf9 +d1c21e7a642b7e3e24796ac7c1ac4fbe +2053bd445e800571038d398de16a42c6 +8363e4289cfcec05690680ff7ee148e4 +6a091555c6877b544f3aab32b559a6b2 +58dd216015edfccf92af63e95fd26568 +2a23bbf75f20bf0e10b744904380b717 +9acc5489a4231469b7a7bc70f9cd4c15 + + +d9bad16156936a18b88acecc9c98eaed +d2704ed85b91ad0c626233ae0654b66a +d178754e8173a95c3fbeee8d961d9710 +c9db541d0582c4366b6482182aac7101 +8318269532072d67e8a0d44ee5bd38a6 +440e1f4f9212065434624a18a22b3e69 +63179fa2fdb48169c60e124fb2023eba +ca12136a0e4602b5f4edecd119cb5d14 +ee46ad61ee405696fbd98b5e03e1385c +81707b9c0d2bcc9c4494fe861b4fb962 +1e3e44bf5b97c5ed90489ec61af82f16 +875a8f981af8bd8c0190ca982e3fe7f0 +ea64d21157d0398ad90a34d9492de885 +5489bd2831debbf06278f89272fd4f6f +7e72cc0ebb17d87cbd7bbe43eb6e9a1d +f8609dab9c6e751c89a0c348121724b5 +51035a90fb3016eb70bd64beae1f3e60 +8cc3365146314f1d3ebddd78c5d62daa +7197b1c514e048e5f55023cdd7a0b88d +5aa49e96d3c8808bbc581291277a8a68 +e5f71eddd1e4223d394485721854a1af +8d1ae26242e301768c192ca3646fd692 +f55cf816faabb0d2bddb0566584421be +4fb98a3872cda3b17ea7d8ddd647a693 +b3a803f77b34fba7ea7a818f2467c802 +b93ac72bddc5ed0c343010af8f72d1b3 +ab916cfc9db75045c92dd189c48e84ca +aa620b5f9280816582761ddb13b8f9c6 +2cacca7e1a7f231e28d9c0d66e8c4223 +cbfe757c5eebae2e495f4787981fd927 +699f28b8e2a9b517c4561b1734fafb83 +a822724eedac96d1a8a124e8ae9fc128 +4838166145521ae9d16b09a0b362fed0 +c90f57a6f6c1818165d998a31f988253 +c5a1b32584b43642dcd623f195e146ca +abd9495bf9b891b4bd924cbbcf007ed5 +6b1960869a50888e02d52117b1578223 +e8cb0610e0e3514edbd73cc52e896b0c +066bd9e73ec61ac651ce26cc3bbb0b1a +5b7d4bac3bba6282d42adda3c8adc552 +6e1445fefebb44ff44ad8596429b403a +155a17d86608ace2b8adc9c767679964 +d3b5f9bb4d7cd60802f4d42e1a25b8aa +bbc66b7c1247fe8d76db21becbcff5ac +04bf269ecfb38525e53f6efb43ee67b4 +e99111912f38530d01ece486a5907c59 +13c50b97181eb7170d33d4886bf60982 +35d8b73e467ee7d76dcdb4575ef358de +5d42e81f9970f0e9e091b5ca15192921 +0269591b0c557ef9c5900ee39559abd7 +aa620b5f9280816582761ddb13b8f9c6 +c5dcec112e3a9d5d1579be66d215428f +4849b65d47995921d5dfd9fef1351d1f +fdf25bdbfc6dc0b2ae3668070f53c312 +df3422e81cdd3c7932afe681bbc495fb +d48475e6c742940f44e62622e16865b9 +5cfd005a72b8205640ce3198c53028d8 +fa5f8193240995285a30de76a124744c +f8609dab9c6e751c89a0c348121724b5 +bf3deb13f7a0825b6ba74803d018e553 +b5ded8f89af88f2a5fd2ad63fe2a4ca8 +6dc9828000eb5febaefa7b77b5252543 +422875d9c1de09197d926ce476c466b5 +9cc547785bf7cc919515e53b8dadf44b +129fb26cac77f2cfced9ea1db66e83be +caf70c8dd4fd09204b61c76ca70e35c8 +73af8dc0122a2d75acdcba21837aa3e3 +1280c70017d4ce2c7730d5390eb592a7 +02eea4c081bbeb04b0eda588c732843f +02eea4c081bbeb04b0eda588c732843f +d02151488c04f156e1d3c3bc78141d94 +1d128c388497d1b61d50f6f5e01d3dda +fc4b53984c098bbb203bc069b98e8db9 +68c1f3720ea44724b2e157bb7c35fd32 +2a23bbf75f20bf0e10b744904380b717 +e475aef02884c4885ea033d4a30496fe +61502956fa52965a5bad92123a9569c9 +ac122b4a772f3035e390567062f25dda +8d50af284bab0f3eadc3a17d63dbfec3 +40927ccbd2d238de93de91aeeec37edd +2c50b6e98592f1e5a6ce33c565d025f8 +398fc8cdb992c6f7a4844015935d70f7 +1394eff8246a6d0ea5431985d37f8533 +6938c59e655fba383c00a44901650156 +8f88d990024975797f96ce7648dacd2f +d97bb7d8f8f655a9e933229d27d1b3c9 +d5f4a934ec62542d5273a41e8fbcfe24 +6f1b026f9261b9238b24d449d337bd2e +697fc1872a0f4a3be355916e088400f4 +ea9dbe6f4756b3dcb0bc3ac51e27bf69 +6c56b94fd0540844a7118cdff565b0ae +29bce151587b43c1ff592250b5cf57aa +c233e8c942774b61043cc7f2ff0379a7 +dc34b5a8d294f3c703dcc5f8dcf4a37e +8038e4775316d36b154b2d20f8eca0ae +83314a16e569a23732427c3d371e2de8 +6b3746d279fcfa4159c8f28a7f83b867 +c1c2c1d6c5cdafecd769bb6d9e69299d +74aeae05572baec80b9364eb35b85249 +96c6b09234b74eb465cc09964833a65b +67116878b5f705ad3866daba569ccecb +70495db9ec5f4de98442ef8871b90c05 +3857f230e9a549e8b5c4654b3e4c8e36 +9e01c3fa98d65878f54b29b58d937c7e +43a14df2da6097c00b24b566e26ad641 +41556398e7553860047860f30174cd9c +5af0942c7b4972253e75b46731938c62 +ca321f843d229a3d5cbb57e55bf57f1e +e47606a09ae560a94e7c46bbab988ca2 +1b470b45fdc317eb658933150057c0f8 +d1ee57d0e2841d5550a597a5496e5e6d +37d203143e187ccd197d0a246e96cc5e + + +d41d8cd98f00b204e9800998ecf8427e +25f7de1beeacf1b5799e272cbf27470f + + +d41d8cd98f00b204e9800998ecf8427e + + +d41d8cd98f00b204e9800998ecf8427e +a6a0362ae831362830d6e63f1d411527 + + +16e262f3f18cf7836e231b64a353af7f +715f17cd829260420265f6d293640e04 + + +2a82b000df718dd6e6770e2d50b03862 +445b34b4ac5dbd8cbdbb2d8d52656cab +4af4f260359b0ce9c42f77ab47caa6bb +f1d99169e9f6f6e4880a4f2859b53858 +8bb0f71417f315eb04c44bf1b07dd157 +e7e6b8d7a9b989619beabe01cdff3bb2 +a671cca2c79d9135464aa9f41e78b026 +adbd23ce0f80d78b794b1bf265c21e5e +d5f4a934ec62542d5273a41e8fbcfe24 +1e99a575dd2737b28288144382810210 +92dfb008bc785eaac8dd2878e17f4a31 +c6e27842c8603e8d0679cdcef7cb6504 +b3ef3d72a6836a5291a0487307b5d8f6 +131e9c1492e737f2c9ec974ca6266f1a +bf5474e7c85243d85f6ce742204bb692 +7d389b04b1d62e932d0e2696c7e68e9d +287ac7dbd72c235345b20a09e93f4df4 +2a2a087b71d3730e58954da48d65b1e0 +71042cbc4ea8acafe754fb436feff958 +d41d8cd98f00b204e9800998ecf8427e +a78a833c5c28843ef5c49dfa04c1c970 +618d61f6e80aaea18e3257b4d6cc2728 +4b31ec814f6c455fb7d72f4d32589b3c +b3b82d32ad1e02b6be3078a24ef8b28e +a4991dfd1bcc9681bd2dd5688f2e86d3 +9c419b4fa2cd1c7ad6772cbb28934b51 +4b1644100e7aea8a79bf8404381b8654 +8707c43fc89f7fefe22678f3a25fd20c +351226b86bf32c35da86bc84d37710ac +7695d1ec2dcfe45c3f713cf420f707c1 +fb0e617a4e54b963f7c2139efa874d10 +cd26e28d19227f52dbb7af6285f49684 +c5e70aa4ca496434dce0517017aa787e +1c1dfcfd97b07cefb27d60e989f82427 +a6879b7e59ccb7926635047f0c736b05 +4f37eab95abbe47905271558dfe2582f + + +adbd23ce0f80d78b794b1bf265c21e5e +b6ca1dfb745e85d611fbe81cccd4da33 +b2fc85cace867cd419febae19227a5b7 +d41d8cd98f00b204e9800998ecf8427e +5e4cee9e9a747519c7ac8d53b72a1e15 +c71ac960b798f1acac68b17b7fa6c803 +1ade3d7773887c7f5089096d1afec3eb +e186597ccbb2c1eb388198d8d2a199cd +570463ed73e7c93d0989adca95a0d440 +b6342a142293dc8e125d11ea43972d05 +85a06666e72e0c9522deb1041e2bed91 +b9c630a949e08d2aad90b54cd97276b5 +e0074fa750edf8fadaabd21713776fe6 +97a2ce5955231c1b3891e8eee2445c62 +74107c8827b62bfb576c7525db0c50d4 +b22186030a04c7a208dd219acfe203c7 +35df8b42457569b02c19be41abc87f45 +ee172f657651ace5f45374cc6a5c3639 +22a1d48babdead60060ea6eb841464c3 +6e4ad58de75dcbd3fe83e4680d5a94d3 +37e28b4e4e22b80c1d39d038599e2dff +dc22d6ec2bda0707404afaa8259ee219 +9e95e8dc5850c73b8ced6dd0bca3919d +ea0cd1165069b2c5d4bd5916fe10741d +6d28eea8d332c17dda186d63f9ae2206 +acc3f08c46b50f9b3b66ea831aadf3ab +0ff637bde43375a809e583841634f760 +e09179e576a7f1706c632d9c6a4be337 +83063c2136d912f6cf89a173cf71e7d8 + + +ae2b207691d431eccbcc781baa57ab4e +53752275e001831a1aa1af926cbdfcbd +28d998536cc67795eb0812a1e4c5a6ed +767c14923c466cadc2b4d21941ea8f59 +0ce654c1f24e1190c6c3022435e09ea7 +89697cec3795e0df248044ce53e74756 +370330c7627ec45797aafa9e99f84762 +92bcad6a72829412e19818ac23d99c7d +bfd0bf42e6473229d91e07d0b3f9baf7 +dc1b29caf1ea591b1b835b96d3869db3 +2fce4bf86219c914595c178c2d7e13f3 +d3dffe4a4ad4030e443985fa8ae1a91b +92e62681dc53e8a32accba6846001552 +4b1644100e7aea8a79bf8404381b8654 +8816de8b6e1f9e510d6b37002b1981aa +3de564ee11be8e8c77599abd1e3f3b40 +b48838edc93500f2bc9d4fe8afe1d6be +034863b5c8459093e35c529af988e293 +b2f4d01512267ce06fff267cf4136d6c +cd4aafbf96f9ca00ec1ea45ce445273f +c5e70aa4ca496434dce0517017aa787e +ad13b311bf3894d1537bf68d32120589 +cc9d3aa2b9dd98d94377e40b25935c24 +e3c2928ed3fdb5baff03efc59a6d35ab +85d404bac8dce61b4c6aaa8023b3a56d +0bc1e68b3aef15b66b82bc1f4fec9a02 +1b474f0760ef6d41e1ab690197d6c3b4 +81707b9c0d2bcc9c4494fe861b4fb962 +2f8d8c187982fc14d5563c7bdbc43e37 +d9e0bc0764b65a6d2a0515c80c52314c +3f75ac05a676ab5c90483bcea3b7a6e1 +619c0c5385acb19c1fc066b3ca4ea883 +c4df95964fa512230fe0133cb6d83d2e +bf7304dd5d19225b698af27eff949294 +7cce79ebd74e8f71ce17f811dee41f34 +7178d620bb970d5b1c9b337ec3fd4ee7 +e605e982c1935f82b08f81c61fa61b3c +d345a084df9b7c46897877130a475f22 +c0bd3c7c4e7d1c006b2301eab5ecd948 +19e9a1da7c2e79b9b4d18cb4224bf018 +6151a7c4134040854886bc5006a0f7c9 +fde64db4462dcd2dd78d40ac1e490286 +268b73ea43444081e3d46c8754bcf74b +6ca183f901d31980b285e187778a82c1 +9b143135252fb96d644dbc11c8bb1978 +47efc87b5dd14b2464b2403e038d03f9 +f2930d262bbe944d1a7850e4a18a2e50 +665abcd595667e221eb5bf99589f8a05 +dff0c705648f53cc2f2a186ca22546e8 +6888fcb054283b54a92755d30b41e5da +c5a1b32584b43642dcd623f195e146ca +d2e1f32fdfd8eed8580f1b72973330d9 +8a7351ef099da26bbaa63ade1ada8be9 +679c3a5f9bbbdd055430363726db4664 +05681d69a9d1601e222762698c9e95d7 +5a8af818e8fb9bedeb55d5cf3427e2ce +8376d641f582ea7fbf4334fe8ee54403 +9c419b4fa2cd1c7ad6772cbb28934b51 +47b54d44fec79b69f1cc151a1b2a9a43 +c6c06e5a431452048d30850fdb6f1baa +946e88d5612bd35d2f9297a1419ba62c +5e83bbea91f6deaa37b247ac013ef556 +207b36b38595eabc40f7fb975b9720b3 +6f1285c463f6d6fe42e39f34d733cf2c +aba33e5e98071280db0d34c42349f1bf +90eb802715ce63e5e3ca4a55a42b8397 +810dab21a178dd4bd8acbf6c0741d2cd +826b0a139421500b614b3302c87738d0 +136042c53e8cdcd5c877a55278b800a8 +33c4116fccc3ff06e1c82060d90c1aac +dae6f405639ecf3eea0e3d1bf52936f4 +2f1531eab3f5b51c4c6725608f4eb456 +3d64316fad587349e5d9dd0792249162 +f2681caacd54b4b43912e489c678a3ec +8ace5113760f987144f54425afffd195 +fa5f8193240995285a30de76a124744c +ba1629cc343a821009875fcc3d23afb0 +5d3b6699db4bdb0b80adcb87bca2cbda +2f7a8a40835764d2d62357e2ecbd1d28 +a346bdb285fe8580f4b5b8dd5f5451ef +9b70d8debaa8065353104c699e328325 +cbf00fbe06d62b8503f79d19005b84d5 +c48848adc73b20b6a2e52888c8a7f9f9 +4ab5cf779b6ba8737731bd949438e279 +f6c51890eb3d84defb470c9101e0e1fa +db77b35764831af0b616bcc87ccda46d +2fce4bf86219c914595c178c2d7e13f3 +2e0eb0e3d978cfc35b462a199aeded78 +9e36c55b53a1b080066d9947a92d2ce3 +9e36c55b53a1b080066d9947a92d2ce3 +a9e38adb81052e1178a2486de8a87c28 +7389cc51b77b11b297ccce79048a1c7f +9e95e8dc5850c73b8ced6dd0bca3919d +0474bee65715fc6918a92b668178be6c +c5f9a0849fc60d9d903496e6752a8961 +a65c4d66168635b87ecbc720e2a50703 +7921881e4e473d7284ea741addbe8810 +c64ea6bf2afef2560c8b642972b04663 +3b719c139541347e5d868dc81867d444 +752f4b5e92e81b70cae0ddc1be19e468 +9692f8944e4499d5f0dd89a7a7dbfc9c +1c081e65c1f4d55f0874c8b3e21e874c +8b7bc49f97c95c9d641d3b3c72ccf1cf +0ddff84d392b7fa485c6e47623f9885b +a6212b5e4fec967f17c519c9c6ce0171 +7714b390ff497c388fbdcfe8c0563790 +c7701209d9f6520754d641090de4ae63 +ec291d015307e2d4798886aaf95677ae +bf803d2d0ea860bbc5e35c4b6decc800 +d5f4a934ec62542d5273a41e8fbcfe24 +4454d66db639f71ab544b163923181fa +c5e70aa4ca496434dce0517017aa787e +0f35131bd73ad43c77503abbc9b8219d +c0bd3c7c4e7d1c006b2301eab5ecd948 +b72c3b6c763f26a3ffc3c2d6c0f6d49c +10feed256eef9b9ba87cf7fa3ac0ef36 +e1d238ddd4e573b085cc34b028b24883 +ecad6bd4ba98051aa8d375b71b0e116e +a03c8d2492d0ca2404593ec71b479eaf +12bd3c14cc3b96cf90d3362573d85559 +60805f7fdcc0a187defb87f4ecfd9bb3 +8f120e35f8b6608fb34e38edf9a2687c +cd4aafbf96f9ca00ec1ea45ce445273f +16f911dcd53ddf0a2c59fe6173f892f8 +79a72d08df258b0ca33c240c1d7746c5 +cc9d3aa2b9dd98d94377e40b25935c24 +739a60ba606586c88e8626e558f16807 +c6a9a7d9cc31a6f650c60a8012a0d0d3 +bbf2ab3fbf2474796961f01fb3eadf10 +4d444d41aee1b2c9d54942654da1d042 +9d3d0f55c282fc3544043027b119cf37 +9ad922c1fdc252eb8e61dbfdcf32ada5 +03ffa8f7c09dcea59dd5c89f136c7da6 +4a436addc8ecc176da90d6f8e7ca0a8a +115c4806f36aeb531699b370720312c4 +55418df59f5b95c989be04f945a0002a +8475cd05414226f2ff20ee97df8bcf31 + + +8ace5113760f987144f54425afffd195 + + +d41d8cd98f00b204e9800998ecf8427e +97cc0cb6589734a5374c9906a6d6b75f + + +d41d8cd98f00b204e9800998ecf8427e + + +d41d8cd98f00b204e9800998ecf8427e +a6a0362ae831362830d6e63f1d411527 + + +6337a2b8215e8045c73c165d1969afae +64ddd81ea2b2522ab666edb41a4e5863 + + +b97cd0ed145854fbc8b148ac0913565e +bb1be9c660e554a43686915f1d7f021f +445b34b4ac5dbd8cbdbb2d8d52656cab +4af4f260359b0ce9c42f77ab47caa6bb +f1d99169e9f6f6e4880a4f2859b53858 +8bb0f71417f315eb04c44bf1b07dd157 +e7e6b8d7a9b989619beabe01cdff3bb2 +a671cca2c79d9135464aa9f41e78b026 +adbd23ce0f80d78b794b1bf265c21e5e +d5f4a934ec62542d5273a41e8fbcfe24 +1e99a575dd2737b28288144382810210 +e5f6f03a4edf8b78cb561640dd021ef9 +c6e27842c8603e8d0679cdcef7cb6504 +b3ef3d72a6836a5291a0487307b5d8f6 +131e9c1492e737f2c9ec974ca6266f1a +bf5474e7c85243d85f6ce742204bb692 +7d389b04b1d62e932d0e2696c7e68e9d +287ac7dbd72c235345b20a09e93f4df4 +2a2a087b71d3730e58954da48d65b1e0 +71042cbc4ea8acafe754fb436feff958 +d41d8cd98f00b204e9800998ecf8427e +a665caf39101bdf12f66bdbaea3c1e74 +618d61f6e80aaea18e3257b4d6cc2728 +4b31ec814f6c455fb7d72f4d32589b3c +4b35eb7636936f48c6d40353135af307 +a4991dfd1bcc9681bd2dd5688f2e86d3 +7c7da4fdb0743389e825481f72db8fbf +4b1644100e7aea8a79bf8404381b8654 +8707c43fc89f7fefe22678f3a25fd20c +351226b86bf32c35da86bc84d37710ac +e80502a829c7141deddf60ac87e42e46 +fb0e617a4e54b963f7c2139efa874d10 +cd26e28d19227f52dbb7af6285f49684 +c5e70aa4ca496434dce0517017aa787e +1c1dfcfd97b07cefb27d60e989f82427 +a6879b7e59ccb7926635047f0c736b05 +4f37eab95abbe47905271558dfe2582f + + +d29432daede0438dd797ecdbdf915015 +03561d6f159b40a276ae7eca3319970c +d8386960c63e6b27895685c70c4c435e +f6858cdcdb32713ba80d87cd99257e51 +8bcbac102e83193d933a2c936857635f +c797a7830343e4700562dc7f4acf1f02 +d41d8cd98f00b204e9800998ecf8427e +10cb1a61683843039f3f99527f0447a0 +5eca57a0b130d1f5a4cd73d4053f44d3 +40a032464455dd72235e79afa94beb15 +87f5e4a61a397aeffc7d8fdd96673988 +3afe38c6b38b07c3bdfdcfa982e9218b +ebc05e1e66b1eb6dc5a6bdf27e2eac01 +b0844a2326bceb13156ab3950a60b7b3 +7946f4323bc05ed1418e7b056ccbfb4e +6271882092ed28f4227be476c54535cb +c4b077a4e3f7d8c58bb112c6dbe6674f +1ee75057ea44ea31b5d2167d8588e39d +c5b2fccc94d752d454472d6fe7a9aa3b +45e61dc0820ab58a6097c676507874c9 +be8a7ee2b863d701cf8d379676d3245e +5ddea6a4cd5005e849f6f307f1d40928 +d956abc3ac4cac362a78ba0f2cbcbdc7 +87f28d57fe2a6d30d4ee3975ef4a25fc +2c92545e15695b5d27839c7662657ab0 +a79636bc2b90ad32bd15c9015ff17ae2 +6c83356f69563552d5d971e9f956253b +d7e4cc99c44cc6add3563cb2ac5d16bc +3c22e69f2f2972bac1f8df3e48f0eb52 +f6412834592319407d829327cf8f23c2 +88cb6b600eb10287e93e27079ab792ad +249398348c5370aa367828a1261e823b +7cf564871684986dfe050a9acefab1f0 +75744ffb286ebd32ec6b56a8cb86a2e1 +038daf9b3dd4ba6f83911814a80b643d +c85f0bebb04ba27eb017570ee8e36251 +db6df0c5e4d7490f31a4e9ecb6e4e958 +5c528b3369644c9cfd8bab9a46de2eb9 +efaeb3402e4a2da275228cd5416e735c +4b0b0ba3958672efa8a88a275a5615ee +4f1c6183c66d473cfa9a2e027f53908d +dbba0203d75b6632646e0d8ce4d94fe7 +e296916aaeb42ec20dc1768f076ff326 +bfa34f4c07c482fe4e7ec8f2c13e8d08 +1a940cd57dff03f0f9f8ac3513e816d1 + + +105926bd2146d9d2f96c2f5650591a1a +53752275e001831a1aa1af926cbdfcbd +6d76981b87d6b8f482aa5b3950f172bb +28d998536cc67795eb0812a1e4c5a6ed +767c14923c466cadc2b4d21941ea8f59 +0ce654c1f24e1190c6c3022435e09ea7 +89697cec3795e0df248044ce53e74756 +370330c7627ec45797aafa9e99f84762 +92bcad6a72829412e19818ac23d99c7d +bfd0bf42e6473229d91e07d0b3f9baf7 +dc1b29caf1ea591b1b835b96d3869db3 +2fce4bf86219c914595c178c2d7e13f3 +d3dffe4a4ad4030e443985fa8ae1a91b +92e62681dc53e8a32accba6846001552 +4b1644100e7aea8a79bf8404381b8654 +8816de8b6e1f9e510d6b37002b1981aa +3de564ee11be8e8c77599abd1e3f3b40 +80bcf9c563ad0391642045dbff06d419 +034863b5c8459093e35c529af988e293 +b2f4d01512267ce06fff267cf4136d6c +cd4aafbf96f9ca00ec1ea45ce445273f +556e7abe13d8106bdda27be2fa1b6613 +ad13b311bf3894d1537bf68d32120589 +cc9d3aa2b9dd98d94377e40b25935c24 +e3c2928ed3fdb5baff03efc59a6d35ab +85d404bac8dce61b4c6aaa8023b3a56d +0bc1e68b3aef15b66b82bc1f4fec9a02 +1b474f0760ef6d41e1ab690197d6c3b4 +81707b9c0d2bcc9c4494fe861b4fb962 +2f8d8c187982fc14d5563c7bdbc43e37 +d9e0bc0764b65a6d2a0515c80c52314c +3f75ac05a676ab5c90483bcea3b7a6e1 +619c0c5385acb19c1fc066b3ca4ea883 +c4df95964fa512230fe0133cb6d83d2e +bf7304dd5d19225b698af27eff949294 +3a186df0e76f4b69fa549fe809aa77c2 +e605e982c1935f82b08f81c61fa61b3c +d345a084df9b7c46897877130a475f22 +c376d9324174a12063c9177dba2a456b +c0bd3c7c4e7d1c006b2301eab5ecd948 +19e9a1da7c2e79b9b4d18cb4224bf018 +6151a7c4134040854886bc5006a0f7c9 +f6d558ae332bd91dea66be7e702e7ed5 +fde64db4462dcd2dd78d40ac1e490286 +e5f6f03a4edf8b78cb561640dd021ef9 +6ca183f901d31980b285e187778a82c1 +9b143135252fb96d644dbc11c8bb1978 +8038e4775316d36b154b2d20f8eca0ae +f2930d262bbe944d1a7850e4a18a2e50 +665abcd595667e221eb5bf99589f8a05 +c2664fbfabe5322a1a136ef9e6ec28db +6888fcb054283b54a92755d30b41e5da +41d59efa00cc27e8df1b147decc0ee2a +c5a1b32584b43642dcd623f195e146ca +d2e1f32fdfd8eed8580f1b72973330d9 +8a7351ef099da26bbaa63ade1ada8be9 +679c3a5f9bbbdd055430363726db4664 +05681d69a9d1601e222762698c9e95d7 +5a8af818e8fb9bedeb55d5cf3427e2ce +8376d641f582ea7fbf4334fe8ee54403 +7c7da4fdb0743389e825481f72db8fbf +47b54d44fec79b69f1cc151a1b2a9a43 +f933a0d4e4f4a2f465d48977a62f71b0 +946e88d5612bd35d2f9297a1419ba62c +5e83bbea91f6deaa37b247ac013ef556 +b57af4b9947810d411c878d3e9caa276 +6f1285c463f6d6fe42e39f34d733cf2c +aba33e5e98071280db0d34c42349f1bf +90eb802715ce63e5e3ca4a55a42b8397 +810dab21a178dd4bd8acbf6c0741d2cd +826b0a139421500b614b3302c87738d0 +136042c53e8cdcd5c877a55278b800a8 +dae6f405639ecf3eea0e3d1bf52936f4 +2f1531eab3f5b51c4c6725608f4eb456 +3d64316fad587349e5d9dd0792249162 +f2681caacd54b4b43912e489c678a3ec +8ace5113760f987144f54425afffd195 +fa5f8193240995285a30de76a124744c +2f7a8a40835764d2d62357e2ecbd1d28 +a346bdb285fe8580f4b5b8dd5f5451ef +9b70d8debaa8065353104c699e328325 +cbf00fbe06d62b8503f79d19005b84d5 +c48848adc73b20b6a2e52888c8a7f9f9 +4ab5cf779b6ba8737731bd949438e279 +f6c51890eb3d84defb470c9101e0e1fa +db77b35764831af0b616bcc87ccda46d +2fce4bf86219c914595c178c2d7e13f3 +2e0eb0e3d978cfc35b462a199aeded78 +9e36c55b53a1b080066d9947a92d2ce3 +9e36c55b53a1b080066d9947a92d2ce3 +a9e38adb81052e1178a2486de8a87c28 +7389cc51b77b11b297ccce79048a1c7f +0474bee65715fc6918a92b668178be6c +c5f9a0849fc60d9d903496e6752a8961 +a65c4d66168635b87ecbc720e2a50703 +7921881e4e473d7284ea741addbe8810 +c64ea6bf2afef2560c8b642972b04663 +3b719c139541347e5d868dc81867d444 +752f4b5e92e81b70cae0ddc1be19e468 +4ee61217dbfae0266feb5345aab311cf +1c081e65c1f4d55f0874c8b3e21e874c +d5f4a934ec62542d5273a41e8fbcfe24 +8b7bc49f97c95c9d641d3b3c72ccf1cf +0ddff84d392b7fa485c6e47623f9885b +a6212b5e4fec967f17c519c9c6ce0171 +7714b390ff497c388fbdcfe8c0563790 +a174947c846b0105d6556d7497e5d2ab +bf803d2d0ea860bbc5e35c4b6decc800 +d5f4a934ec62542d5273a41e8fbcfe24 +4454d66db639f71ab544b163923181fa +7fd720194f42e7c1ae62927d6adfc046 +0f35131bd73ad43c77503abbc9b8219d +c0bd3c7c4e7d1c006b2301eab5ecd948 +b72c3b6c763f26a3ffc3c2d6c0f6d49c +10feed256eef9b9ba87cf7fa3ac0ef36 +e1d238ddd4e573b085cc34b028b24883 +a03c8d2492d0ca2404593ec71b479eaf +12bd3c14cc3b96cf90d3362573d85559 +e8673277dd7383120e5f9028d0caccb6 +60805f7fdcc0a187defb87f4ecfd9bb3 +8f120e35f8b6608fb34e38edf9a2687c +bdca821b84171d36d4ad692ad9c11742 +cd4aafbf96f9ca00ec1ea45ce445273f +16f911dcd53ddf0a2c59fe6173f892f8 +79a72d08df258b0ca33c240c1d7746c5 +cc9d3aa2b9dd98d94377e40b25935c24 +739a60ba606586c88e8626e558f16807 +c6a9a7d9cc31a6f650c60a8012a0d0d3 +bbf2ab3fbf2474796961f01fb3eadf10 +4d444d41aee1b2c9d54942654da1d042 +9d3d0f55c282fc3544043027b119cf37 +9ad922c1fdc252eb8e61dbfdcf32ada5 +03ffa8f7c09dcea59dd5c89f136c7da6 +4a436addc8ecc176da90d6f8e7ca0a8a +115c4806f36aeb531699b370720312c4 +55418df59f5b95c989be04f945a0002a +8475cd05414226f2ff20ee97df8bcf31 + + +f6824fe35ddbed045eea82cb1612c2fb +263890251d7bbc4c692caa22c2c00dca + + +d41d8cd98f00b204e9800998ecf8427e + + +d41d8cd98f00b204e9800998ecf8427e +5982465f278f6a2a2286dcd59dabcaf4 + + +c9cdf98160b16d240ed8add73a7af5c6 + + +d41d8cd98f00b204e9800998ecf8427e +be5e2576e65fca0640a3e943edb7b4a2 + + +fd6a54cb5cf80f075d7687ad66dd2cb9 +7febd21a1cb275214aaf40c072227bdb + + +d57577fa1eb8b48491a41f481966456e + + +d41d8cd98f00b204e9800998ecf8427e +a903b1b3590aafa28b8e23f72428a2b4 + + +4a244e830bbda49fc725254448cdbec5 + + +11689e5722e4204b9d01e5e4483b92ef +cc97395704f8c817d0c92e81b4626429 +a20a84fb09238e216ab80d91674426b1 + + +d41d8cd98f00b204e9800998ecf8427e +4b94e9ad89c520b4cc4ab986a1cfb5f8 +348ac1d0cc575dcee2a8bd3fe3da6096 + + +96a92bc03a6ca67f39d363c36031dee7 +db802ba04a77501799a7073600802c80 +0e4f03114e8298dfc23bb94d0df5d390 +5e1aea18f899b4a763a0291dcf1f2b90 +c6798747955c37d2da47a6753d831cf4 +eed35a94809263558ac663233eaa2f38 + + +d41d8cd98f00b204e9800998ecf8427e +0dbb6e95d1684f606189958df4f54162 + + +d41d8cd98f00b204e9800998ecf8427e +74d19c16439bec3b2eeabde4bb8b6b1d +15faab5d58a32bd40d3f163cfaf951b6 + + +a1838ba6f718aeec0172bc6e9d90f4b6 +eb474eb2e1039037169aaacb91443c3e +7770e9e8e3fb4b98bc149059c5bc9633 + + +7aece8343f1f3c70f617733955c2bce6 + + +7b7cde9c324feeed6e94f50e1655ba40 +3c77ad60389c5eaaa410ac4a176b3ab6 +bdb99f4a1594eaf4923129f21035a88d +966129fc8b4d82883741779cf87ea57a +9c258004b01196601cc918cc09857b0a + + +9382e7efb69651b29045f2421d618717 + + +0b959ec99ed9ee63f065c7d40454b9ec +ce4ff827937faf5800380ff9867324b5 + + +be24a0530d2ce043c5f6df3e85e309b1 + + +dc472d539640920357d694745d5c7f9d +1ebef0db96238c1bd7372bea81b9761d + + +4a3747f8978a90ab4ed41be95c2f5695 +4f9ad2e49a960637c6f48ee7c228ee0f +0e96616ba6ef78c2874b6c9fb9c10c7a +857ef0aa17df0f205806791dcd65427c +986e2f39e85074de9facf0ea7973f315 + + +d41d8cd98f00b204e9800998ecf8427e + + +d41d8cd98f00b204e9800998ecf8427e +c5e2d73c3d91fee77e5c8358060478d0 + + +34bc13e73d4cd8217daf337a13593963 +46585b9b2118933add2b0efcac54d055 + + +d41d8cd98f00b204e9800998ecf8427e +6d2a2cb1bf0797384a9af130558d82ee + + +d1069dd7e0dac50ed09d7b65009b43d3 + + + From e55d3489aa1964274fa0d5546d65c0b4a6301eb5 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 24 Feb 2015 12:58:43 +0100 Subject: [PATCH 152/287] Little clean of feature several price per customers --- htdocs/langs/en_US/products.lang | 1 + htdocs/product/price.php | 134 ++++++++++++++++++------------- 2 files changed, 77 insertions(+), 58 deletions(-) diff --git a/htdocs/langs/en_US/products.lang b/htdocs/langs/en_US/products.lang index 30db4bf232f..b896dc955e6 100755 --- a/htdocs/langs/en_US/products.lang +++ b/htdocs/langs/en_US/products.lang @@ -250,3 +250,4 @@ PriceExpressionEditorHelp3=In both product/service and supplier prices there are PriceExpressionEditorHelp4=In product/service price only: #supplier_min_price#
In supplier prices only: #supplier_quantity# and #supplier_tva_tx# PriceMode=Price mode PriceNumeric=Number +DefaultPrice=Default price \ No newline at end of file diff --git a/htdocs/product/price.php b/htdocs/product/price.php index 6888bfb7b5d..f577c860511 100644 --- a/htdocs/product/price.php +++ b/htdocs/product/price.php @@ -7,7 +7,7 @@ * Copyright (C) 2014 Florian Henry * Copyright (C) 2014 Juanjo Menent * Copyright (C) 2014 Philippe Grand - * Copyright (C) 2014 Ion agorria + * Copyright (C) 2014 Ion agorria * * 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 @@ -64,11 +64,7 @@ $error=0; * Actions */ -if ($action == 'update_price' && GETPOST("cancel")) -{ - - $action=''; -} +if (GETPOST("cancel")) $action=''; if ($action == 'update_price' && ! GETPOST("cancel") && ($user->rights->produit->creer || $user->rights->service->creer)) { @@ -120,7 +116,7 @@ if ($action == 'update_price' && ! GETPOST("cancel") && ($user->rights->produit- } if ($newprice < $newprice_min && ! empty($object->fk_price_expression)) { - $newprice = $newprice_min; //Set price same as min, the user will not see the + $newprice = $newprice_min; //Set price same as min, the user will not see the } if ($object->updatePrice($newprice, $newpricebase, $user, $newvat, $newprice_min, $level, $newnpr, $newpsq) > 0) { @@ -640,13 +636,15 @@ print "
\n"; print "\n"; + /* ************************************************************************** */ /* */ /* Barre d'action */ /* */ /* ************************************************************************** */ -if (! $action || $action == 'delete') { +if (! $action || $action == 'delete') +{ print "\n" . '
' . "\n"; if ($user->rights->produit->creer || $user->rights->service->creer) { @@ -659,10 +657,12 @@ if (! $action || $action == 'delete') { /* * Edition du prix */ -if ($action == 'edit_price' && ($user->rights->produit->creer || $user->rights->service->creer)) { +if ($action == 'edit_price' && ($user->rights->produit->creer || $user->rights->service->creer)) +{ print_fiche_titre($langs->trans("NewPrice"), '', ''); - if (empty($conf->global->PRODUIT_MULTIPRICES)) { + if (empty($conf->global->PRODUIT_MULTIPRICES)) + { print '
'; print ''; print ''; @@ -682,7 +682,7 @@ if ($action == 'edit_price' && ($user->rights->produit->creer || $user->rights-> print $form->select_PriceBaseType($object->price_base_type, "price_base_type"); print '
'; print ''; @@ -868,7 +876,8 @@ if ($result) { $var = True; $i = 0; - while ($i < $num) { + while ($i < $num) + { $objp = $db->fetch_object($result); $var = ! $var; print ""; @@ -936,7 +945,9 @@ if ($result) { dol_print_error($db); } -if (! empty($conf->global->PRODUIT_CUSTOMER_PRICES)) { + +if (! empty($conf->global->PRODUIT_CUSTOMER_PRICES)) +{ $prodcustprice = new Productcustomerprice($db); @@ -962,8 +973,8 @@ if (! empty($conf->global->PRODUIT_CUSTOMER_PRICES)) { $filter ['soc.nom'] = $search_soc; } - if ($action == 'add_customer_price') { - + if ($action == 'add_customer_price') + { // Create mode $maxpricesupplier = $object->min_recommended_price(); @@ -1040,8 +1051,9 @@ if (! empty($conf->global->PRODUIT_CUSTOMER_PRICES)) { print ''; print '
'; - } elseif ($action == 'edit_customer_price') { - + } + elseif ($action == 'edit_customer_price') + { // Edit mode $maxpricesupplier = $object->min_recommended_price(); @@ -1125,7 +1137,9 @@ if (! empty($conf->global->PRODUIT_CUSTOMER_PRICES)) { print ''; print '
'; - } elseif ($action == 'showlog_customer_price') { + } + elseif ($action == 'showlog_customer_price') + { $filter = array('t.fk_product' => $object->id,'t.fk_soc' => GETPOST('socid', 'int')); @@ -1198,8 +1212,9 @@ if (! empty($conf->global->PRODUIT_CUSTOMER_PRICES)) { print "\n" . '
' . "\n"; print ''; print "\n

\n"; - } else { - + } + else + { // View mode // Count total nb of records @@ -1215,42 +1230,42 @@ if (! empty($conf->global->PRODUIT_CUSTOMER_PRICES)) { $option = '&search_soc=' . $search_soc . '&id=' . $object->id; - print_barre_liste($langs->trans('PriceByCustomer'), $page, $_SERVEUR ['PHP_SELF'], $option, $sortfield, $sortorder, '', count($prodcustprice->lines), $nbtotalofrecords); + print_barre_liste($langs->trans('PriceByCustomer'), $page, $_SERVEUR ['PHP_SELF'], $option, $sortfield, $sortorder, '', count($prodcustprice->lines), $nbtotalofrecords, ''); + + print ''; + print ''; + + print '
'; + + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + + print ''; + print ''; + print ''; + // Print the search button + print ''; + print ''; if (count($prodcustprice->lines) > 0) { - print ''; - print ''; - - print '
' . $langs->trans("ThirdParty") . '' . $langs->trans("AppliedPricesFrom") . '' . $langs->trans("PriceBase") . '' . $langs->trans("VAT") . '' . $langs->trans("HT") . '' . $langs->trans("TTC") . '' . $langs->trans("MinPrice") . ' ' . $langs->trans("HT") . '' . $langs->trans("MinPrice") . ' ' . $langs->trans("TTC") . '' . $langs->trans("ChangedBy") . ' 
 '; + print ''; + print '
'; - - print ''; - print ''; - print ''; - print ''; - print ''; - print ''; - print ''; - print ''; - print ''; - print ''; - print ''; - print ''; - - print ''; - print ''; - print ''; - // Print the search button - print ''; - print ''; - $var = True; foreach ($prodcustprice->lines as $line) { - print ""; + print ""; // Date $staticsoc = new Societe($db); $staticsoc->fetch($line->fk_soc); @@ -1290,13 +1305,16 @@ if (! empty($conf->global->PRODUIT_CUSTOMER_PRICES)) { print "\n"; } - print "
' . $langs->trans("ThirdParty") . '' . $langs->trans("AppliedPricesFrom") . '' . $langs->trans("PriceBase") . '' . $langs->trans("VAT") . '' . $langs->trans("HT") . '' . $langs->trans("TTC") . '' . $langs->trans("MinPrice") . ' ' . $langs->trans("HT") . '' . $langs->trans("MinPrice") . ' ' . $langs->trans("TTC") . '' . $langs->trans("ChangedBy") . ' 
 '; - print ''; - print '
"; - - print ""; } else { - print $langs->trans('None'); + $colspan=9; + if ($user->rights->produit->supprimer || $user->rights->service->supprimer) $colspan+=1; + print '
'.$langs->trans('None').'
"; + + print ""; + /* ************************************************************************** */ /* */ /* Barre d'action */ From 44c392ca237e1da846d16a9ba2408940ac70f19b Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 24 Feb 2015 13:35:37 +0100 Subject: [PATCH 153/287] Fix missing profid5 and 6 --- htdocs/core/modules/modSociete.class.php | 4 ++-- htdocs/imports/import.php | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/htdocs/core/modules/modSociete.class.php b/htdocs/core/modules/modSociete.class.php index 63cb9c610b4..af538845061 100644 --- a/htdocs/core/modules/modSociete.class.php +++ b/htdocs/core/modules/modSociete.class.php @@ -382,7 +382,7 @@ class modSociete extends DolibarrModules $this->import_icon[$r]='company'; $this->import_entities_array[$r]=array(); // We define here only fields that use another icon that the one defined into import_icon $this->import_tables_array[$r]=array('s'=>MAIN_DB_PREFIX.'societe','extra'=>MAIN_DB_PREFIX.'societe_extrafields'); // List of tables to insert into (insert done in same order) - $this->import_fields_array[$r]=array('s.nom'=>"Name*",'s.status'=>"Status",'s.client'=>"Customer*",'s.fournisseur'=>"Supplier*",'s.code_client'=>"CustomerCode",'s.code_fournisseur'=>"SupplierCode",'s.code_compta'=>"CustomerAccountancyCode",'s.code_compta_fournisseur'=>"SupplierAccountancyCode",'s.address'=>"Address",'s.zip'=>"Zip",'s.town'=>"Town",'s.fk_departement'=>"StateId",'s.fk_pays'=>"CountryCode",'s.phone'=>"Phone",'s.fax'=>"Fax",'s.url'=>"Url",'s.email'=>"Email",'s.siren'=>"ProfId1",'s.siret'=>"ProfId2",'s.ape'=>"ProfId3",'s.idprof4'=>"ProfId4",'s.tva_intra'=>"VATIntraShort",'s.capital'=>"Capital",'s.note_private'=>"NotePrivate",'s.note_public'=>"NotePublic",'s.fk_typent'=>"ThirdPartyType",'s.fk_effectif'=>"Staff","s.fk_forme_juridique"=>"JuridicalStatus",'s.fk_prospectlevel'=>'ProspectLevel','s.fk_stcomm'=>'ProspectStatus','s.default_lang'=>'DefaultLanguage','s.barcode'=>'BarCode','s.datec'=>"DateCreation"); + $this->import_fields_array[$r]=array('s.nom'=>"Name*",'s.status'=>"Status",'s.client'=>"Customer*",'s.fournisseur'=>"Supplier*",'s.code_client'=>"CustomerCode",'s.code_fournisseur'=>"SupplierCode",'s.code_compta'=>"CustomerAccountancyCode",'s.code_compta_fournisseur'=>"SupplierAccountancyCode",'s.address'=>"Address",'s.zip'=>"Zip",'s.town'=>"Town",'s.fk_departement'=>"StateId",'s.fk_pays'=>"CountryCode",'s.phone'=>"Phone",'s.fax'=>"Fax",'s.url'=>"Url",'s.email'=>"Email",'s.siren'=>"ProfId1",'s.siret'=>"ProfId2",'s.ape'=>"ProfId3",'s.idprof4'=>"ProfId4",'s.idprof5'=>"ProfId5",'s.idprof6'=>"ProfId6",'s.tva_intra'=>"VATIntraShort",'s.capital'=>"Capital",'s.note_private'=>"NotePrivate",'s.note_public'=>"NotePublic",'s.fk_typent'=>"ThirdPartyType",'s.fk_effectif'=>"Staff","s.fk_forme_juridique"=>"JuridicalStatus",'s.fk_prospectlevel'=>'ProspectLevel','s.fk_stcomm'=>'ProspectStatus','s.default_lang'=>'DefaultLanguage','s.barcode'=>'BarCode','s.datec'=>"DateCreation"); // Add extra fields $sql="SELECT name, label, fieldrequired FROM ".MAIN_DB_PREFIX."extrafields WHERE elementtype = 'societe' AND entity = ".$conf->entity; $resql=$this->db->query($sql); @@ -408,7 +408,7 @@ class modSociete extends DolibarrModules ); //$this->import_convertvalue_array[$r]=array('s.fk_soc'=>array('rule'=>'lastrowid',table='t'); $this->import_regex_array[$r]=array('s.status'=>'^[0|1]','s.client'=>'^[0|1|2|3]','s.fournisseur'=>'^[0|1]','s.fk_typent'=>'id@'.MAIN_DB_PREFIX.'c_typent','s.datec'=>'^[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]$'); - $this->import_examplevalues_array[$r]=array('s.nom'=>"MyBigCompany",'s.status'=>"0 (closed) or 1 (active)",'s.client'=>'0 (no customer no prospect)/1 (customer)/2 (prospect)/3 (customer and prospect)','s.fournisseur'=>'0 or 1','s.datec'=>dol_print_date(dol_now(),'%Y-%m-%d'),'s.code_client'=>"CU01-0001 or empty or 'auto'",'s.code_fournisseur'=>"SU01-0001 or empty or 'auto'",'s.address'=>"61 jump street",'s.zip'=>"123456",'s.town'=>"Big town",'s.fk_pays'=>'US, FR, DE...','s.phone'=>"0101010101",'s.fax'=>"0101010102",'s.url'=>"http://mycompany.com",'s.email'=>"test@mycompany.com",'s.siret'=>"",'s.siren'=>"",'s.ape'=>"",'s.idprof4'=>"",'s.tva_intra'=>"FR0123456789",'s.capital'=>"10000",'s.note_private'=>"This is an example of private note for record",'s.note_public'=>"This is an example of public note for record",'s.fk_typent'=>"2",'s.fk_effectif'=>"3","s.fk_forme_juridique"=>"1",'s.fk_prospectlevel'=>'PL_MEDIUM','s.fk_stcomm'=>'0','s.default_lang'=>'en_US','s.barcode'=>'123456789'); + $this->import_examplevalues_array[$r]=array('s.nom'=>"MyBigCompany",'s.status'=>"0 (closed) or 1 (active)",'s.client'=>'0 (no customer no prospect)/1 (customer)/2 (prospect)/3 (customer and prospect)','s.fournisseur'=>'0 or 1','s.datec'=>dol_print_date(dol_now(),'%Y-%m-%d'),'s.code_client'=>"CU01-0001 or empty or 'auto'",'s.code_fournisseur'=>"SU01-0001 or empty or 'auto'",'s.address'=>"61 jump street",'s.zip'=>"123456",'s.town'=>"Big town",'s.fk_pays'=>'US, FR, DE...','s.phone'=>"0101010101",'s.fax'=>"0101010102",'s.url'=>"http://mycompany.com",'s.email'=>"test@mycompany.com",'s.siret'=>"",'s.siren'=>"",'s.ape'=>"",'s.idprof4'=>"",'s.idprof5'=>"",'s.idprof6'=>"",'s.tva_intra'=>"FR0123456789",'s.capital'=>"10000",'s.note_private'=>"This is an example of private note for record",'s.note_public'=>"This is an example of public note for record",'s.fk_typent'=>"2",'s.fk_effectif'=>"3","s.fk_forme_juridique"=>"1",'s.fk_prospectlevel'=>'PL_MEDIUM','s.fk_stcomm'=>'0','s.default_lang'=>'en_US','s.barcode'=>'123456789'); // Import list of contact and attributes $r++; diff --git a/htdocs/imports/import.php b/htdocs/imports/import.php index 125b8dc0285..c6ab76dff41 100644 --- a/htdocs/imports/import.php +++ b/htdocs/imports/import.php @@ -33,6 +33,7 @@ require_once DOL_DOCUMENT_ROOT.'/core/lib/images.lib.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/import.lib.php'; $langs->load("exports"); +$langs->load("compta"); $langs->load("errors"); // Security check From 5599deec004815d1867c854c4118c0067dd64a20 Mon Sep 17 00:00:00 2001 From: Sof Date: Tue, 24 Feb 2015 13:44:00 +0100 Subject: [PATCH 154/287] FIX : Edit in place of "Outstanding Limit" Edit in place not working for field "Outstanding Limit" in view mode for third party : - Field type 'amount' do not work in "Edit in place" mode. - Update returns an error "Unknown field 'OutstandingBill' in field list" when in "Edit in place" mode. --- htdocs/comm/card.php | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/htdocs/comm/card.php b/htdocs/comm/card.php index dc74935ce98..d654bf13d17 100644 --- a/htdocs/comm/card.php +++ b/htdocs/comm/card.php @@ -143,10 +143,10 @@ if (empty($reshook)) } // update outstandng limit - if ($action == 'setOutstandingBill') + if ($action == 'setoutstanding_limit') { $object->fetch($id); - $object->outstanding_limit=GETPOST('OutstandingBill'); + $object->outstanding_limit=GETPOST('setoutstanding_limit'); $result=$object->set_OutstandingBill($user); if ($result < 0) setEventMessage($object->error,'errors'); } @@ -393,9 +393,10 @@ if ($id > 0) { print '
'; - print $form->editfieldkey("OutstandingBill",'OutstandingBill',$object->outstanding_limit,$object,$user->rights->societe->creer); + print $form->editfieldkey("OutstandingBill",'outstanding_limit',$object->outstanding_limit,$object,$user->rights->societe->creer); print ''; - print $form->editfieldval("OutstandingBill",'OutstandingBill',$object->outstanding_limit,$object,$user->rights->societe->creer,'amount',($object->outstanding_limit != '' ? price($object->outstanding_limit) : '')); + $limit_field_type = (! empty($conf->global->MAIN_USE_JQUERY_JEDITABLE)) ? 'numeric' : 'amount'; + print $form->editfieldval("OutstandingBill",'outstanding_limit',$object->outstanding_limit,$object,$user->rights->societe->creer,$limit_field_type,($object->outstanding_limit != '' ? price($object->outstanding_limit) : '')); print '
'; print $langs->trans("ProductAssociationList").'
'; - - print '
'; + + print ''; print ''; print ''; - + print ''; - - print ''; - + + print ''; + print ''; + print ''; + print ''; + if (! empty($conf->stock->enabled)) print ''; + print ''; + print ''; + print ''; + foreach($prods_arbo as $value) { $productstatic->id=$value['id']; $productstatic->type=$value['type']; - + $productstatic->label=$value['label']; + $class=($class=='impair')?'pair':'impair'; - + print ''; if ($value['level'] <= 1) { $notdefined=0; - $productstatic->ref=$value['fullpath']; + $productstatic->ref=$value['ref']; $nb_of_subproduct = $value['nb']; - + print ''; - - if($user->rights->produit->creer || $user->rights->service->creer) { - print ''; - print ''; - + print ''; + + // Best buying price + print ''; + + $totalline=price2num($value['nb'] * $product_fourn->fourn_unitprice, 'MT'); + $total+=$totalline; + print ''; + + // Stock + if (! empty($conf->stock->enabled)) print ''; // Real stock + + // Qty + IncDec + if ($user->rights->produit->creer || $user->rights->service->creer) + { + print ''; + print ''; + } else{ print ''; print ''; } - - - - print ''; - $totalline=price2num($value['nb'] * $product_fourn->fourn_unitprice, 'MT'); - $total+=$totalline; - print ''; - if (! empty($conf->stock->enabled)) print ''; // Real stock } - else { - $productstatic->ref=$value['label']; + else + { + //$productstatic->ref=$value['label']; + $productstatic->ref=$value['ref']; print ''; - print ''; + print ''; + + print ''; + print ''; + + if (! empty($conf->stock->enabled)) print ''; // Real stock + print ''; print ''; - print ''; // Real stock } print ''; } print ''; - print ''; + print ''; + + // Minimum buying price + print ''; - print ''; + + print ''; + + // Stock if (! empty($conf->stock->enabled)) print ''; + + print ''; + print ''; print ''; print '
'.$langs->trans('ComposedProduct').''.$langs->trans('Qty').''.$langs->trans('ComposedProductDecreaseStock').''.$langs->trans('MinSupplierPrice').''.$langs->trans('Price').''.$langs->trans('Stock').'
'.$langs->trans('ComposedProduct').''.$langs->trans('Label').''.$langs->trans('MinSupplierPrice').''.$langs->trans('Stock').''.$langs->trans('Qty').''.$langs->trans('ComposedProductDIncDecStock').'
'.$productstatic->getNomUrl(1,'composition').''.$productstatic->label.''; + if ($product_fourn->find_min_price_product_fournisseur($productstatic->id) > 0) + { + print '   '.$langs->trans("BuyingPriceMinShort").': '; + if ($product_fourn->product_fourn_price_id > 0) print $product_fourn->display_price_product_fournisseur(0,0); + else { print $langs->trans("NotDefined"); $notdefined++; $atleastonenotdefined++; } + } + print ''; + print ($notdefined?'':($value['nb']> 1 ? $value['nb'].'x' : '').price($product_fourn->fourn_unitprice,'','',0,0,-1,$conf->currency)); + print ''.$value['stock'].''.$nb_of_subproduct.''.($value['incdec']==1?'x':'' ).''; - if ($product_fourn->find_min_price_product_fournisseur($productstatic->id) > 0) - { - print $langs->trans("BuyingPriceMinShort").': '; - if ($product_fourn->product_fourn_price_id > 0) print $product_fourn->display_price_product_fournisseur(0,0); - else { print $langs->trans("NotDefined"); $notdefined++; $atleastonenotdefined++; } - } - print ''.($notdefined?'':price($totalline,'','',0,0,-1,$conf->currency)).''.$langs->trans("Stock").': '.$value['stock'].''; - for ($i=0; $i < $value['level']; $i++) - { - print '     '; - } + for ($i=0; $i < $value['level']; $i++) print '     '; // Add indentation print $productstatic->getNomUrl(1,'composition').''.$value['nb'].''.$productstatic->label.'  '.$value['nb'].'  '; - print ' '; - if (! empty($conf->stock->enabled)) print '
'.$langs->trans("TotalBuyingPriceMin").': '; - if ($atleastonenotdefined) print $langs->trans("Unknown").' ('.$langs->trans("SomeSubProductHaveNoPrices").')'; + print ''; + print $langs->trans("TotalBuyingPriceMin"); print ''.($atleastonenotdefined?'':price($total,'','',0,0,-1,$conf->currency)).''; + if ($atleastonenotdefined) print $langs->trans("Unknown").' ('.$langs->trans("SomeSubProductHaveNoPrices").')'; + print ($atleastonenotdefined?'':price($total,'','',0,0,-1,$conf->currency)); + print ' '; + if ($user->rights->produit->creer || $user->rights->service->creer) + { + print ''; + } + print ''; + if ($user->rights->produit->creer || $user->rights->service->creer) + { + print ''; + } + print '
'; - - if($user->rights->produit->creer || $user->rights->service->creer) { - print '
'; - } - + + /*if($user->rights->produit->creer || $user->rights->service->creer) { + print ''; + }*/ + print '
'; - + print '
'.$langs->trans("ParentProductsNumber").''; print $form->textwithpicto(count($prodsfather), $langs->trans('IfZeroItIsNotUsedByVirtualProduct')); - print '
'; print ''; - print ''; print ''; if ($resql) { @@ -464,19 +498,37 @@ if ($id > 0 || ! empty($ref)) if ($conf->global->MAIN_MULTILANGS && $objp->labelm) $labeltoshow=$objp->labelm; print ''; + + if($product->is_sousproduit($id, $objp->rowid)) { - $addchecked = ' checked="checked"'; + //$addchecked = ' checked="checked"'; $qty=$product->is_sousproduit_qty; + $incdec=$product->is_sousproduit_incdec; } else { - $addchecked = ''; - $qty="1"; + //$addchecked = ''; + $qty=0; + $incdec=0; } - print ''; - print ''; + // Contained into package + /*print '';*/ + // Qty + print ''; + + // Inc Dec + print ''; + print ''; } $i++; @@ -493,9 +545,9 @@ if ($id > 0 || ! empty($ref)) if($num > 0) { print '
'; - print 'trans("Update").'">'; + print 'trans("Update").'">'; print '     '; - print ''; + print ''; print '
'; } From 76640b6b7758415e4634f7b5807718e4157a5bb8 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 25 Feb 2015 15:01:25 +0100 Subject: [PATCH 162/287] Fix removed warning --- htdocs/comm/action/class/actioncomm.class.php | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/htdocs/comm/action/class/actioncomm.class.php b/htdocs/comm/action/class/actioncomm.class.php index c879f50b346..9a9417a4dac 100644 --- a/htdocs/comm/action/class/actioncomm.class.php +++ b/htdocs/comm/action/class/actioncomm.class.php @@ -184,12 +184,12 @@ class ActionComm extends CommonObject $now=dol_now(); // Check parameters - if (empty($this->userownerid)) + if (empty($this->userownerid)) { $this->errors[]='ErrorPropertyUserowneridNotDefined'; return -1; } - + // Clean parameters $this->label=dol_trunc(trim($this->label),128); $this->location=dol_trunc(trim($this->location),128); @@ -214,7 +214,7 @@ class ActionComm extends CommonObject $userdoneid=$this->userdoneid; // Be sure assigned user is defined as an array of array('id'=>,'mandatory'=>,...). - if (empty($this->userassigned) || count($this->userassigned) == 0 || ! is_array($this->userassigned)) + if (empty($this->userassigned) || count($this->userassigned) == 0 || ! is_array($this->userassigned)) $this->userassigned = array($userownerid=>array('id'=>$userownerid)); if (! $this->type_id || ! $this->type_code) @@ -306,9 +306,9 @@ class ActionComm extends CommonObject { $val=array('id'=>$val); } - + $sql ="INSERT INTO ".MAIN_DB_PREFIX."actioncomm_resources(fk_actioncomm, element_type, fk_element, mandatory, transparency, answer_status)"; - $sql.=" VALUES(".$this->id.", 'user', ".$val['id'].", ".($val['mandatory']?$val['mandatory']:'0').", ".($val['transparency']?$val['transparency']:'0').", ".($val['answer_status']?$val['answer_status']:'0').")"; + $sql.=" VALUES(".$this->id.", 'user', ".$val['id'].", ".(empty($val['mandatory'])?'0':$val['mandatory']).", ".(empty($val['transparency'])?'0':$val['transparency']).", ".(empty($val['answer_status'])?'0':$val['answer_status']).")"; $resql = $this->db->query($sql); if (! $resql) @@ -672,7 +672,7 @@ class ActionComm extends CommonObject foreach($this->userassigned as $key => $val) { $sql ="INSERT INTO ".MAIN_DB_PREFIX."actioncomm_resources(fk_actioncomm, element_type, fk_element, mandatory, transparency, answer_status)"; - $sql.=" VALUES(".$this->id.", 'user', ".$val['id'].", ".($val['manadatory']?$val['manadatory']:'0').", ".($val['transparency']?$val['transparency']:'0').", ".($val['answer_status']?$val['answer_status']:'0').")"; + $sql.=" VALUES(".$this->id.", 'user', ".$val['id'].", ".(empty($val['manadatory'])?'0':$val['manadatory']).", ".(empty($val['transparency'])?'0':$val['transparency']).", ".(empty($val['answer_status'])?'0':$val['answer_status']).")"; $resql = $this->db->query($sql); if (! $resql) From f598963d6b1975d0a87e616ac1982400b423e454 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcos=20Garci=CC=81a=20de=20La=20Fuente?= Date: Wed, 25 Feb 2015 16:41:51 +0100 Subject: [PATCH 163/287] Fixed regression --- htdocs/core/lib/functions.lib.php | 4 +++- test/phpunit/FunctionsLibTest.php | 14 +++++++------- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php index 85690ac7c12..52c965fb005 100644 --- a/htdocs/core/lib/functions.lib.php +++ b/htdocs/core/lib/functions.lib.php @@ -135,13 +135,15 @@ function getBrowserInfo($user_agent) $name='unknown'; $version=''; $os='unknown'; - $phone = 'unknown'; + $phone = ''; $detectmobile = new MobileDetect(null, $user_agent); $tablet = $detectmobile->isTablet(); if ($detectmobile->isMobile()) { + $phone = 'unknown'; + // If phone/smartphone, we set phone os name. if ($detectmobile->is('AndroidOS')) { $os = $phone = 'android'; diff --git a/test/phpunit/FunctionsLibTest.php b/test/phpunit/FunctionsLibTest.php index 65a97881a78..f2684923126 100755 --- a/test/phpunit/FunctionsLibTest.php +++ b/test/phpunit/FunctionsLibTest.php @@ -131,7 +131,7 @@ class FunctionsLibTest extends PHPUnit_Framework_TestCase $tmp=getBrowserInfo($user_agent); $this->assertEquals('ie',$tmp['browsername']); $this->assertEquals('5.0',$tmp['browserversion']); - $this->assertFalse($tmp['phone']); + $this->assertEmpty($tmp['phone']); $this->assertFalse($tmp['tablet']); $this->assertEquals('classic', $tmp['layout']); @@ -140,7 +140,7 @@ class FunctionsLibTest extends PHPUnit_Framework_TestCase $tmp=getBrowserInfo($user_agent); $this->assertEquals('firefox',$tmp['browsername']); $this->assertEquals('0.9.1',$tmp['browserversion']); - $this->assertFalse($tmp['phone']); + $this->assertEmpty($tmp['phone']); $this->assertFalse($tmp['tablet']); $this->assertEquals('classic', $tmp['layout']); @@ -148,7 +148,7 @@ class FunctionsLibTest extends PHPUnit_Framework_TestCase $tmp=getBrowserInfo($user_agent); $this->assertEquals('opera',$tmp['browsername']); $this->assertEquals('6.03',$tmp['browserversion']); - $this->assertFalse($tmp['phone']); + $this->assertEmpty($tmp['phone']); $this->assertFalse($tmp['tablet']); $this->assertEquals('classic', $tmp['layout']); @@ -156,7 +156,7 @@ class FunctionsLibTest extends PHPUnit_Framework_TestCase $tmp=getBrowserInfo($user_agent); $this->assertEquals('chrome',$tmp['browsername']); $this->assertEquals('19.0.1042.0',$tmp['browserversion']); - $this->assertFalse($tmp['phone']); + $this->assertEmpty($tmp['phone']); $this->assertFalse($tmp['tablet']); $this->assertEquals('classic', $tmp['layout']); @@ -164,7 +164,7 @@ class FunctionsLibTest extends PHPUnit_Framework_TestCase $tmp=getBrowserInfo($user_agent); $this->assertEquals('chrome',$tmp['browsername']); $this->assertEquals('17.0.963.56',$tmp['browserversion']); - $this->assertFalse($tmp['phone']); + $this->assertEmpty($tmp['phone']); $this->assertFalse($tmp['tablet']); $this->assertEquals('classic', $tmp['layout']); @@ -172,7 +172,7 @@ class FunctionsLibTest extends PHPUnit_Framework_TestCase $tmp=getBrowserInfo($user_agent); $this->assertEquals('safari',$tmp['browsername']); $this->assertEquals('533.21.1',$tmp['browserversion']); - $this->assertFalse($tmp['phone']); + $this->assertEmpty($tmp['phone']); $this->assertFalse($tmp['tablet']); $this->assertEquals('classic', $tmp['layout']); @@ -181,7 +181,7 @@ class FunctionsLibTest extends PHPUnit_Framework_TestCase $tmp=getBrowserInfo($user_agent); $this->assertEquals('ie',$tmp['browsername']); $this->assertEquals('11.0',$tmp['browserversion']); - $this->assertFalse($tmp['phone']); + $this->assertEmpty($tmp['phone']); $this->assertFalse($tmp['tablet']); $this->assertEquals('classic', $tmp['layout']); From 40a5c15616cd5e3464d10fc2eb2c55b6eaae6bf6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcos=20Garci=CC=81a=20de=20La=20Fuente?= Date: Wed, 25 Feb 2015 16:45:14 +0100 Subject: [PATCH 164/287] Improved getBrowserInfo documentation --- htdocs/core/lib/functions.lib.php | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php index 52c965fb005..7b09e1bcf1f 100644 --- a/htdocs/core/lib/functions.lib.php +++ b/htdocs/core/lib/functions.lib.php @@ -125,8 +125,18 @@ function getEntity($element=false, $shared=false) /** * Return information about user browser * + * Returns array with the following format: + * array( + * 'browsername' => Browser name (firefox|chrome|iceweasel|epiphany|safari|opera|ie|unknown) + * 'browserversion' => Browser version. Empty if unknown + * 'browseros' => Set with mobile OS (android|blackberry|ios|palm|symbian|webos|maemo|windows|unknown) + * 'layout' => (tablet|phone|classic) + * 'phone' => empty if not mobile, (android|blackberry|ios|palm|unknown) if mobile + * 'tablet' => true/false + * ) + * * @param string $user_agent Content of $_SERVER["HTTP_USER_AGENT"] variable - * @return array Array of information ('browsername'=>,'browseros'=>,'browserversion'=>,'layout'=>(classic|phone|tablet)) + * @return array Check function documentation */ function getBrowserInfo($user_agent) { From ceec3e926e191ac07db256f3c6720239c559acf6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcos=20Garci=CC=81a=20de=20La=20Fuente?= Date: Wed, 25 Feb 2015 16:47:34 +0100 Subject: [PATCH 165/287] Typo --- test/phpunit/FunctionsLibTest.php | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/test/phpunit/FunctionsLibTest.php b/test/phpunit/FunctionsLibTest.php index f2684923126..2ebebb2b4dc 100755 --- a/test/phpunit/FunctionsLibTest.php +++ b/test/phpunit/FunctionsLibTest.php @@ -26,20 +26,19 @@ global $conf,$user,$langs,$db; //define('TEST_DB_FORCE_TYPE','mysql'); // This is to force using mysql driver //require_once 'PHPUnit/Autoload.php'; -//require_once dirname(__FILE__).'/../../htdocs/master.inc.php'; -//require_once dirname(__FILE__).'/../../htdocs/core/lib/date.lib.php'; -// -//if (! defined('NOREQUIREUSER')) define('NOREQUIREUSER','1'); -//if (! defined('NOREQUIREDB')) define('NOREQUIREDB','1'); -//if (! defined('NOREQUIRESOC')) define('NOREQUIRESOC','1'); -//if (! defined('NOREQUIRETRAN')) define('NOREQUIRETRAN','1'); -//if (! defined('NOCSRFCHECK')) define('NOCSRFCHECK','1'); -//if (! defined('NOTOKENRENEWAL')) define('NOTOKENRENEWAL','1'); -//if (! defined('NOREQUIREMENU')) define('NOREQUIREMENU','1'); // If there is no menu to show -//if (! defined('NOREQUIREHTML')) define('NOREQUIREHTML','1'); // If we don't need to load the html.form.class.php -//if (! defined('NOREQUIREAJAX')) define('NOREQUIREAJAX','1'); -//if (! defined("NOLOGIN")) define("NOLOGIN",'1'); // If this page is public (can be called outside logged session) -require_once dirname(__FILE__).'/../../htdocs/core/lib/functions.lib.php'; +require_once dirname(__FILE__).'/../../htdocs/master.inc.php'; +require_once dirname(__FILE__).'/../../htdocs/core/lib/date.lib.php'; + +if (! defined('NOREQUIREUSER')) define('NOREQUIREUSER','1'); +if (! defined('NOREQUIREDB')) define('NOREQUIREDB','1'); +if (! defined('NOREQUIRESOC')) define('NOREQUIRESOC','1'); +if (! defined('NOREQUIRETRAN')) define('NOREQUIRETRAN','1'); +if (! defined('NOCSRFCHECK')) define('NOCSRFCHECK','1'); +if (! defined('NOTOKENRENEWAL')) define('NOTOKENRENEWAL','1'); +if (! defined('NOREQUIREMENU')) define('NOREQUIREMENU','1'); // If there is no menu to show +if (! defined('NOREQUIREHTML')) define('NOREQUIREHTML','1'); // If we don't need to load the html.form.class.php +if (! defined('NOREQUIREAJAX')) define('NOREQUIREAJAX','1'); +if (! defined("NOLOGIN")) define("NOLOGIN",'1'); // If this page is public (can be called outside logged session) /** * Class for PHPUnit tests From 91fa823075d6f6983706d38817c4c7cea9e08deb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcos=20Garci=CC=81a=20de=20La=20Fuente?= Date: Wed, 25 Feb 2015 18:03:31 +0100 Subject: [PATCH 166/287] Marked getStaticMember as deprecated --- htdocs/core/lib/functions.lib.php | 1 + 1 file changed, 1 insertion(+) diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php index bb4176a00e3..0f06eadadce 100644 --- a/htdocs/core/lib/functions.lib.php +++ b/htdocs/core/lib/functions.lib.php @@ -44,6 +44,7 @@ include_once DOL_DOCUMENT_ROOT .'/core/lib/json.lib.php'; * @param string $class Class name * @param string $member Name of property * @return mixed Return value of static property + * @deprecated Dolibarr now requires 5.3.0+ */ function getStaticMember($class, $member) { From 0a5f17f1795f61cf4bc78607edb1879b1c8665fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcos=20Garci=CC=81a=20de=20La=20Fuente?= Date: Wed, 25 Feb 2015 18:06:54 +0100 Subject: [PATCH 167/287] Undefined variable + Unreachable statement --- htdocs/core/lib/functions.lib.php | 26 +------------------------- 1 file changed, 1 insertion(+), 25 deletions(-) diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php index bb4176a00e3..5aa6bb88e53 100644 --- a/htdocs/core/lib/functions.lib.php +++ b/htdocs/core/lib/functions.lib.php @@ -3195,7 +3195,7 @@ function getLocalTaxesFromRate($vatrate, $local, $buyer, $seller) { global $db; - dol_syslog("getLocalTaxesFromRate vatrate=".$vatrate." local=".$local." thirdparty id=".(is_object($thirdparty)?$thirdparty->id:'')); + dol_syslog("getLocalTaxesFromRate vatrate=".$vatrate." local=".$local); // Search local taxes $sql = "SELECT t.localtax1, t.localtax1_type, t.localtax2, t.localtax2_type, t.accountancy_code_sell, t.accountancy_code_buy"; @@ -3253,30 +3253,6 @@ function getLocalTaxesFromRate($vatrate, $local, $buyer, $seller) return array($obj->localtax1_type, $obj->localtax1, $obj->localtax2_type, $obj->localtax2,$obj->accountancy_code_sell,$obj->accountancy_code_buy); } } - - if(! isOnlyOneLocalTax(2)) - { - if(! isOnlyOneLocalTax(1)) - { - return array($obj->localtax2_type, get_localtax($vatrate, 1, $buyer, $seller), $obj->localtax2_type, get_localtax($vatrate, 2, $buyer, $seller),$obj->accountancy_code_sell,$obj->accountancy_code_buy); - } - else - { - return array($obj->localtax2_type, get_localtax($vatrate, 1, $buyer, $seller), $obj->localtax2_type, $obj->localtax2,$obj->accountancy_code_sell,$obj->accountancy_code_buy); - } - } - else - { - if(! isOnlyOneLocalTax(1)) - { - return array($obj->localtax2_type, $obj->localtax2, $obj->localtax1_type,get_localtax($vatrate, 1, $buyer, $seller) ,$obj->accountancy_code_sell,$obj->accountancy_code_buy); - } - else - { - return array($obj->localtax2_type, $obj->localtax2, $obj->localtax1_type, $obj->localtax1,$obj->accountancy_code_sell,$obj->accountancy_code_buy); - } - } - } } From fb959abc63b694b50ba77fd8db3f3184df798809 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcos=20Garci=CC=81a=20de=20La=20Fuente?= Date: Wed, 25 Feb 2015 18:24:36 +0100 Subject: [PATCH 168/287] Misc PHPdoc fixes --- htdocs/core/class/conf.class.php | 4 ++++ htdocs/core/lib/functions.lib.php | 30 ++++++++++++++++-------------- 2 files changed, 20 insertions(+), 14 deletions(-) diff --git a/htdocs/core/class/conf.class.php b/htdocs/core/class/conf.class.php index 9127ed614b3..d63ba2fb4ef 100644 --- a/htdocs/core/class/conf.class.php +++ b/htdocs/core/class/conf.class.php @@ -54,6 +54,10 @@ class Conf public $modules_parts = array('css'=>array(),'js'=>array(),'tabs'=>array(),'triggers'=>array(),'login'=>array(),'substitutions'=>array(),'menus'=>array(),'theme'=>array(),'sms'=>array(),'tpl'=>array(),'barcode'=>array(),'models'=>array(),'societe'=>array(),'hooks'=>array(),'dir'=>array()); var $logbuffer = array(); + + /** + * @var LogHandlerInterface[] + */ var $loghandlers = array(); //! To store properties of multi-company diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php index 5aa6bb88e53..0fe78707ec6 100644 --- a/htdocs/core/lib/functions.lib.php +++ b/htdocs/core/lib/functions.lib.php @@ -385,7 +385,7 @@ function dol_size($size,$type='') * * @param string $str String to clean * @param string $newstr String to replace bad chars with - * @param string $unaccent 1=Remove also accent (default), 0 do not remove them + * @param int $unaccent 1=Remove also accent (default), 0 do not remove them * @return string String cleaned (a-zA-Z_) * * @see dol_string_nospecial, dol_string_unaccent @@ -487,8 +487,8 @@ function dolEscapeXML($string) * Returns text escaped for inclusion into javascript code * * @param string $stringtoescape String to escape - * @param string $mode 0=Escape also ' and " into ', 1=Escape ' but not " for usage into 'string', 2=Escape " but not ' for usage into "string", 3=Escape ' and " with \ - * @param string $noescapebackslashn 0=Escape also \n. 1=Do not escape \n. + * @param int $mode 0=Escape also ' and " into ', 1=Escape ' but not " for usage into 'string', 2=Escape " but not ' for usage into "string", 3=Escape ' and " with \ + * @param int $noescapebackslashn 0=Escape also \n. 1=Do not escape \n. * @return string Escaped string. Both ' and " are escaped into ' if they are escaped. */ function dol_escape_js($stringtoescape, $mode=0, $noescapebackslashn=0) @@ -572,7 +572,7 @@ function dol_syslog($message, $level = LOG_INFO, $ident = 0, $suffixinfilename=' global $conf, $user; // If syslog module enabled - if (empty($conf->syslog->enabled)) return false; + if (empty($conf->syslog->enabled)) return; if (! empty($level)) { @@ -582,7 +582,7 @@ function dol_syslog($message, $level = LOG_INFO, $ident = 0, $suffixinfilename=' { throw new Exception('Incorrect log level'); } - if ($level > $conf->global->SYSLOG_LEVEL) return false; + if ($level > $conf->global->SYSLOG_LEVEL) return; // If adding log inside HTML page is required if (! empty($_REQUEST['logtohtml']) && ! empty($conf->global->MAIN_LOGTOHTML)) @@ -590,6 +590,7 @@ function dol_syslog($message, $level = LOG_INFO, $ident = 0, $suffixinfilename=' $conf->logbuffer[] = dol_print_date(time(),"%Y-%m-%d %H:%M:%S")." ".$message; } + //TODO: Remove this. MAIN_ENABLE_LOG_HTML should be deprecated and use a HTML handler // If enable html log tag enabled and url parameter log defined, we show output log on HTML comments if (! empty($conf->global->MAIN_ENABLE_LOG_HTML) && ! empty($_GET["log"])) { @@ -768,7 +769,7 @@ function dol_bc($var,$moreclass='') * @param Object $object A company or contact object * @param int $withcountry 1=Add country into address string * @param string $sep Separator to use to build string - * @param Tranlsate $outputlangs Object lang that contains language for text translation. + * @param Translate $outputlangs Object lang that contains language for text translation. * @return string Formated string */ function dol_format_address($object,$withcountry=0,$sep="\n",$outputlangs='') @@ -1348,7 +1349,7 @@ function dol_print_skype($skype,$cid=0,$socid=0,$addlink=0,$max=64) * @param string $country Country code to use for formatting * @param int $cid Id of contact if known * @param int $socid Id of third party if known - * @param int $addlink ''=no link to create action, 'AC_TEL'=add link to clicktodial (if module enabled) and add link to create event (if conf->global->AGENDA_ADDACTIONFORPHONE set) + * @param string $addlink ''=no link to create action, 'AC_TEL'=add link to clicktodial (if module enabled) and add link to create event (if conf->global->AGENDA_ADDACTIONFORPHONE set) * @param string $separ Separation between numbers for a better visibility example : xx.xx.xx.xx.xx * @return string Formated phone number */ @@ -1564,6 +1565,7 @@ function isValidEmail($address) /** * Return true if phone number syntax is ok * + * TODO: Decide what to do with this * @param string $phone phone (Ex: "0601010101") * @return boolean true if phone syntax is OK, false if KO or empty string */ @@ -2649,7 +2651,7 @@ function print_fiche_titre($title, $mesg='', $picto='title.png', $pictoisfullpat * @param int $id To force an id on html objects * @return string */ -function load_fiche_titre($titre, $mesg='', $picto='title.png', $pictoisfullpath=0, $id='') +function load_fiche_titre($titre, $mesg='', $picto='title.png', $pictoisfullpath=0, $id=0) { global $conf; @@ -3987,7 +3989,7 @@ function dol_textishtml($msg,$option=0) * * @param string $text1 Text 1 * @param string $text2 Text 2 - * @param string $forxml false=Use
, true=Use
+ * @param bool $forxml false=Use
, true=Use
* @return string Text 1 + new line + Text2 * @see dol_textishtml */ @@ -4029,7 +4031,7 @@ function make_substitutions($chaine,$substitutionarray) * * @param array $substitutionarray Array substitution old value => new value value * @param Translate $outputlangs If we want substitution from special constants, we provide a language - * @param Object $object If we want substitution from special constants, we provide data in a source object + * @param object $object If we want substitution from special constants, we provide data in a source object * @param Mixed $parameters Add more parameters (useful to pass product lines) * @param string $callfunc What is the name of the custom function that will be called? (default: completesubstitutionarray) * @return void @@ -4072,8 +4074,8 @@ function complete_substitutions_array(&$substitutionarray,$outputlangs,$object=' /** * Format output for start and end date * - * @param timestamp $date_start Start date - * @param timestamp $date_end End date + * @param int $date_start Start date + * @param int $date_end End date * @param string $format Output format * @param Translate $outputlangs Output language * @return void @@ -4086,8 +4088,8 @@ function print_date_range($date_start,$date_end,$format = '',$outputlangs='') /** * Format output for start and end date * - * @param timestamp $date_start Start date - * @param timestamp $date_end End date + * @param int $date_start Start date + * @param int $date_end End date * @param string $format Output format * @param Translate $outputlangs Output language * @return string String From b9d31758972d6a76d70b41b1bab6b3b3caefb8ac Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 25 Feb 2015 23:04:13 +0100 Subject: [PATCH 169/287] Fix typo --- htdocs/langs/en_US/products.lang | 2 +- htdocs/product/composition/card.php | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/htdocs/langs/en_US/products.lang b/htdocs/langs/en_US/products.lang index 841f497b674..eb7261ab613 100755 --- a/htdocs/langs/en_US/products.lang +++ b/htdocs/langs/en_US/products.lang @@ -251,6 +251,6 @@ PriceExpressionEditorHelp4=In product/service price only: #supplier_min_price PriceMode=Price mode PriceNumeric=Number DefaultPrice=Default price -ComposedProductDIncDecStock=Increase/Decrease stock on parent change +ComposedProductIncDecStock=Increase/Decrease stock on parent change ComposedProduct=Sub-product MinSupplierPrice=Minimun supplier price diff --git a/htdocs/product/composition/card.php b/htdocs/product/composition/card.php index 1d551dd9ab1..af339c8270c 100644 --- a/htdocs/product/composition/card.php +++ b/htdocs/product/composition/card.php @@ -261,7 +261,7 @@ if ($id > 0 || ! empty($ref)) print '
'; if (! empty($conf->stock->enabled)) print ''; print ''; - print ''; + print ''; print ''; foreach($prods_arbo as $value) @@ -446,7 +446,7 @@ if ($id > 0 || ! empty($ref)) print ''; + print ''; print ''; if ($resql) { From 386eaf0911bee2c740a3defb4717a2754bc848cf Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 26 Feb 2015 12:11:31 +0100 Subject: [PATCH 170/287] Fix: bad sql request --- htdocs/comm/propal/class/propal.class.php | 1 + 1 file changed, 1 insertion(+) diff --git a/htdocs/comm/propal/class/propal.class.php b/htdocs/comm/propal/class/propal.class.php index ca4c51c3f4c..929932b47c2 100644 --- a/htdocs/comm/propal/class/propal.class.php +++ b/htdocs/comm/propal/class/propal.class.php @@ -3088,6 +3088,7 @@ class PropaleLigne extends CommonObject if (empty($this->special_code)) $this->special_code=0; if (empty($this->fk_parent_line)) $this->fk_parent_line=0; if (empty($this->fk_fournprice)) $this->fk_fournprice=0; + if (empty($this->subprice)) $this->subprice=0; if (empty($this->pa_ht)) $this->pa_ht=0; From 41a74c62e2d01823e7ae8625ad57998089b28de4 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 26 Feb 2015 13:03:17 +0100 Subject: [PATCH 171/287] Fix trigger to insert lines where called when inserting line but also when cloning parent object, making no way to know when to use them or not. I introduced a context to allow code to know that and do not triggers twice. --- htdocs/comm/mailing/class/mailing.class.php | 50 +++-- htdocs/comm/propal/class/propal.class.php | 6 + htdocs/commande/class/commande.class.php | 4 + htdocs/compta/bank/class/bankcateg.class.php | 6 +- htdocs/compta/facture/class/facture.class.php | 4 + .../facture/class/paymentterm.class.php | 5 + .../class/paymentsocialcontribution.class.php | 4 + htdocs/core/class/commonobject.class.php | 1 + htdocs/cron/class/cronjob.class.php | 4 + .../class/fournisseur.commande.class.php | 8 +- .../fourn/class/fournisseur.facture.class.php | 6 +- htdocs/product/class/productbatch.class.php | 6 +- .../class/productcustomerprice.class.php | 198 +++++++++--------- htdocs/projet/class/project.class.php | 22 +- htdocs/projet/class/task.class.php | 21 +- 15 files changed, 196 insertions(+), 149 deletions(-) diff --git a/htdocs/comm/mailing/class/mailing.class.php b/htdocs/comm/mailing/class/mailing.class.php index 2f8f7f18e4e..69a3520d1e8 100644 --- a/htdocs/comm/mailing/class/mailing.class.php +++ b/htdocs/comm/mailing/class/mailing.class.php @@ -57,7 +57,7 @@ class Mailing extends CommonObject var $date_creat; var $date_valid; - + var $extraparams=array(); public $statut_dest=array(); @@ -78,12 +78,12 @@ class Mailing extends CommonObject $this->statuts[1] = 'MailingStatusValidated'; $this->statuts[2] = 'MailingStatusSentPartialy'; $this->statuts[3] = 'MailingStatusSentCompletely'; - + $this->statut_dest[-1] = 'MailingStatusError'; $this->statut_dest[1] = 'MailingStatusSent'; $this->statut_dest[2] = 'MailingStatusRead'; $this->statut_dest[3] = 'MailingStatusNotContact'; - + } /** @@ -186,7 +186,7 @@ class Mailing extends CommonObject function fetch($rowid) { global $conf; - + $sql = "SELECT m.rowid, m.titre, m.sujet, m.body, m.bgcolor, m.bgimage"; $sql.= ", m.email_from, m.email_replyto, m.email_errorsto"; $sql.= ", m.statut, m.nbemail"; @@ -211,14 +211,14 @@ class Mailing extends CommonObject $this->statut = $obj->statut; $this->nbemail = $obj->nbemail; $this->titre = $obj->titre; - - $this->sujet = $obj->sujet; + + $this->sujet = $obj->sujet; if (!empty($conf->global->FCKEDITOR_ENABLE_MAILING) && dol_textishtml(dol_html_entity_decode($obj->body, ENT_COMPAT | ENT_HTML401))) { $this->body = dol_html_entity_decode($obj->body, ENT_COMPAT | ENT_HTML401); }else { $this->body = $obj->body; } - + $this->bgcolor = $obj->bgcolor; $this->bgimage = $obj->bgimage; @@ -232,7 +232,7 @@ class Mailing extends CommonObject $this->date_creat = $this->db->jdate($obj->date_creat); $this->date_valid = $this->db->jdate($obj->date_valid); $this->date_envoi = $this->db->jdate($obj->date_envoi); - + $this->extraparams = (array) json_decode($obj->extraparams, true); return 1; @@ -267,6 +267,8 @@ class Mailing extends CommonObject $object=new Mailing($this->db); + $object->context['createfromclone']='createfromclone'; + $this->db->begin(); // Load source object @@ -313,13 +315,13 @@ class Mailing extends CommonObject { //Clone target if (!empty($option2)) { - + require_once DOL_DOCUMENT_ROOT .'/core/modules/mailings/modules_mailings.php'; - + $mailing_target = new MailingTargets($this->db); - + $target_array=array(); - + $sql = "SELECT fk_contact, "; $sql.=" lastname, "; $sql.=" firstname,"; @@ -330,7 +332,7 @@ class Mailing extends CommonObject $sql.=" source_type "; $sql.= " FROM ".MAIN_DB_PREFIX."mailing_cibles "; $sql.= " WHERE fk_mailing = ".$fromid; - + dol_syslog(get_class($this)."::createFromClone", LOG_DEBUG); $result=$this->db->query($sql); if ($result) @@ -338,17 +340,17 @@ class Mailing extends CommonObject if ($this->db->num_rows($result)) { while ($obj = $this->db->fetch_object($result)) { - + $target_array[]=array('fk_contact'=>$obj->fk_contact, 'lastname'=>$obj->lastname, 'firstname'=>$obj->firstname, - 'email'=>$obj->email, + 'email'=>$obj->email, 'other'=>$obj->other, 'source_url'=>$obj->source_url, 'source_id'=>$obj->source_id, 'source_type'=>$obj->source_type); } - + } } else @@ -356,12 +358,14 @@ class Mailing extends CommonObject $this->error=$this->db->lasterror(); return -1; } - + $mailing_target->add_to_target($object->id, $target_array); } } + unset($object->context['createfromclone']); + // End if (! $error) { @@ -514,7 +518,7 @@ class Mailing extends CommonObject } } - + /** * Renvoi le libelle d'un statut donne * @@ -526,7 +530,7 @@ class Mailing extends CommonObject { global $langs; $langs->load('mails'); - + if ($mode == 0) { return $langs->trans($this->statut_dest[$statut]); @@ -563,10 +567,10 @@ class Mailing extends CommonObject if ($statut==2) return $langs->trans("MailingStatusRead").' '.img_picto($langs->trans("MailingStatusRead"),'statut6'); if ($statut==3) return $langs->trans("MailingStatusNotContact").' '.img_picto($langs->trans("MailingStatusNotContact"),'statut8'); } - - - - + + + + } } diff --git a/htdocs/comm/propal/class/propal.class.php b/htdocs/comm/propal/class/propal.class.php index 929932b47c2..26c2c0a0d64 100644 --- a/htdocs/comm/propal/class/propal.class.php +++ b/htdocs/comm/propal/class/propal.class.php @@ -393,6 +393,8 @@ class Propal extends CommonObject // Insert line $this->line=new PropaleLigne($this->db); + $this->line->context = $this->context; + $this->line->fk_propal=$this->id; $this->line->label=$label; $this->line->desc=$desc; @@ -953,6 +955,8 @@ class Propal extends CommonObject { global $user,$langs,$conf,$hookmanager; + $this->context['createfromclone']='createfromclone'; + $error=0; $now=dol_now(); @@ -1046,6 +1050,8 @@ class Propal extends CommonObject // End call triggers } + unset($this->context['createfromclone']); + // End if (! $error) { diff --git a/htdocs/commande/class/commande.class.php b/htdocs/commande/class/commande.class.php index 35834419a74..2e98f6f21de 100644 --- a/htdocs/commande/class/commande.class.php +++ b/htdocs/commande/class/commande.class.php @@ -878,6 +878,8 @@ class Commande extends CommonOrder $error=0; + $this->context['createfromclone'] = 'createfromclone'; + $this->db->begin(); // get extrafields so they will be clone @@ -942,6 +944,8 @@ class Commande extends CommonOrder // End call triggers } + unset($this->context['createfromclone']); + // End if (! $error) { diff --git a/htdocs/compta/bank/class/bankcateg.class.php b/htdocs/compta/bank/class/bankcateg.class.php index fb796b219ee..5004d13caf1 100644 --- a/htdocs/compta/bank/class/bankcateg.class.php +++ b/htdocs/compta/bank/class/bankcateg.class.php @@ -300,7 +300,9 @@ class BankCateg // extends CommonObject $object=new BankCateg($this->db); - $this->db->begin(); + $object->context['createfromclone'] = 'createfromclone'; + + $this->db->begin(); // Load source object $object->fetch($fromid); @@ -327,6 +329,8 @@ class BankCateg // extends CommonObject } + unset($object->context['createfromclone']); + // End if (! $error) { diff --git a/htdocs/compta/facture/class/facture.class.php b/htdocs/compta/facture/class/facture.class.php index d50079f78c8..08f17832c42 100644 --- a/htdocs/compta/facture/class/facture.class.php +++ b/htdocs/compta/facture/class/facture.class.php @@ -607,6 +607,8 @@ class Facture extends CommonInvoice $error=0; + $this->context['createfromclone'] = 'createfromclone'; + $this->db->begin(); // get extrafields so they will be clone @@ -693,6 +695,8 @@ class Facture extends CommonInvoice // End call triggers } + unset($this->context['createfromclone']); + // End if (! $error) { diff --git a/htdocs/compta/facture/class/paymentterm.class.php b/htdocs/compta/facture/class/paymentterm.class.php index b75bb056e03..d524c501698 100644 --- a/htdocs/compta/facture/class/paymentterm.class.php +++ b/htdocs/compta/facture/class/paymentterm.class.php @@ -33,6 +33,7 @@ class PaymentTerm // extends CommonObject var $errors=array(); //!< To return several error codes (or messages) //public $element='c_payment_term'; //!< Id that identify managed objects //public $table_element='c_payment_term'; //!< Name of table without prefix where object is stored + var $context =array(); var $id; @@ -409,6 +410,8 @@ class PaymentTerm // extends CommonObject $object=new PaymentTerm($this->db); + $object->context['createfromclone'] = 'createfromclone'; + $this->db->begin(); // Load source object @@ -436,6 +439,8 @@ class PaymentTerm // extends CommonObject } + unset($this->context['createfromclone']); + // End if (! $error) { diff --git a/htdocs/compta/sociales/class/paymentsocialcontribution.class.php b/htdocs/compta/sociales/class/paymentsocialcontribution.class.php index 395932de69f..10f856cf858 100644 --- a/htdocs/compta/sociales/class/paymentsocialcontribution.class.php +++ b/htdocs/compta/sociales/class/paymentsocialcontribution.class.php @@ -384,6 +384,8 @@ class PaymentSocialContribution extends CommonObject $object=new PaymentSocialContribution($this->db); + $object->context['createfromclone'] = 'createfromclone'; + $this->db->begin(); // Load source object @@ -411,6 +413,8 @@ class PaymentSocialContribution extends CommonObject } + unset($this->context['createfromclone']); + // End if (! $error) { diff --git a/htdocs/core/class/commonobject.class.php b/htdocs/core/class/commonobject.class.php index 8a8258ca641..4dc3b55c057 100644 --- a/htdocs/core/class/commonobject.class.php +++ b/htdocs/core/class/commonobject.class.php @@ -38,6 +38,7 @@ abstract class CommonObject public $error; public $errors; public $canvas; // Contains canvas name if it is + public $context=array(); // Use to pass context information public $name; public $lastname; diff --git a/htdocs/cron/class/cronjob.class.php b/htdocs/cron/class/cronjob.class.php index 723660f1d9c..5f2ef68b194 100644 --- a/htdocs/cron/class/cronjob.class.php +++ b/htdocs/cron/class/cronjob.class.php @@ -718,6 +718,8 @@ class Cronjob extends CommonObject $object=new Cronjob($this->db); + $object->context['createfromclone'] = 'createfromclone'; + $this->db->begin(); // Load source object @@ -744,6 +746,8 @@ class Cronjob extends CommonObject } + unset($this->context['createfromclone']); + // End if (! $error) { diff --git a/htdocs/fourn/class/fournisseur.commande.class.php b/htdocs/fourn/class/fournisseur.commande.class.php index 5faba969755..95c8c1801a7 100644 --- a/htdocs/fourn/class/fournisseur.commande.class.php +++ b/htdocs/fourn/class/fournisseur.commande.class.php @@ -1024,7 +1024,9 @@ class CommandeFournisseur extends CommonOrder $error=0; - $this->db->begin(); + $this->context['createfromclone'] = 'createfromclone'; + + $this->db->begin(); // Load source object $objFrom = dol_clone($this); @@ -1060,7 +1062,9 @@ class CommandeFournisseur extends CommonOrder // End call triggers } - // End + unset($this->context['createfromclone']); + + // End if (! $error) { $this->db->commit(); diff --git a/htdocs/fourn/class/fournisseur.facture.class.php b/htdocs/fourn/class/fournisseur.facture.class.php index 96e00aba182..7f2697d7c0c 100644 --- a/htdocs/fourn/class/fournisseur.facture.class.php +++ b/htdocs/fourn/class/fournisseur.facture.class.php @@ -1699,7 +1699,9 @@ class FactureFournisseur extends CommonInvoice $object=new FactureFournisseur($this->db); - $this->db->begin(); + $object->context['createfromclone'] = 'createfromclone'; + + $this->db->begin(); // Load source object $object->fetch($fromid); @@ -1745,6 +1747,8 @@ class FactureFournisseur extends CommonInvoice } + unset($object->context['createfromclone']); + // End if (! $error) { diff --git a/htdocs/product/class/productbatch.class.php b/htdocs/product/class/productbatch.class.php index a4df7a95829..839dce77fed 100644 --- a/htdocs/product/class/productbatch.class.php +++ b/htdocs/product/class/productbatch.class.php @@ -327,7 +327,9 @@ class Productbatch extends CommonObject $object=new Productbatch($this->db); - $this->db->begin(); + $object->context['createfromclone']='createfromclone'; + + $this->db->begin(); // Load source object $object->fetch($fromid); @@ -353,6 +355,8 @@ class Productbatch extends CommonObject } + unset($object->context['createfromclone']); + // End if (! $error) { diff --git a/htdocs/product/class/productcustomerprice.class.php b/htdocs/product/class/productcustomerprice.class.php index 4cc6e7feb49..62d9bb0a406 100644 --- a/htdocs/product/class/productcustomerprice.class.php +++ b/htdocs/product/class/productcustomerprice.class.php @@ -75,9 +75,9 @@ class Productcustomerprice extends CommonObject global $conf, $langs; $error = 0; - + // Clean parameters - + if (isset($this->entity)) $this->entity = trim($this->entity); if (isset($this->fk_product)) @@ -106,16 +106,16 @@ class Productcustomerprice extends CommonObject $this->fk_user = trim($this->fk_user); if (isset($this->import_key)) $this->import_key = trim($this->import_key); - + // Check parameters // Put here code to add control on parameters values - + if ($this->price != '' || $this->price == 0) { if ($this->price_base_type == 'TTC') { $this->price_ttc = price2num($this->price, 'MU'); $this->price = price2num($this->price) / (1 + ($this->tva_tx / 100)); $this->price = price2num($this->price, 'MU'); - + if ($this->price_min != '' || $this->price_min == 0) { $this->price_min_ttc = price2num($this->price_min, 'MU'); $this->price_min = price2num($this->price_min) / (1 + ($this->tva_tx / 100)); @@ -128,7 +128,7 @@ class Productcustomerprice extends CommonObject $this->price = price2num($this->price, 'MU'); $this->price_ttc = ($this->recuperableonly != 1) ? price2num($this->price) * (1 + ($this->tva_tx / 100)) : $this->price; $this->price_ttc = price2num($this->price_ttc, 'MU'); - + if ($this->price_min != '' || $this->price_min == 0) { $this->price_min = price2num($this->price_min, 'MU'); $this->price_min_ttc = price2num($this->price_min) * (1 + ($this->tva_tx / 100)); @@ -140,10 +140,10 @@ class Productcustomerprice extends CommonObject } } } - + // Insert request $sql = "INSERT INTO " . MAIN_DB_PREFIX . "product_customer_price("; - + $sql .= "entity,"; $sql .= "datec,"; $sql .= "fk_product,"; @@ -159,9 +159,9 @@ class Productcustomerprice extends CommonObject $sql .= "localtax2_tx,"; $sql .= "fk_user,"; $sql .= "import_key"; - + $sql .= ") VALUES ("; - + $sql .= " " . $conf->entity . ","; $sql .= " '" . $this->db->idate(dol_now()) . "',"; $sql .= " " . (! isset($this->fk_product) ? 'NULL' : "'" . $this->fk_product . "'") . ","; @@ -177,25 +177,25 @@ class Productcustomerprice extends CommonObject $sql .= " " . (! isset($this->localtax2_tx) ? 'NULL' : "'" . $this->localtax2_tx . "'") . ","; $sql .= " " . $user->id . ","; $sql .= " " . (! isset($this->import_key) ? 'NULL' : "'" . $this->db->escape($this->import_key) . "'") . ""; - + $sql .= ")"; - + $this->db->begin(); - + dol_syslog(get_class($this) . "::create", LOG_DEBUG); $resql = $this->db->query($sql); if (! $resql) { $error ++; $this->errors [] = "Error " . $this->db->lasterror(); } - + if (! $error) { $this->id = $this->db->last_insert_id(MAIN_DB_PREFIX . "product_customer_price"); - + if (! $notrigger) { // Uncomment this and change MYOBJECT to your own tag if you // want this action calls a trigger. - + // // Call triggers // include_once DOL_DOCUMENT_ROOT . '/core/class/interfaces.class.php'; // $interface=new Interfaces($this->db); @@ -204,14 +204,14 @@ class Productcustomerprice extends CommonObject // // End call triggers } } - + if (! $error) { $result = $this->setPriceOnAffiliateThirdparty($user, $forceupdateaffiliate); if ($result < 0) { $error ++; } } - + // Commit or rollback if ($error) { foreach ( $this->errors as $errmsg ) { @@ -237,7 +237,7 @@ class Productcustomerprice extends CommonObject global $langs; $sql = "SELECT"; $sql .= " t.rowid,"; - + $sql .= " t.entity,"; $sql .= " t.datec,"; $sql .= " t.tms,"; @@ -254,18 +254,18 @@ class Productcustomerprice extends CommonObject $sql .= " t.localtax2_tx,"; $sql .= " t.fk_user,"; $sql .= " t.import_key"; - + $sql .= " FROM " . MAIN_DB_PREFIX . "product_customer_price as t"; $sql .= " WHERE t.rowid = " . $id; - + dol_syslog(get_class($this) . "::fetch", LOG_DEBUG); $resql = $this->db->query($sql); if ($resql) { if ($this->db->num_rows($resql)) { $obj = $this->db->fetch_object($resql); - + $this->id = $obj->rowid; - + $this->entity = $obj->entity; $this->datec = $this->db->jdate($obj->datec); $this->tms = $this->db->jdate($obj->tms); @@ -284,7 +284,7 @@ class Productcustomerprice extends CommonObject $this->import_key = $obj->import_key; } $this->db->free($resql); - + return 1; } else { $this->error = "Error " . $this->db->lasterror(); @@ -307,7 +307,7 @@ class Productcustomerprice extends CommonObject global $langs; $sql = "SELECT"; $sql .= " t.rowid,"; - + $sql .= " t.entity,"; $sql .= " t.datec,"; $sql .= " t.tms,"; @@ -332,7 +332,7 @@ class Productcustomerprice extends CommonObject $sql .= " WHERE soc.rowid=t.fk_soc "; $sql .= " AND prod.rowid=t.fk_product "; $sql .= " AND prod.entity IN (" . getEntity('product', 1) . ")"; - + // Manage filter if (count($filter) > 0) { foreach ( $filter as $key => $value ) { @@ -346,27 +346,27 @@ class Productcustomerprice extends CommonObject } } } - + if (! empty($sortfield)) { $sql .= " ORDER BY " . $sortfield . ' ' . $sortorder; } if (! empty($limit)) { $sql .= ' ' . $this->db->plimit($limit + 1, $offset); } - + dol_syslog(get_class($this) . "::fetch_all", LOG_DEBUG); $resql = $this->db->query($sql); if ($resql) { - + $this->lines = array (); $num = $this->db->num_rows($resql); - + while ( $obj = $this->db->fetch_object($resql) ) { - + $line = new PriceByCustomerLine(); - + $line->id = $obj->rowid; - + $line->entity = $obj->entity; $line->datec = $this->db->jdate($obj->datec); $line->tms = $this->db->jdate($obj->tms); @@ -385,11 +385,11 @@ class Productcustomerprice extends CommonObject $line->import_key = $obj->import_key; $line->socname = $obj->socname; $line->prodref = $obj->prodref; - + $this->lines [] = $line; } $this->db->free($resql); - + return $num; } else { $this->error = "Error " . $this->db->lasterror(); @@ -412,7 +412,7 @@ class Productcustomerprice extends CommonObject global $langs; $sql = "SELECT"; $sql .= " t.rowid,"; - + $sql .= " t.entity,"; $sql .= " t.datec,"; $sql .= " t.fk_product,"; @@ -436,7 +436,7 @@ class Productcustomerprice extends CommonObject $sql .= " WHERE soc.rowid=t.fk_soc "; $sql .= " AND prod.rowid=t.fk_product "; $sql .= " AND prod.entity IN (" . getEntity('product', 1) . ")"; - + // Manage filter if (count($filter) > 0) { foreach ( $filter as $key => $value ) { @@ -450,27 +450,27 @@ class Productcustomerprice extends CommonObject } } } - + if (! empty($sortfield)) { $sql .= " ORDER BY " . $sortfield . ' ' . $sortorder; } if (! empty($limit)) { $sql .= ' ' . $this->db->plimit($limit + 1, $offset); } - + dol_syslog(get_class($this) . "::fetch_all_log", LOG_DEBUG); $resql = $this->db->query($sql); if ($resql) { - + $this->lines = array (); $num = $this->db->num_rows($resql); - + while ( $obj = $this->db->fetch_object($resql) ) { - + $line = new PriceByCustomerLine(); - + $line->id = $obj->rowid; - + $line->entity = $obj->entity; $line->datec = $this->db->jdate($obj->datec); $line->tms = $this->db->jdate($obj->tms); @@ -489,11 +489,11 @@ class Productcustomerprice extends CommonObject $line->import_key = $obj->import_key; $line->socname = $obj->socname; $line->prodref = $obj->prodref; - + $this->lines [] = $line; } $this->db->free($resql); - + return $num; } else { $this->error = "Error " . $this->db->lasterror(); @@ -513,9 +513,9 @@ class Productcustomerprice extends CommonObject global $conf, $langs; $error = 0; - + // Clean parameters - + if (isset($this->entity)) $this->entity = trim($this->entity); if (isset($this->fk_product)) @@ -544,16 +544,16 @@ class Productcustomerprice extends CommonObject $this->fk_user = trim($this->fk_user); if (isset($this->import_key)) $this->import_key = trim($this->import_key); - + // Check parameters // Put here code to add a control on parameters values - + if ($this->price != '' || $this->price == 0) { if ($this->price_base_type == 'TTC') { $this->price_ttc = price2num($this->price, 'MU'); $this->price = price2num($this->price) / (1 + ($this->tva_tx / 100)); $this->price = price2num($this->price, 'MU'); - + if ($this->price_min != '' || $this->price_min == 0) { $this->price_min_ttc = price2num($this->price_min, 'MU'); $this->price_min = price2num($this->price_min) / (1 + ($this->tva_tx / 100)); @@ -566,7 +566,7 @@ class Productcustomerprice extends CommonObject $this->price = price2num($this->price, 'MU'); $this->price_ttc = ($this->recuperableonly != 1) ? price2num($this->price) * (1 + ($this->tva_tx / 100)) : $this->price; $this->price_ttc = price2num($this->price_ttc, 'MU'); - + if ($this->price_min != '' || $this->price_min == 0) { $this->price_min = price2num($this->price_min, 'MU'); $this->price_min_ttc = price2num($this->price_min) * (1 + ($this->tva_tx / 100)); @@ -578,11 +578,11 @@ class Productcustomerprice extends CommonObject } } } - + // Do a copy of current record into log table // Insert request $sql = "INSERT INTO " . MAIN_DB_PREFIX . "product_customer_price_log("; - + $sql .= "entity,"; $sql .= "datec,"; $sql .= "fk_product,"; @@ -598,10 +598,10 @@ class Productcustomerprice extends CommonObject $sql .= "localtax2_tx,"; $sql .= "fk_user,"; $sql .= "import_key"; - + $sql .= ") "; $sql .= "SELECT"; - + $sql .= " t.entity,"; $sql .= " t.datec,"; $sql .= " t.fk_product,"; @@ -617,10 +617,10 @@ class Productcustomerprice extends CommonObject $sql .= " t.localtax2_tx,"; $sql .= " t.fk_user,"; $sql .= " t.import_key"; - + $sql .= " FROM " . MAIN_DB_PREFIX . "product_customer_price as t"; $sql .= " WHERE t.rowid = " . $this->id; - + $this->db->begin(); dol_syslog(get_class($this) . "::update", LOG_DEBUG); $resql = $this->db->query($sql); @@ -628,10 +628,10 @@ class Productcustomerprice extends CommonObject $error ++; $this->errors [] = "Error " . $this->db->lasterror(); } - + // Update request $sql = "UPDATE " . MAIN_DB_PREFIX . "product_customer_price SET"; - + $sql .= " entity=" . $conf->entity . ","; $sql .= " datec='" . $this->db->idate(dol_now()) . "',"; $sql .= " tms=" . (dol_strlen($this->tms) != 0 ? "'" . $this->db->idate($this->tms) . "'" : 'null') . ","; @@ -648,21 +648,21 @@ class Productcustomerprice extends CommonObject $sql .= " localtax2_tx=" . (isset($this->localtax2_tx) ? $this->localtax2_tx : "null") . ","; $sql .= " fk_user=" . $user->id . ","; $sql .= " import_key=" . (isset($this->import_key) ? "'" . $this->db->escape($this->import_key) . "'" : "null") . ""; - + $sql .= " WHERE rowid=" . $this->id; - + dol_syslog(get_class($this) . "::update", LOG_DEBUG); $resql = $this->db->query($sql); if (! $resql) { $error ++; $this->errors [] = "Error " . $this->db->lasterror(); } - + if (! $error) { if (! $notrigger) { // Uncomment this and change MYOBJECT to your own tag if you // want this action calls a trigger. - + // // Call triggers // include_once DOL_DOCUMENT_ROOT . '/core/class/interfaces.class.php'; // $interface=new Interfaces($this->db); @@ -671,14 +671,14 @@ class Productcustomerprice extends CommonObject // // End call triggers } } - + if (! $error) { $result = $this->setPriceOnAffiliateThirdparty($user, $forceupdateaffiliate); if ($result < 0) { $error ++; } } - + // Commit or rollback if ($error) { foreach ( $this->errors as $errmsg ) { @@ -703,50 +703,50 @@ class Productcustomerprice extends CommonObject function setPriceOnAffiliateThirdparty($user, $forceupdateaffiliate) { $error = 0; - + // Find all susidiaries $sql = "SELECT s.rowid"; $sql .= " FROM " . MAIN_DB_PREFIX . "societe as s"; $sql .= " WHERE s.parent = " . $this->fk_soc; $sql .= " AND s.entity IN (" . getEntity('societe', 1) . ")"; - + dol_syslog(get_class($this) . "::setPriceOnAffiliateThirdparty", LOG_DEBUG); $resql = $this->db->query($sql); - + if ($resql) { - + $this->lines = array (); $num = $this->db->num_rows($resql); - + while ( ($obj = $this->db->fetch_object($resql)) && (empty($error)) ) { - + // find if there is an existing line for the product and the subsidiaries $prodsocprice = new Productcustomerprice($this->db); - + $filter = array ( - 't.fk_product' => $this->fk_product,'t.fk_soc' => $obj->rowid + 't.fk_product' => $this->fk_product,'t.fk_soc' => $obj->rowid ); - + $result = $prodsocprice->fetch_all('', '', 0, 0, $filter); if ($result < 0) { $error ++; $this->error = $prodsocprice->error; } else { - + // There is one line if (count($prodsocprice->lines) > 0) { // If force update => Update if (! empty($forceupdateaffiliate)) { - + $prodsocpriceupd = new Productcustomerprice($this->db); $prodsocpriceupd->fetch($prodsocprice->lines [0]->id); - + $prodsocpriceupd->price = $this->price; $prodsocpriceupd->price_min = $this->price_min; $prodsocpriceupd->price_base_type = $this->price_base_type; $prodsocpriceupd->tva_tx = $this->tva_tx; $prodsocpriceupd->recuperableonly = $this->recuperableonly; - + $resultupd = $prodsocpriceupd->update($user, 0, $forceupdateaffiliate); if ($result < 0) { $error ++; @@ -763,7 +763,7 @@ class Productcustomerprice extends CommonObject $prodsocpricenew->price_base_type = $this->price_base_type; $prodsocpricenew->tva_tx = $this->tva_tx; $prodsocpricenew->recuperableonly = $this->recuperableonly; - + $resultupd = $prodsocpricenew->create($user, 0, $forceupdateaffiliate); if ($result < 0) { $error ++; @@ -773,7 +773,7 @@ class Productcustomerprice extends CommonObject } } $this->db->free($resql); - + if (empty($error)) { return 1; } else { @@ -796,14 +796,14 @@ class Productcustomerprice extends CommonObject global $conf, $langs; $error = 0; - + $this->db->begin(); - + if (! $error) { if (! $notrigger) { // Uncomment this and change MYOBJECT to your own tag if you // want this action calls a trigger. - + // // Call triggers // include_once DOL_DOCUMENT_ROOT . '/core/class/interfaces.class.php'; // $interface=new Interfaces($this->db); @@ -812,11 +812,11 @@ class Productcustomerprice extends CommonObject // // End call triggers } } - + if (! $error) { $sql = "DELETE FROM " . MAIN_DB_PREFIX . "product_customer_price"; $sql .= " WHERE rowid=" . $this->id; - + dol_syslog(get_class($this) . "::delete", LOG_DEBUG); $resql = $this->db->query($sql); if (! $resql) { @@ -824,7 +824,7 @@ class Productcustomerprice extends CommonObject $this->errors [] = "Error " . $this->db->lasterror(); } } - + // Commit or rollback if ($error) { foreach ( $this->errors as $errmsg ) { @@ -848,33 +848,37 @@ class Productcustomerprice extends CommonObject function createFromClone($fromid) { global $user, $langs; - + $error = 0; - + $object = new Productcustomerprice($this->db); - + + $object->context['createfromclone']='createfromclone'; + $this->db->begin(); - + // Load source object $object->fetch($fromid); $object->id = 0; $object->statut = 0; - + // Clear fields // ... - + // Create clone $result = $object->create($user); - + // Other options if ($result < 0) { $this->error = $object->error; $error ++; } - + if (! $error) { } - + + unset($object->context['createfromclone']); + // End if (! $error) { $this->db->commit(); @@ -894,7 +898,7 @@ class Productcustomerprice extends CommonObject function initAsSpecimen() { $this->id = 0; - + $this->entity = ''; $this->datec = ''; $this->tms = ''; diff --git a/htdocs/projet/class/project.class.php b/htdocs/projet/class/project.class.php index fbb35990954..a52a9f133e9 100644 --- a/htdocs/projet/class/project.class.php +++ b/htdocs/projet/class/project.class.php @@ -1017,6 +1017,8 @@ class Project extends CommonObject $clone_project=new Project($this->db); + $clone_project->context['createfromclone']='createfromclone'; + $this->db->begin(); // Load source object @@ -1068,8 +1070,6 @@ class Project extends CommonObject if (! $error) { - $this->db->commit(); - //Get the new project id $clone_project_id=$clone_project->id; @@ -1223,23 +1223,19 @@ class Project extends CommonObject } } } + } + unset($clone_project->context['createfromclone']); - - if (! $error) - { - return $clone_project_id; - } - else - { - dol_syslog(get_class($this)."::createFromClone nbError: ".$error." error : " . $this->error, LOG_ERR); - return -1; - } - + if (! $error) + { + $this->db->commit(); + return $clone_project_id; } else { $this->db->rollback(); + dol_syslog(get_class($this)."::createFromClone nbError: ".$error." error : " . $this->error, LOG_ERR); return -1; } } diff --git a/htdocs/projet/class/task.class.php b/htdocs/projet/class/task.class.php index 0f9645fe237..017e2b782ec 100644 --- a/htdocs/projet/class/task.class.php +++ b/htdocs/projet/class/task.class.php @@ -1092,6 +1092,8 @@ class Task extends CommonObject $clone_task=new Task($this->db); $origin_task=new Task($this->db); + $clone_task->context['createfromclone']='createfromclone'; + $this->db->begin(); // Load source object @@ -1158,8 +1160,6 @@ class Task extends CommonObject // End if (! $error) { - $this->db->commit(); - $clone_task_id=$clone_task->id; $clone_task_ref = $clone_task->ref; @@ -1279,20 +1279,19 @@ class Task extends CommonObject { //TODO clone time of affectation } + } - if (! $error) - { - return $clone_task_id; - } - else - { - dol_syslog(get_class($this)."::createFromClone nbError: ".$error." error : " . $this->error, LOG_ERR); - return -1; - } + unset($clone_task->context['createfromclone']); + + if (! $error) + { + $this->db->commit(); + return $clone_task_id; } else { $this->db->rollback(); + dol_syslog(get_class($this)."::createFromClone nbError: ".$error." error : " . $this->error, LOG_ERR); return -1; } } From fe7889e2662b7b2e14156ef853933e80f8f9e4b1 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 26 Feb 2015 13:19:19 +0100 Subject: [PATCH 172/287] Fix trigger to insert lines where called when inserting line but also when cloning parent object, making no way to know when to use them or not. I introduced a context to allow code to know that and do not triggers twice. --- htdocs/comm/propal/class/propal.class.php | 41 +++++++++++-------- htdocs/commande/class/commande.class.php | 6 +++ htdocs/compta/facture/class/facture.class.php | 9 +++- 3 files changed, 37 insertions(+), 19 deletions(-) diff --git a/htdocs/comm/propal/class/propal.class.php b/htdocs/comm/propal/class/propal.class.php index 26c2c0a0d64..b18ff15331f 100644 --- a/htdocs/comm/propal/class/propal.class.php +++ b/htdocs/comm/propal/class/propal.class.php @@ -239,27 +239,30 @@ class Propal extends CommonObject return -5; } - $propalligne=new PropaleLigne($this->db); - $propalligne->fk_propal=$this->id; - $propalligne->fk_remise_except=$remise->id; - $propalligne->desc=$remise->description; // Description ligne - $propalligne->tva_tx=$remise->tva_tx; - $propalligne->subprice=-$remise->amount_ht; - $propalligne->fk_product=0; // Id produit predefini - $propalligne->qty=1; - $propalligne->remise=0; - $propalligne->remise_percent=0; - $propalligne->rang=-1; - $propalligne->info_bits=2; + $line=new PropaleLigne($this->db); + + $this->line->context = $this->context; + + $line->fk_propal=$this->id; + $line->fk_remise_except=$remise->id; + $line->desc=$remise->description; // Description ligne + $line->tva_tx=$remise->tva_tx; + $line->subprice=-$remise->amount_ht; + $line->fk_product=0; // Id produit predefini + $line->qty=1; + $line->remise=0; + $line->remise_percent=0; + $line->rang=-1; + $line->info_bits=2; // TODO deprecated - $propalligne->price=-$remise->amount_ht; + $line->price=-$remise->amount_ht; - $propalligne->total_ht = -$remise->amount_ht; - $propalligne->total_tva = -$remise->amount_tva; - $propalligne->total_ttc = -$remise->amount_ttc; + $line->total_ht = -$remise->amount_ht; + $line->total_tva = -$remise->amount_tva; + $line->total_ttc = -$remise->amount_ttc; - $result=$propalligne->insert(); + $result=$line->insert(); if ($result > 0) { $result=$this->update_price(1); @@ -276,7 +279,7 @@ class Propal extends CommonObject } else { - $this->error=$propalligne->error; + $this->error=$line->error; $this->db->rollback(); return -2; } @@ -547,6 +550,8 @@ class Propal extends CommonObject // Update line $this->line=new PropaleLigne($this->db); + $this->line->context = $this->context; + // Stock previous line records $staticline=new PropaleLigne($this->db); $staticline->fetch($rowid); diff --git a/htdocs/commande/class/commande.class.php b/htdocs/commande/class/commande.class.php index 2e98f6f21de..1cdd57b1b6a 100644 --- a/htdocs/commande/class/commande.class.php +++ b/htdocs/commande/class/commande.class.php @@ -1205,6 +1205,8 @@ class Commande extends CommonOrder // Insert line $this->line=new OrderLine($this->db); + $this->line->context = $this->context; + $this->line->fk_commande=$this->id; $this->line->label=$label; $this->line->desc=$desc; @@ -1319,6 +1321,8 @@ class Commande extends CommonOrder $line=new OrderLine($this->db); + $line->context = $this->context; + $line->fk_product=$idproduct; $line->desc=$prod->description; $line->qty=$qty; @@ -2401,6 +2405,8 @@ class Commande extends CommonOrder // Update line $this->line=new OrderLine($this->db); + $this->line->context = $this->context; + // Stock previous line records $staticline=new OrderLine($this->db); $staticline->fetch($rowid); diff --git a/htdocs/compta/facture/class/facture.class.php b/htdocs/compta/facture/class/facture.class.php index 08f17832c42..ec41b0a99c2 100644 --- a/htdocs/compta/facture/class/facture.class.php +++ b/htdocs/compta/facture/class/facture.class.php @@ -2047,6 +2047,9 @@ class Facture extends CommonInvoice // Insert line $this->line=new FactureLigne($this->db); + + $this->line->context = $this->context; + $this->line->fk_facture=$this->id; $this->line->label=$label; // deprecated $this->line->desc=$desc; @@ -2185,7 +2188,9 @@ class Facture extends CommonInvoice // Update line into database $this->line=new FactureLigne($this->db); - // Stock previous line records + $this->line->context = $this->context; + + // Stock previous line records $staticline=new FactureLigne($this->db); $staticline->fetch($rowid); $this->line->oldline = $staticline; @@ -2298,6 +2303,8 @@ class Facture extends CommonInvoice $line=new FactureLigne($this->db); + $line->context = $this->context; + // For triggers $line->fetch($rowid); From 22318bb800c136a67e695906fd9666e19266cd61 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 26 Feb 2015 14:05:23 +0100 Subject: [PATCH 173/287] Fix missing tables --- htdocs/install/mysql/migration/3.7.0-3.8.0.sql | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/htdocs/install/mysql/migration/3.7.0-3.8.0.sql b/htdocs/install/mysql/migration/3.7.0-3.8.0.sql index 289d9dae36b..c09c434d27e 100755 --- a/htdocs/install/mysql/migration/3.7.0-3.8.0.sql +++ b/htdocs/install/mysql/migration/3.7.0-3.8.0.sql @@ -197,3 +197,15 @@ CREATE TABLE llx_expensereport_det ALTER TABLE llx_projet ADD COLUMN budget_amount double(24,8); + +create table llx_commande_fournisseurdet_extrafields +( + rowid integer AUTO_INCREMENT PRIMARY KEY, + tms timestamp, + fk_object integer NOT NULL, + import_key varchar(14) +) ENGINE=innodb; + +ALTER TABLE llx_commande_fournisseurdet_extrafields ADD INDEX idx_commande_fournisseurdet_extrafields (fk_object); + + From 4bde7e9f51a18926713a1c04cb6bd5af70ace820 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 26 Feb 2015 14:25:30 +0100 Subject: [PATCH 174/287] Fix: Missing error management --- htdocs/adherents/card.php | 2 ++ htdocs/adherents/type.php | 2 ++ htdocs/categories/card.php | 1 + htdocs/categories/edit.php | 3 ++- htdocs/comm/action/card.php | 2 ++ htdocs/comm/propal.php | 6 ++--- htdocs/commande/card.php | 12 +++++----- htdocs/compta/facture.php | 7 +++--- htdocs/contact/card.php | 2 ++ htdocs/contrat/card.php | 24 +++++++++++--------- htdocs/core/class/extrafields.class.php | 2 +- htdocs/fourn/commande/card.php | 23 ++++++++++++------- htdocs/fourn/facture/card.php | 5 ++--- htdocs/product/card.php | 9 ++++++-- htdocs/projet/card.php | 6 ++--- htdocs/projet/tasks/task.php | 11 +++++---- htdocs/public/members/new.php | 1 + htdocs/societe/soc.php | 2 +- htdocs/user/card.php | 30 ++++++++++++++----------- htdocs/user/group/card.php | 2 ++ 20 files changed, 90 insertions(+), 62 deletions(-) diff --git a/htdocs/adherents/card.php b/htdocs/adherents/card.php index d8a1a85debf..94f12a61f8b 100644 --- a/htdocs/adherents/card.php +++ b/htdocs/adherents/card.php @@ -302,6 +302,7 @@ if (empty($reshook)) // Fill array 'array_options' with data from add form $ret = $extrafields->setOptionalsFromPost($extralabels,$object); + if ($ret < 0) $error++; // Check if we need to also synchronize user information $nosyncuser=0; @@ -471,6 +472,7 @@ if (empty($reshook)) // Fill array 'array_options' with data from add form $ret = $extrafields->setOptionalsFromPost($extralabels,$object); + if ($ret < 0) $error++; // Check parameters if (empty($morphy) || $morphy == "-1") { diff --git a/htdocs/adherents/type.php b/htdocs/adherents/type.php index 96e13561825..ea39a200c97 100644 --- a/htdocs/adherents/type.php +++ b/htdocs/adherents/type.php @@ -89,6 +89,7 @@ if ($action == 'add' && $user->rights->adherent->configurer) // Fill array 'array_options' with data from add form $ret = $extrafields->setOptionalsFromPost($extralabels,$adht); + if ($ret < 0) $error++; if ($adht->libelle) { @@ -126,6 +127,7 @@ if ($action == 'update' && $user->rights->adherent->configurer) // Fill array 'array_options' with data from add form $ret = $extrafields->setOptionalsFromPost($extralabels,$adht); + if ($ret < 0) $error++; $adht->update($user); diff --git a/htdocs/categories/card.php b/htdocs/categories/card.php index 672c92b9508..8a587d7de32 100644 --- a/htdocs/categories/card.php +++ b/htdocs/categories/card.php @@ -127,6 +127,7 @@ if ($action == 'add' && $user->rights->categorie->creer) if ($parent != "-1") $object->fk_parent = $parent; $ret = $extrafields->setOptionalsFromPost($extralabels,$object); + if ($ret < 0) $error++; if (! $object->label) { diff --git a/htdocs/categories/edit.php b/htdocs/categories/edit.php index aa82fdb455d..a105d104036 100644 --- a/htdocs/categories/edit.php +++ b/htdocs/categories/edit.php @@ -90,7 +90,8 @@ if ($action == 'update' && $user->rights->categorie->creer) if (empty($categorie->error)) { $ret = $extrafields->setOptionalsFromPost($extralabels,$categorie); - + if ($ret < 0) $error++; + if ($categorie->update($user) > 0) { header('Location: '.DOL_URL_ROOT.'/categories/viewcat.php?id='.$categorie->id.'&type='.$type); diff --git a/htdocs/comm/action/card.php b/htdocs/comm/action/card.php index 0a4b255884a..c15b1fe4f32 100644 --- a/htdocs/comm/action/card.php +++ b/htdocs/comm/action/card.php @@ -274,6 +274,7 @@ if ($action == 'add') // Fill array 'array_options' with data from add form $ret = $extrafields->setOptionalsFromPost($extralabels,$object); + if ($ret < 0) $error++; if (! $error) { @@ -429,6 +430,7 @@ if ($action == 'update') // Fill array 'array_options' with data from add form $ret = $extrafields->setOptionalsFromPost($extralabels,$object); + if ($ret < 0) $error++; if (! $error) { diff --git a/htdocs/comm/propal.php b/htdocs/comm/propal.php index 030aff46434..3739b59c338 100644 --- a/htdocs/comm/propal.php +++ b/htdocs/comm/propal.php @@ -1080,10 +1080,10 @@ if (empty($reshook)) // Fill array 'array_options' with data from update form $extralabels = $extrafields->fetch_name_optionals_label($object->table_element); $ret = $extrafields->setOptionalsFromPost($extralabels, $object, GETPOST('attribute')); - if ($ret < 0) - $error ++; + if ($ret < 0) $error++; - if (! $error) { + if (! $error) + { // Actions on extra fields (by external module or standard code) // FIXME le hook fait double emploi avec le trigger !! $hookmanager->initHooks(array('propaldao')); diff --git a/htdocs/commande/card.php b/htdocs/commande/card.php index 5b76dd59323..eb5767b173a 100644 --- a/htdocs/commande/card.php +++ b/htdocs/commande/card.php @@ -271,8 +271,7 @@ if (empty($reshook)) // Fill array 'array_options' with data from add form $ret = $extrafields->setOptionalsFromPost($extralabels, $object); - if ($ret < 0) - $error ++; + if ($ret < 0) $error++; if (! $error) { @@ -365,10 +364,10 @@ if (empty($reshook)) } else { // Fill array 'array_options' with data from add form $ret = $extrafields->setOptionalsFromPost($extralabels, $object); - if ($ret < 0) - $error ++; + if ($ret < 0) $error++; - if (! $error) { + if (! $error) + { $object_id = $object->create($user); // If some invoice's lines already known @@ -1124,8 +1123,7 @@ if (empty($reshook)) // Fill array 'array_options' with data from update form $extralabels = $extrafields->fetch_name_optionals_label($object->table_element); $ret = $extrafields->setOptionalsFromPost($extralabels, $object, GETPOST('attribute')); - if ($ret < 0) - $error ++; + if ($ret < 0) $error++; if (! $error) { // Actions on extra fields (by external module or standard code) diff --git a/htdocs/compta/facture.php b/htdocs/compta/facture.php index 5f1f3998b5d..3d7a71f8133 100644 --- a/htdocs/compta/facture.php +++ b/htdocs/compta/facture.php @@ -585,7 +585,7 @@ if (empty($reshook)) $discount->fk_facture_source = $object->id; $error = 0; - + foreach ($amount_ht as $tva_tx => $xxx) { $discount->amount_ht = abs($amount_ht [$tva_tx]); $discount->amount_tva = abs($amount_tva [$tva_tx]); @@ -636,7 +636,7 @@ if (empty($reshook)) // Fill array 'array_options' with data from add form $extralabels = $extrafields->fetch_name_optionals_label($object->table_element); $ret = $extrafields->setOptionalsFromPost($extralabels, $object); - if ($ret < 0) $error ++; + if ($ret < 0) $error++; // Replacement invoice if ($_POST['type'] == Facture::TYPE_REPLACEMENT) @@ -1676,8 +1676,7 @@ if (empty($reshook)) // Fill array 'array_options' with data from add form $extralabels = $extrafields->fetch_name_optionals_label($object->table_element); $ret = $extrafields->setOptionalsFromPost($extralabels, $object, GETPOST('attribute')); - if ($ret < 0) - $error ++; + if ($ret < 0) $error++; if (! $error) { // Actions on extra fields (by external module or standard code) diff --git a/htdocs/contact/card.php b/htdocs/contact/card.php index af07cbb9a62..248352dfee3 100644 --- a/htdocs/contact/card.php +++ b/htdocs/contact/card.php @@ -200,6 +200,7 @@ if (empty($reshook)) // Fill array 'array_options' with data from add form $ret = $extrafields->setOptionalsFromPost($extralabels,$object); + if ($ret < 0) $error++; if (! GETPOST("lastname")) { @@ -303,6 +304,7 @@ if (empty($reshook)) // Fill array 'array_options' with data from add form $ret = $extrafields->setOptionalsFromPost($extralabels,$object); + if ($ret < 0) $error++; $result = $object->update($contactid, $user); diff --git a/htdocs/contrat/card.php b/htdocs/contrat/card.php index fdd0acfec74..6d10442caf7 100644 --- a/htdocs/contrat/card.php +++ b/htdocs/contrat/card.php @@ -355,6 +355,7 @@ if ($action == 'add' && $user->rights->contrat->creer) // Fill array 'array_options' with data from add form $ret = $extrafields->setOptionalsFromPost($extralabels, $object); + if ($ret < 0) $error++; $result = $object->create($user); if ($result > 0) @@ -702,19 +703,20 @@ else if ($action == 'confirm_move' && $confirm == 'yes' && $user->rights->contra // Fill array 'array_options' with data from update form $extralabels = $extrafields->fetch_name_optionals_label($object->table_element); $ret = $extrafields->setOptionalsFromPost($extralabels, $object, GETPOST('attribute')); - if ($ret < 0) - $error ++; + if ($ret < 0) $error++; - if (! $error) { + if (! $error) + { + $result = $object->insertExtraFields(); + if ($result < 0) + { + $error++; + } + } + else if ($reshook < 0) $error++; - $result = $object->insertExtraFields(); - if ($result < 0) { - $error ++; - } - } else if ($reshook < 0) - $error ++; - - if ($error) { + if ($error) + { $action = 'edit_extras'; setEventMessage($object->error,'errors'); } diff --git a/htdocs/core/class/extrafields.class.php b/htdocs/core/class/extrafields.class.php index 008dff0f019..cc602d08ed5 100644 --- a/htdocs/core/class/extrafields.class.php +++ b/htdocs/core/class/extrafields.class.php @@ -1063,7 +1063,7 @@ class ExtraFields * @param array $extralabels $array of extrafields * @param object $object Object * @param string $onlykey Only following key is filled. When we make update of only one extrafield ($action = 'update_extras'), calling page must must set this to avoid to have other extrafields being reset. - * @return int 1 if array_options set / 0 if no value + * @return int 1 if array_options set, 0 if no value, -1 if error (field required missing for example) */ function setOptionalsFromPost($extralabels,&$object,$onlykey='') { diff --git a/htdocs/fourn/commande/card.php b/htdocs/fourn/commande/card.php index 28b492651c0..0257b51c946 100644 --- a/htdocs/fourn/commande/card.php +++ b/htdocs/fourn/commande/card.php @@ -783,7 +783,7 @@ if ($action == 'update_extras') $ret = $extrafields->setOptionalsFromPost($extralabels,$object,GETPOST('attribute')); if ($ret < 0) $error++; - if (!$error) + if (! $error) { // Actions on extra fields (by external module or standard code) // FIXME le hook fait double emploi avec le trigger !! @@ -842,19 +842,26 @@ if ($action == 'add' && $user->rights->fournisseur->commande->creer) $object->date_livraison = $datelivraison; // Fill array 'array_options' with data from add form - $ret = $extrafields->setOptionalsFromPost($extralabels,$object); + if (! $error) + { + $ret = $extrafields->setOptionalsFromPost($extralabels,$object); + if ($ret < 0) $error++; + } - $id = $object->create($user); - if ($id < 0) - { - $error++; - } + if (! $error) + { + $id = $object->create($user); + if ($id < 0) + { + $error++; + setEventMessage($langs->trans($object->error), 'errors'); + } + } if ($error) { $langs->load("errors"); $db->rollback(); - setEventMessage($langs->trans($object->error), 'errors'); $action='create'; $_GET['socid']=$_POST['socid']; } diff --git a/htdocs/fourn/facture/card.php b/htdocs/fourn/facture/card.php index a10aa89ae65..54ef660f6aa 100644 --- a/htdocs/fourn/facture/card.php +++ b/htdocs/fourn/facture/card.php @@ -308,7 +308,7 @@ elseif ($action == 'add' && $user->rights->fournisseur->facture->creer) $extralabels = $extrafields->fetch_name_optionals_label($object->table_element); $ret = $extrafields->setOptionalsFromPost($extralabels, $object); - if ($ret < 0) $error ++; + if ($ret < 0) $error++; $tmpproject = GETPOST('projectid', 'int'); @@ -1071,8 +1071,7 @@ elseif ($action == 'update_extras') // Fill array 'array_options' with data from add form $extralabels=$extrafields->fetch_name_optionals_label($object->table_element); $ret = $extrafields->setOptionalsFromPost($extralabels,$object,GETPOST('attribute')); - - if($ret < 0) $error++; + if ($ret < 0) $error++; if (!$error) { diff --git a/htdocs/product/card.php b/htdocs/product/card.php index a4c4e4ee92e..b5f34e20a8d 100644 --- a/htdocs/product/card.php +++ b/htdocs/product/card.php @@ -262,8 +262,12 @@ if (empty($reshook)) // Fill array 'array_options' with data from add form $ret = $extrafields->setOptionalsFromPost($extralabels,$object); + if ($ret < 0) $error++; - $id = $object->create($user); + if (! $error) + { + $id = $object->create($user); + } if ($id > 0) { @@ -339,8 +343,9 @@ if (empty($reshook)) // Fill array 'array_options' with data from add form $ret = $extrafields->setOptionalsFromPost($extralabels,$object); + if ($ret < 0) $error++; - if ($object->check()) + if (! $error && $object->check()) { if ($object->update($object->id, $user) > 0) { diff --git a/htdocs/projet/card.php b/htdocs/projet/card.php index b376133699b..1c971ef9e35 100644 --- a/htdocs/projet/card.php +++ b/htdocs/projet/card.php @@ -147,6 +147,7 @@ if (empty($reshook)) // Fill array 'array_options' with data from add form $ret = $extrafields->setOptionalsFromPost($extralabels,$object); + if ($ret < 0) $error++; $result = $object->create($user); if ($result > 0) @@ -222,10 +223,7 @@ if (empty($reshook)) // Fill array 'array_options' with data from add form $ret = $extrafields->setOptionalsFromPost($extralabels,$object); - if ($ret < 0) - { - $error++; - } + if ($ret < 0) $error++; } if (! $error) diff --git a/htdocs/projet/tasks/task.php b/htdocs/projet/tasks/task.php index 11bc8ffea09..a9cd64e33b5 100644 --- a/htdocs/projet/tasks/task.php +++ b/htdocs/projet/tasks/task.php @@ -91,12 +91,15 @@ if ($action == 'update' && ! $_POST["cancel"] && $user->rights->projet->creer) // Fill array 'array_options' with data from add form $ret = $extrafields->setOptionalsFromPost($extralabels,$object); + if ($ret < 0) $error++; - $result=$object->update($user); - - if ($result < 0) + if (! $error) { - setEventMessages($object->error,$object->errors,'errors'); + $result=$object->update($user); + if ($result < 0) + { + setEventMessages($object->error,$object->errors,'errors'); + } } } else diff --git a/htdocs/public/members/new.php b/htdocs/public/members/new.php index c8628bd26a0..255e7fe9134 100644 --- a/htdocs/public/members/new.php +++ b/htdocs/public/members/new.php @@ -250,6 +250,7 @@ if ($action == 'add') // Fill array 'array_options' with data from add form $extralabels=$extrafields->fetch_name_optionals_label($adh->table_element); $ret = $extrafields->setOptionalsFromPost($extralabels,$adh); + if ($ret < 0) $error++; $result=$adh->create($user); if ($result > 0) diff --git a/htdocs/societe/soc.php b/htdocs/societe/soc.php index 72e249ce542..065bbbc0ac8 100644 --- a/htdocs/societe/soc.php +++ b/htdocs/societe/soc.php @@ -195,7 +195,7 @@ if (empty($reshook)) // Fill array 'array_options' with data from add form $ret = $extrafields->setOptionalsFromPost($extralabels,$object); - + if ($ret < 0) $error++; if (GETPOST('deletephoto')) $object->logo = ''; else if (! empty($_FILES['photo']['name'])) $object->logo = dol_sanitizeFileName($_FILES['photo']['name']); diff --git a/htdocs/user/card.php b/htdocs/user/card.php index ec6b65e534c..7c5caf5254a 100644 --- a/htdocs/user/card.php +++ b/htdocs/user/card.php @@ -211,6 +211,7 @@ if ($action == 'add' && $canadduser) // Fill array 'array_options' with data from add form $ret = $extrafields->setOptionalsFromPost($extralabels,$object); + if ($ret < 0) $error++; // If multicompany is off, admin users must all be on entity 0. $entity=GETPOST('entity','int'); @@ -358,6 +359,7 @@ if ($action == 'update' && ! $_POST["cancel"]) // Fill array 'array_options' with data from add form $ret = $extrafields->setOptionalsFromPost($extralabels,$object); + if ($ret < 0) $error++; if (! empty($conf->multicompany->enabled)) { @@ -382,20 +384,22 @@ if ($action == 'update' && ! $_POST["cancel"]) if (GETPOST('deletephoto')) $object->photo=''; if (! empty($_FILES['photo']['name'])) $object->photo = dol_sanitizeFileName($_FILES['photo']['name']); - $ret=$object->update($user); - - if ($ret < 0) + if (! $error) { - $error++; - if ($db->errno() == 'DB_ERROR_RECORD_ALREADY_EXISTS') - { - $langs->load("errors"); - setEventMessage($langs->trans("ErrorLoginAlreadyExists",$object->login), 'errors'); - } - else - { - setEventMessage($object->error, 'errors'); - } + $ret=$object->update($user); + if ($ret < 0) + { + $error++; + if ($db->errno() == 'DB_ERROR_RECORD_ALREADY_EXISTS') + { + $langs->load("errors"); + setEventMessage($langs->trans("ErrorLoginAlreadyExists",$object->login), 'errors'); + } + else + { + setEventMessage($object->error, 'errors'); + } + } } if (! $error && isset($_POST['contactid'])) diff --git a/htdocs/user/group/card.php b/htdocs/user/group/card.php index a1930f7c027..56cfc5d9ee8 100644 --- a/htdocs/user/group/card.php +++ b/htdocs/user/group/card.php @@ -101,6 +101,7 @@ if ($action == 'add') // Fill array 'array_options' with data from add form $ret = $extrafields->setOptionalsFromPost($extralabels,$object); + if ($ret < 0) $error++; if (! empty($conf->multicompany->enabled) && ! empty($conf->multicompany->transverse_mode)) $object->entity = 0; else $object->entity = $_POST["entity"]; @@ -183,6 +184,7 @@ if ($action == 'update') // Fill array 'array_options' with data from add form $ret = $extrafields->setOptionalsFromPost($extralabels,$object); + if ($ret < 0) $error++; if (! empty($conf->multicompany->enabled) && ! empty($conf->multicompany->transverse_mode)) $object->entity = 0; else $object->entity = $_POST["entity"]; From d6438a51ab5d580ff1f460d44967c8bce2f8b732 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 26 Feb 2015 15:24:15 +0100 Subject: [PATCH 175/287] Add log to help track bug --- htdocs/fourn/class/fournisseur.product.class.php | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/htdocs/fourn/class/fournisseur.product.class.php b/htdocs/fourn/class/fournisseur.product.class.php index 75ac674e877..3d12352903f 100644 --- a/htdocs/fourn/class/fournisseur.product.class.php +++ b/htdocs/fourn/class/fournisseur.product.class.php @@ -447,12 +447,18 @@ class ProductFournisseur extends Product * * @param int $prodid Product id * @param int $qty Minimum quantity - * @return int <0 if KO, >0 if OK + * @return int <0 if KO, 0=Not found of no product id provided, >0 if OK */ function find_min_price_product_fournisseur($prodid, $qty=0) { global $conf; + if (empty($prodid)) + { + dol_syslog("Warning function find_min_price_product_fournisseur were called with prodid empty. May be a bug.", LOG_WARNING); + return 0; + } + $this->product_fourn_price_id = ''; $this->product_fourn_id = ''; $this->fourn_ref = ''; @@ -500,7 +506,7 @@ class ProductFournisseur extends Product return 1; } else - { + { $this->error=$this->db->error(); return -1; } From 8f378b448066c418370a0776698b7a1d0ae4e0a6 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 26 Feb 2015 15:52:14 +0100 Subject: [PATCH 176/287] Fix no error returned when contact already exists --- htdocs/fourn/class/fournisseur.commande.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/fourn/class/fournisseur.commande.class.php b/htdocs/fourn/class/fournisseur.commande.class.php index 410e69c3e6a..dc923fa7021 100644 --- a/htdocs/fourn/class/fournisseur.commande.class.php +++ b/htdocs/fourn/class/fournisseur.commande.class.php @@ -662,7 +662,7 @@ class CommandeFournisseur extends CommonOrder if (! empty($conf->global->SUPPLIER_ORDER_AUTOADD_USER_CONTACT)) { $result=$this->add_contact($user->id, 'SALESREPFOLL', 'internal', 1); - if ($result < 0) + if ($result < 0 && $result != -2) // -2 means already exists { $error++; } From a87c867c286a528998e5052ba889b3d85dc64238 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 26 Feb 2015 16:02:03 +0100 Subject: [PATCH 177/287] Translation --- htdocs/core/lib/fourn.lib.php | 10 +++++----- htdocs/langs/en_US/admin.lang | 2 ++ 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/htdocs/core/lib/fourn.lib.php b/htdocs/core/lib/fourn.lib.php index cf1db634e88..3d605d10902 100644 --- a/htdocs/core/lib/fourn.lib.php +++ b/htdocs/core/lib/fourn.lib.php @@ -187,19 +187,19 @@ function supplierorder_admin_prepare_head() $h++; $head[$h][0] = DOL_URL_ROOT.'/admin/supplierorderdet_extrafields.php'; - $head[$h][1] = $langs->trans("ExtraFieldsLines"); + $head[$h][1] = $langs->trans("ExtraFieldsSupplierOrdersLines"); $head[$h][2] = 'supplierorderdet'; $h++; - - + + $head[$h][0] = DOL_URL_ROOT.'/admin/supplierinvoice_extrafields.php'; $head[$h][1] = $langs->trans("ExtraFieldsSupplierInvoices"); $head[$h][2] = 'supplierinvoice'; $h++; - + $head[$h][0] = DOL_URL_ROOT.'/admin/supplierinvoicedet_extrafields.php'; - $head[$h][1] = $langs->trans("ExtraFieldsLines"); + $head[$h][1] = $langs->trans("ExtraFieldsSupplierInvoicesLines"); $head[$h][2] = 'supplierinvoicedet'; $h++; diff --git a/htdocs/langs/en_US/admin.lang b/htdocs/langs/en_US/admin.lang index 5305c1c62ba..017c819d85e 100755 --- a/htdocs/langs/en_US/admin.lang +++ b/htdocs/langs/en_US/admin.lang @@ -1041,6 +1041,8 @@ MAIN_PROXY_PASS=Password to use the proxy server DefineHereComplementaryAttributes=Define here all attributes, not already available by default, and that you want to be supported for %s. ExtraFields=Complementary attributes ExtraFieldsLines=Complementary attributes (lines) +ExtraFieldsSupplierOrdersLines=Complementary attributes (order lines) +ExtraFieldsSupplierInvoicesLines=Complementary attributes (invoice lines) ExtraFieldsThirdParties=Complementary attributes (thirdparty) ExtraFieldsContacts=Complementary attributes (contact/address) ExtraFieldsMember=Complementary attributes (member) From 828716420bba6f385a3f6bc1a232f5ce7d045292 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 26 Feb 2015 16:19:45 +0100 Subject: [PATCH 178/287] Comment of function was not correct --- htdocs/core/class/commonobject.class.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/htdocs/core/class/commonobject.class.php b/htdocs/core/class/commonobject.class.php index 4dc3b55c057..46d280f8763 100644 --- a/htdocs/core/class/commonobject.class.php +++ b/htdocs/core/class/commonobject.class.php @@ -3457,7 +3457,8 @@ abstract class CommonObject /** * Add/Update all extra fields values for the current object. - * All data to describe values to insert are stored into $this->array_options=array('keyextrafield'=>'valueextrafieldtoadd') + * Data to describe values to insert/update are stored into $this->array_options=array('options_codeforfield1'=>'valueforfield1', 'options_codeforfield2'=>'valueforfield2', ...) + * This function delte record with all extrafields and insert them again from the array $this->array_options. * * @return int -1=error, O=did nothing, 1=OK */ From 47c41f6a85b4e43cbf208ebef74a51e42b5a0ff8 Mon Sep 17 00:00:00 2001 From: aspangaro Date: Thu, 26 Feb 2015 20:47:06 +0100 Subject: [PATCH 179/287] Add a test to enable field only when module salary is used --- htdocs/user/card.php | 51 ++++++++++++++++++++++++++------------------ 1 file changed, 30 insertions(+), 21 deletions(-) diff --git a/htdocs/user/card.php b/htdocs/user/card.php index b8e70dcd12f..cf10d93fe4e 100644 --- a/htdocs/user/card.php +++ b/htdocs/user/card.php @@ -982,10 +982,13 @@ if (($action == 'create') || ($action == 'adduserldap')) print "\n"; // Accountancy code - print ''; - print ''; + if ($conf->salaries->enabled) + { + print ''; + print ''; + } // User color if (! empty($conf->agenda->enabled)) @@ -1325,9 +1328,12 @@ else print "\n"; // Accountancy code - print ''; - print ''; - + if ($conf->salaries->enabled) + { + print ''; + print ''; + } + // Color user if (! empty($conf->agenda->enabled)) { @@ -2023,20 +2029,23 @@ else print "\n"; // Accountancy code - print ""; - print ''; - print ''; - print ""; + if ($conf->salaries->enabled) + { + print ""; + print ''; + print ''; + print ""; + } // User color if (! empty($conf->agenda->enabled)) From bfe9bf7a478c4eefe66af7c10d1e5c63c79183c3 Mon Sep 17 00:00:00 2001 From: Juanjo Menent Date: Fri, 27 Feb 2015 17:55:15 +0100 Subject: [PATCH 180/287] Fix: Bad SEPA xml file creation --- ChangeLog | 1 + .../class/bonprelevement.class.php | 41 +++++++++++++------ 2 files changed, 30 insertions(+), 12 deletions(-) diff --git a/ChangeLog b/ChangeLog index c50c42acb21..927ed0e7a24 100644 --- a/ChangeLog +++ b/ChangeLog @@ -27,6 +27,7 @@ English Dolibarr ChangeLog - Fix: [ bug #1830 ] Salaries payment only allows checking accounts - Fix: [ bug #1825 ] External agenda: hide/show checkbox doesn't work - Fix: [ bug #1790 ] Email form behaves in an unexpected way when pressing Enter key +- Fix: Bad SEPA xml file creation ***** ChangeLog for 3.6.2 compared to 3.6.1 ***** - Fix: fix ErrorBadValueForParamNotAString error message in price customer multiprice. diff --git a/htdocs/compta/prelevement/class/bonprelevement.class.php b/htdocs/compta/prelevement/class/bonprelevement.class.php index 7f0b693391e..0a9884bbcd3 100644 --- a/htdocs/compta/prelevement/class/bonprelevement.class.php +++ b/htdocs/compta/prelevement/class/bonprelevement.class.php @@ -1326,12 +1326,26 @@ class BonPrelevement extends CommonObject $dateTime_ECMA = dol_print_date($date_actu, '%Y-%m-%dT%H:%M:%S'); $fileDebiteurSection = ''; $fileEmetteurSection = ''; - $i = 0; + $i = $j = 0; $this->total = 0; /* * section Debiteur (sepa Debiteurs bloc lines) */ + + $sql = "SELECT f.facnumber as fac FROM ".MAIN_DB_PREFIX."prelevement_lignes as pl, ".MAIN_DB_PREFIX."facture as f, ".MAIN_DB_PREFIX."prelevement_facture as pf, ".MAIN_DB_PREFIX."societe as soc, ".MAIN_DB_PREFIX."c_pays as p, ".MAIN_DB_PREFIX."societe_rib as rib WHERE pl.fk_prelevement_bons = ".$this->id." AND pl.rowid = pf.fk_prelevement_lignes AND pf.fk_facture = f.rowid AND soc.fk_pays = p.rowid AND soc.rowid = f.fk_soc AND rib.fk_soc = f.fk_soc AND rib.default_rib = 1"; + $resql=$this->db->query($sql); + if ($resql) + { + $num = $this->db->num_rows($resql); + while ($j < $num) + { + $objfac = $this->db->fetch_object($resql); + $ListOfFactures = $ListOfFactures . $objfac->fac . ","; + $j++; + } + } + $sql = "SELECT soc.code_client as code, soc.address, soc.zip, soc.town, soc.datec, p.code as country_code,"; $sql.= " pl.client_nom as nom, pl.code_banque as cb, pl.code_guichet as cg, pl.number as cc, pl.amount as somme,"; $sql.= " f.facnumber as fac, pf.fk_facture as idfac, rib.iban_prefix as iban, rib.bic as bic, rib.rowid as drum"; @@ -1357,7 +1371,7 @@ class BonPrelevement extends CommonObject while ($i < $num) { $obj = $this->db->fetch_object($resql); - $fileDebiteurSection .= $this->EnregDestinataireSEPA($obj->code, $obj->nom, $obj->address, $obj->zip, $obj->town, $obj->country_code, $obj->cb, $obj->cg, $obj->cc, $obj->somme, $obj->facnumber, $obj->idfac, $obj->iban, $obj->bic, $obj->datec, $obj->drum); + $fileDebiteurSection .= $this->EnregDestinataireSEPA($obj->code, $obj->nom, $obj->address, $obj->zip, $obj->town, $obj->country_code, $obj->cb, $obj->cg, $obj->cc, $obj->somme, $ListOfFactures , $obj->idfac, $obj->iban, $obj->bic, $obj->datec, $obj->drum); $this->total = $this->total + $obj->somme; $i++; } @@ -1394,13 +1408,14 @@ class BonPrelevement extends CommonObject fputs($this->file, ' '.$this->total.''.$CrLf); fputs($this->file, ' '.$CrLf); fputs($this->file, ' '.$this->raison_sociale.''.$CrLf); -/* fputs($this->file, ' '.$CrLf); - fputs($this->file, ' '.$CrLf); - fputs($this->file, ' 0533883248'.$CrLf); - fputs($this->file, ' KBO-BCE'.$CrLf); + fputs($this->file, ' '.$CrLf); + fputs($this->file, ' '.$CrLf); fputs($this->file, ' '.$CrLf); + fputs($this->file, ' '.$conf->global->PRELEVEMENT_ICS.''.$CrLf); + fputs($this->file, ' '.$CrLf); + fputs($this->file, ' '.$CrLf); fputs($this->file, ' '.$CrLf); -*/ fputs($this->file, ' '.$CrLf); + fputs($this->file, ' '.$CrLf); fputs($this->file, ' '.$CrLf); // SEPA File Emetteur if ($result != -2) @@ -1583,6 +1598,7 @@ class BonPrelevement extends CommonObject $CrLf = "\n"; $Rowing = sprintf("%06d", $row_idfac); $Date_Rum = strtotime($row_datec); + $DtOfSgntr = dol_print_date($row_datec, '%Y-%m-%d'); $pre = ($date_Rum > 1359673200) ? 'Rum' : '++R'; $Rum = $pre.$row_code_client.$row_drum.'-0'.date('U', $Date_Rum); $XML_DEBITOR =''; @@ -1590,11 +1606,11 @@ class BonPrelevement extends CommonObject $XML_DEBITOR .=' '.$CrLf; $XML_DEBITOR .=' '.('AS-'.$row_facnumber.'-'.$Rowing).''.$CrLf; $XML_DEBITOR .=' '.$CrLf; - $XML_DEBITOR .=' '.round($row_somme, 2).''.$CrLf; + $XML_DEBITOR .=' '.round($row_somme, 2).''.$CrLf; $XML_DEBITOR .=' '.$CrLf; $XML_DEBITOR .=' '.$CrLf; $XML_DEBITOR .=' '.$Rum.''.$CrLf; - $XML_DEBITOR .=' '.$row_datec.''.$CrLf; + $XML_DEBITOR .=' '.$DtOfSgntr.''.$CrLf; $XML_DEBITOR .=' false'.$CrLf; $XML_DEBITOR .=' '.$CrLf; $XML_DEBITOR .=' '.$CrLf; @@ -1607,17 +1623,18 @@ class BonPrelevement extends CommonObject $XML_DEBITOR .=' '.strtoupper(dol_string_unaccent($row_nom)).''.$CrLf; $XML_DEBITOR .=' '.$CrLf; $XML_DEBITOR .=' '.$row_country_code.''.$CrLf; - $XML_DEBITOR .=' '.strtr($row_adr, array(CHR(13) => ", ", CHR(10) => "")).''.$CrLf; + $XML_DEBITOR .=' '.strtr($row_address, array(CHR(13) => ", ", CHR(10) => "")).''.$CrLf; $XML_DEBITOR .=' '.dol_string_unaccent($row_zip.' '.$row_town).''.$CrLf; $XML_DEBITOR .=' '.$CrLf; $XML_DEBITOR .=' '.$CrLf; $XML_DEBITOR .=' '.$CrLf; $XML_DEBITOR .=' '.$CrLf; - $XML_DEBITOR .=' '.$row_iban.''.$CrLf; + $XML_DEBITOR .=' '.preg_replace('/\s/', '', $row_iban).''.$CrLf; $XML_DEBITOR .=' '.$CrLf; $XML_DEBITOR .=' '.$CrLf; $XML_DEBITOR .=' '.$CrLf; - $XML_DEBITOR .=' '.($row_facnumber.'/'.$Rowing.'/'.$Rum).''.$CrLf; + // $XML_DEBITOR .=' '.($row_facnumber.'/'.$Rowing.'/'.$Rum).''.$CrLf; + $XML_DEBITOR .=' '.$row_facnumber.''.$CrLf; $XML_DEBITOR .=' '.$CrLf; $XML_DEBITOR .=' '.$CrLf; return $XML_DEBITOR; From 7ca8fdb20cd833d11ed1b693cadd36ffe521bca3 Mon Sep 17 00:00:00 2001 From: Juanjo Menent Date: Fri, 27 Feb 2015 17:58:19 +0100 Subject: [PATCH 181/287] PHP norms --- htdocs/compta/prelevement/class/bonprelevement.class.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/htdocs/compta/prelevement/class/bonprelevement.class.php b/htdocs/compta/prelevement/class/bonprelevement.class.php index 0a9884bbcd3..b90b0dc6c25 100644 --- a/htdocs/compta/prelevement/class/bonprelevement.class.php +++ b/htdocs/compta/prelevement/class/bonprelevement.class.php @@ -1326,7 +1326,8 @@ class BonPrelevement extends CommonObject $dateTime_ECMA = dol_print_date($date_actu, '%Y-%m-%dT%H:%M:%S'); $fileDebiteurSection = ''; $fileEmetteurSection = ''; - $i = $j = 0; + $i = 0; + $j = 0; $this->total = 0; /* From 5d1545ad1f5b2663fd894558538116521ec107b0 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 27 Feb 2015 18:05:12 +0100 Subject: [PATCH 182/287] Work on supplier order and customer extrafields Use templates to show/edit supplier order and invoice lines --- htdocs/commande/card.php | 11 ++-- htdocs/core/class/commonobject.class.php | 11 ++-- htdocs/core/db/pgsql.class.php | 2 + htdocs/core/tpl/objectline_create.tpl.php | 9 +++- htdocs/core/tpl/objectline_edit.tpl.php | 3 +- htdocs/core/tpl/objectline_view.tpl.php | 32 +++++++----- .../fourn/class/fournisseur.facture.class.php | 12 +++++ htdocs/fourn/commande/card.php | 37 ++++++++----- htdocs/fourn/facture/card.php | 52 ++++++++++++------- .../install/mysql/migration/3.7.0-3.8.0.sql | 10 ++++ 10 files changed, 123 insertions(+), 56 deletions(-) diff --git a/htdocs/commande/card.php b/htdocs/commande/card.php index bda67f809fa..74e79e0e41b 100644 --- a/htdocs/commande/card.php +++ b/htdocs/commande/card.php @@ -786,9 +786,10 @@ if (empty($reshook)) } /* - * Mise a jour d'une ligne dans la commande - */ - else if ($action == 'updateligne' && $user->rights->commande->creer && GETPOST('save') == $langs->trans('Save')) { + * Update a line + */ + else if ($action == 'updateline' && $user->rights->commande->creer && GETPOST('save') == $langs->trans('Save')) + { // Clean parameters $date_start=''; $date_end=''; @@ -891,7 +892,7 @@ if (empty($reshook)) } } - else if ($action == 'updateligne' && $user->rights->commande->creer && GETPOST('cancel') == $langs->trans('Cancel')) { + else if ($action == 'updateline' && $user->rights->commande->creer && GETPOST('cancel') == $langs->trans('Cancel')) { header('Location: ' . $_SERVER['PHP_SELF'] . '?id=' . $object->id); // Pour reaffichage de la fiche en cours d'edition exit(); } @@ -2101,7 +2102,7 @@ if ($action == 'create' && $user->rights->commande->creer) print '
- + '; diff --git a/htdocs/core/class/commonobject.class.php b/htdocs/core/class/commonobject.class.php index da9971b1b4e..a9f20b0edb3 100644 --- a/htdocs/core/class/commonobject.class.php +++ b/htdocs/core/class/commonobject.class.php @@ -2137,7 +2137,7 @@ abstract class CommonObject $fieldstatus="fk_statut"; if ($elementTable == 'user') $fieldstatus="statut"; if ($elementTable == 'expensereport') $fieldstatus="fk_c_expensereport_statuts"; - + $sql = "UPDATE ".MAIN_DB_PREFIX.$elementTable; $sql.= " SET ".$fieldstatus." = ".$status; // If status = 1 = validated, update also fk_user_valid @@ -2572,7 +2572,12 @@ abstract class CommonObject */ function printObjectLines($action, $seller, $buyer, $selected=0, $dateSelector=0) { - global $conf, $hookmanager, $inputalsopricewithtax, $langs, $user; + global $conf, $hookmanager, $inputalsopricewithtax, $usermargins, $langs, $user; + + # Define usemargins + $usemargins=0; + if (! empty($conf->margin->enabled) && ! empty($this->element) && in_array($this->element,array('facture','propal','commande'))) $usemargins=1; + print '
'; @@ -2599,7 +2604,7 @@ abstract class CommonObject print ''; } - if (! empty($conf->margin->enabled) && empty($user->societe_id)) + if ($usermargins && ! empty($conf->margin->enabled) && empty($user->societe_id)) { if ($conf->global->MARGIN_TYPE == "1") print ''; diff --git a/htdocs/core/db/pgsql.class.php b/htdocs/core/db/pgsql.class.php index 22ca6e4171e..94a2e5fa975 100644 --- a/htdocs/core/db/pgsql.class.php +++ b/htdocs/core/db/pgsql.class.php @@ -208,6 +208,8 @@ class DoliDBPgsql extends DoliDB $line=preg_replace('/tinytext/i','text',$line); $line=preg_replace('/mediumtext/i','text',$line); + $line=preg_replace('/text\([0-9]+\)/i','text',$line); + // change not null datetime field to null valid ones // (to support remapping of "zero time" to null $line=preg_replace('/datetime not null/i','datetime',$line); diff --git a/htdocs/core/tpl/objectline_create.tpl.php b/htdocs/core/tpl/objectline_create.tpl.php index bce94c70a57..8a98ac2f613 100644 --- a/htdocs/core/tpl/objectline_create.tpl.php +++ b/htdocs/core/tpl/objectline_create.tpl.php @@ -263,7 +263,8 @@ else { table_element_line=='commandedet') { $newline = new OrderLine($this->db); } @@ -276,6 +277,12 @@ else { elseif ($this->table_element_line=='contratdet') { $newline = new ContratLigne($this->db); } + elseif ($this->table_element_line=='commande_fournisseurdet') { + $newline = new CommandeFournisseurLigne($this->db); + } + elseif ($this->table_element_line=='facture_fourn_det') { + $newline = new FactureFournisseurLigne($this->db); + } if (is_object($newline)) { print $newline->showOptionals($extrafieldsline, 'edit', array('style'=>$bcnd[$var], 'colspan'=>$coldisplay+8)); } diff --git a/htdocs/core/tpl/objectline_edit.tpl.php b/htdocs/core/tpl/objectline_edit.tpl.php index ae2238e06f2..d844cc09c76 100644 --- a/htdocs/core/tpl/objectline_edit.tpl.php +++ b/htdocs/core/tpl/objectline_edit.tpl.php @@ -199,7 +199,8 @@ $coldisplay=-1; // We remove first td showOptionals($extrafieldsline,'edit',array('style'=>$bc[$var],'colspan'=>$coldisplay)); } ?> diff --git a/htdocs/core/tpl/objectline_view.tpl.php b/htdocs/core/tpl/objectline_view.tpl.php index 2e1cc0f3678..dab7361eea9 100644 --- a/htdocs/core/tpl/objectline_view.tpl.php +++ b/htdocs/core/tpl/objectline_view.tpl.php @@ -27,18 +27,17 @@ * $forceall (0 by default, 1 for supplier invoices/orders) * $senderissupplier (0 by default, 1 for supplier invoices/orders) * $inputalsopricewithtax (0 by default, 1 to also show column with unit price including tax) + * $usemargins (0 to disable all margins columns, 1 to show according to margin setup) * * $type, $text, $description, $line */ -$usemargins=0; -if (! empty($conf->margin->enabled) && ! empty($object->element) && in_array($object->element,array('facture','propal','commande'))) $usemargins=1; - -global $forceall, $senderissupplier, $inputalsopricewithtax; +global $forceall, $senderissupplier, $inputalsopricewithtax, $usemargins; if (empty($dateSelector)) $dateSelector=0; if (empty($forceall)) $forceall=0; if (empty($senderissupplier)) $senderissupplier=0; if (empty($inputalsopricewithtax)) $inputalsopricewithtax=0; +if (empty($usemargins)) $usemargins=0; ?> @@ -83,7 +82,8 @@ if (empty($inputalsopricewithtax)) $inputalsopricewithtax=0; } else { - if ($line->fk_product > 0) { + if ($line->fk_product > 0) + { echo $form->textwithtooltip($text,$description,3,'','',$i,0,(!empty($line->fk_parent_line)?img_picto('', 'rightarrow'):'')); @@ -96,7 +96,9 @@ if (empty($inputalsopricewithtax)) $inputalsopricewithtax=0; print (! empty($line->description) && $line->description!=$line->product_label)?'
'.dol_htmlentitiesbr($line->description):''; } - } else { + } + else + { if ($type==1) $text = img_object($langs->trans('Service'),'service'); else $text = img_object($langs->trans('Product'),'product'); @@ -145,17 +147,19 @@ if (empty($inputalsopricewithtax)) $inputalsopricewithtax=0; print '
'; } - if (! empty($conf->margin->enabled) && empty($user->societe_id)) { - $rounding = min($conf->global->MAIN_MAX_DECIMALS_UNIT,$conf->global->MAIN_MAX_DECIMALS_TOT); - ?> + if ($usermargins && ! empty($conf->margin->enabled) && empty($user->societe_id)) + { + $rounding = min($conf->global->MAIN_MAX_DECIMALS_UNIT,$conf->global->MAIN_MAX_DECIMALS_TOT); + ?> - global->DISPLAY_MARGIN_RATES) && $user->rights->margins->liretous) {?> + global->DISPLAY_MARGIN_RATES) && $user->rights->margins->liretous) { ?> - global->DISPLAY_MARK_RATES) && $user->rights->margins->liretous) {?> + global->DISPLAY_MARK_RATES) && $user->rights->margins->liretous) {?> - + special_code == 3) { ?> diff --git a/htdocs/fourn/class/fournisseur.facture.class.php b/htdocs/fourn/class/fournisseur.facture.class.php index ff36c171298..0cc08220a49 100644 --- a/htdocs/fourn/class/fournisseur.facture.class.php +++ b/htdocs/fourn/class/fournisseur.facture.class.php @@ -1814,3 +1814,15 @@ class FactureFournisseur extends CommonInvoice } } + + + +/** + * Class to manage line invoices + */ +class FactureFournisseurLigne extends CommonInvoiceLine +{ + + +} + diff --git a/htdocs/fourn/commande/card.php b/htdocs/fourn/commande/card.php index e6a5aafad38..8c0b4fd5900 100644 --- a/htdocs/fourn/commande/card.php +++ b/htdocs/fourn/commande/card.php @@ -63,6 +63,8 @@ $confirm = GETPOST('confirm','alpha'); $comclientid = GETPOST('comid','int'); $socid = GETPOST('socid','int'); $projectid = GETPOST('projectid','int'); +$cancel = GETPOST('cancel','alpha'); +$lineid = GETPOST('lineid', 'int'); //PDF $hidedetails = (GETPOST('hidedetails','int') ? GETPOST('hidedetails','int') : (! empty($conf->global->MAIN_GENERATE_DOCUMENTS_HIDE_DETAILS) ? 1 : 0)); @@ -113,6 +115,8 @@ $permissionnote=$user->rights->fournisseur->commande->creer; // Used by the incl * Actions */ +if ($cancel) $action=''; + $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'); @@ -402,7 +406,7 @@ if ($action == 'addline' && $user->rights->fournisseur->commande->creer) /* * Mise a jour d'une ligne dans la commande */ -if ($action == 'update_line' && $user->rights->fournisseur->commande->creer && ! GETPOST('cancel')) +if ($action == 'updateline' && $user->rights->fournisseur->commande->creer && ! GETPOST('cancel')) { if ($_POST["elrowid"]) { @@ -1693,23 +1697,32 @@ elseif (! empty($object->id)) /* * Lines */ + //$result = $object->getLinesArray(); - print ' id.(($action != 'edit_line')?'#add':'#line_'.GETPOST('lineid')).'" method="POST"> + print ' - + - '; + if (! empty($conf->use_javascript_ajax) && $object->statut == 0) { + include DOL_DOCUMENT_ROOT . '/core/tpl/ajaxrow.tpl.php'; + } print '
'.$langs->trans("Ref").''; + print ''.$langs->trans("ComposedProduct").''; print ''.$langs->trans("Label").''; - print ''.$langs->trans("IsInPackage").''; + //print ''.$langs->trans("IsInPackage").''; print ''.$langs->trans("Qty").''; + print ''.$langs->trans('ComposedProductDIncDecStock').'
'.$labeltoshow.''; - print ''; + print ''; + if ($qty) print ''; + else + { + // TODO Hide field and show it when setting a qty + print ''; + //print ''; + } + print '
'.$langs->trans('MinSupplierPrice').''.$langs->trans('Stock').''.$langs->trans('Qty').''.$langs->trans('ComposedProductDIncDecStock').''.$langs->trans('ComposedProductIncDecStock').'
'.$langs->trans("Label").''; //print ''.$langs->trans("IsInPackage").''; print ''.$langs->trans("Qty").''; - print ''.$langs->trans('ComposedProductDIncDecStock').''.$langs->trans('ComposedProductIncDecStock').'
'.$langs->trans("AccountancyCode").''; - print ''; - print '
'.$langs->trans("AccountancyCode").''; + print ''; + print '
'.$langs->trans("AccountancyCode").''.$object->accountancy_code.'
'.$langs->trans("AccountancyCode").''.$object->accountancy_code.'
'.$langs->trans("AccountancyCode").''; - if ($caneditfield) - { - print ''; - } - else - { - print ''; - print $object->accountancy_code; - } - print '
'.$langs->trans("AccountancyCode").''; + if ($caneditfield) + { + print ''; + } + else + { + print ''; + print $object->accountancy_code; + } + print '
'.$langs->trans('BuyingPrice').'' . $line->situation_percent . '%pa_ht); ?>pa_ht == 0)?'n/a':price($line->marge_tx, null, null, null, null, $rounding).'%'); ?>marque_tx, null, null, null, null, $rounding).'%'; ?>trans('Option'); ?>
'; - $num = count($object->lines); - $i = 0; $total = 0; + // Show object lines + $inputalsopricewithtax=1; + if (! empty($object->lines)) + $ret = $object->printObjectLines($action, $soc, $mysoc, $lineid, 1); + $num = count($object->lines); + +/* + $i = 0; $total = 0; if ($num) { print ''; @@ -1746,7 +1759,7 @@ elseif (! empty($object->id)) } // Edit line - if ($action != 'edit_line' || $_GET['rowid'] != $line->id) + if ($action != 'editline' || $_GET['rowid'] != $line->id) { print ''; @@ -1808,7 +1821,7 @@ elseif (! empty($object->id)) if ($object->statut == 0 && $user->rights->fournisseur->commande->creer) { - print ''; @@ -1825,7 +1838,7 @@ elseif (! empty($object->id)) } // Edit line - if ($action == 'edit_line' && $user->rights->fournisseur->commande->creer && ($_GET["rowid"] == $line->id)) + if ($action == 'editline' && $user->rights->fournisseur->commande->creer && ($_GET["rowid"] == $line->id)) { print "\n"; print ''; @@ -1885,9 +1898,9 @@ elseif (! empty($object->id)) } $i++; } - +*/ // Form to add new line - if ($object->statut == 0 && $user->rights->fournisseur->commande->creer && $action != 'edit_line') + if ($object->statut == 0 && $user->rights->fournisseur->commande->creer && $action != 'editline') { // Add free products/services form global $forceall, $senderissupplier, $dateSelector; @@ -2235,7 +2248,7 @@ elseif (! empty($object->id)) // modified by hook if (empty($reshook)) { - if ($user->societe_id == 0 && $action != 'edit_line' && $action != 'delete') + if ($user->societe_id == 0 && $action != 'editline' && $action != 'delete') { print '
'; diff --git a/htdocs/fourn/facture/card.php b/htdocs/fourn/facture/card.php index 540c7dfe035..df6ab1e73d2 100644 --- a/htdocs/fourn/facture/card.php +++ b/htdocs/fourn/facture/card.php @@ -57,6 +57,8 @@ $id = (GETPOST('facid','int') ? GETPOST('facid','int') : GETPOST('id','int')); $action = GETPOST("action"); $confirm = GETPOST("confirm"); $ref = GETPOST('ref','alpha'); +$cancel = GETPOST('cancel','alpha'); +$lineid = GETPOST('lineid', 'int'); //PDF $hidedetails = (GETPOST('hidedetails','int') ? GETPOST('hidedetails','int') : (! empty($conf->global->MAIN_GENERATE_DOCUMENTS_HIDE_DETAILS) ? 1 : 0)); @@ -90,6 +92,8 @@ $permissionnote=$user->rights->fournisseur->facture->creer; // Used by the inclu * Actions */ +if ($cancel) $action=''; + $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'); @@ -503,12 +507,11 @@ elseif ($action == 'add' && $user->rights->fournisseur->facture->creer) } // Edit line -elseif ($action == 'update_line' && $user->rights->fournisseur->facture->creer) +elseif ($action == 'updateline' && $user->rights->fournisseur->facture->creer) { - // TODO Missing transaction - if (GETPOST('etat') == '1' && ! GETPOST('cancel')) // si on valide la modification - { - $object->fetch($id); + $db->begin(); + + $object->fetch($id); $object->fetch_thirdparty(); if ($_POST['puht']) @@ -547,12 +550,13 @@ elseif ($action == 'update_line' && $user->rights->fournisseur->facture->creer) if ($result >= 0) { unset($_POST['label']); + $db->commit(); } else { + $db->rollback(); setEventMessage($object->error,'errors'); } - } } elseif ($action == 'addline' && $user->rights->fournisseur->facture->creer) @@ -1954,11 +1958,10 @@ else $cols = 4; include DOL_DOCUMENT_ROOT . '/core/tpl/extrafields_view.tpl.php'; - print '
id.'#'.$line->id.'">'; + print 'id.'#'.$line->id.'">'; print img_edit(); print '
'; + print '

'; if (! empty($conf->global->MAIN_DISABLE_CONTACTS_TAB)) { - print '
'; $blocname = 'contacts'; $title = $langs->trans('ContactsAddresses'); include DOL_DOCUMENT_ROOT.'/core/tpl/bloc_showhide.tpl.php'; @@ -1976,23 +1979,31 @@ else /* * Lines */ + //$result = $object->getLinesArray(); - print ' id.(($action != 'edit_line')?'#add':'#line_'.GETPOST('lineid')).'" method="POST"> + print ' - + - - '; + if (! empty($conf->use_javascript_ajax) && $object->statut == 0) { + include DOL_DOCUMENT_ROOT . '/core/tpl/ajaxrow.tpl.php'; + } - print '
'; - print ''; - $var=1; - $num=count($object->lines); + print '
'; + + // Show object lines + if (! empty($object->lines)) + $ret = $object->printObjectLines($action, $soc, $mysoc, $lineid, 1); + + $num=count($object->lines); + + /* + $var=1; for ($i = 0; $i < $num; $i++) { if ($i == 0) @@ -2029,7 +2040,7 @@ else $var=!$var; // Edit line - if ($object->statut == 0 && $action == 'edit_line' && $_GET['etat'] == '0' && $_GET['lineid'] == $object->lines[$i]->rowid) + if ($object->statut == 0 && $action == 'editline' && $_GET['lineid'] == $object->lines[$i]->rowid) { print ''; @@ -2156,7 +2167,7 @@ else } print ''; @@ -2172,9 +2183,9 @@ else } } - +*/ // Form to add new line - if ($object->statut == 0 && $action != 'edit_line') + if ($object->statut == 0 && $action != 'editline') { global $forceall, $senderissupplier, $dateSelector, $inputalsopricewithtax; $forceall=1; $senderissupplier=1; $dateSelector=0; $inputalsopricewithtax=1; @@ -2195,6 +2206,7 @@ else print '
'; - if ($object->statut == 0) print 'lines[$i]->rowid.'">'.img_edit().''; + if ($object->statut == 0) print 'lines[$i]->rowid.'">'.img_edit().''; else print ' '; print '
'; + print ''; dol_fiche_end(); diff --git a/htdocs/install/mysql/migration/3.7.0-3.8.0.sql b/htdocs/install/mysql/migration/3.7.0-3.8.0.sql index c09c434d27e..41c84fddeaa 100755 --- a/htdocs/install/mysql/migration/3.7.0-3.8.0.sql +++ b/htdocs/install/mysql/migration/3.7.0-3.8.0.sql @@ -209,3 +209,13 @@ create table llx_commande_fournisseurdet_extrafields ALTER TABLE llx_commande_fournisseurdet_extrafields ADD INDEX idx_commande_fournisseurdet_extrafields (fk_object); +create table llx_facture_fourn_det_extrafields +( + rowid integer AUTO_INCREMENT PRIMARY KEY, + tms timestamp, + fk_object integer NOT NULL, + import_key varchar(14) -- import key +) ENGINE=innodb; + +ALTER TABLE llx_facture_fourn_det_extrafields ADD INDEX idx_facture_fourn_det_extrafields (fk_object); + From 88d1d203d858f3083dcf1ee0eb8b8084fa5d3928 Mon Sep 17 00:00:00 2001 From: Juanjo Menent Date: Fri, 27 Feb 2015 18:13:24 +0100 Subject: [PATCH 183/287] Fix: Bad SEPA xml file creation Conflicts: htdocs/compta/prelevement/class/bonprelevement.class.php --- ChangeLog | 1 + .../class/bonprelevement.class.php | 51 ++++++++++++------- 2 files changed, 35 insertions(+), 17 deletions(-) diff --git a/ChangeLog b/ChangeLog index a14c6830947..d4999c867c2 100644 --- a/ChangeLog +++ b/ChangeLog @@ -198,6 +198,7 @@ Dolibarr better: - Fix: [ bug #1830 ] Salaries payment only allows checking accounts - Fix: [ bug #1825 ] External agenda: hide/show checkbox doesn't work - Fix: [ bug #1790 ] Email form behaves in an unexpected way when pressing Enter key +- Fix: Bad SEPA xml file creation ***** ChangeLog for 3.6.2 compared to 3.6.1 ***** - Fix: fix ErrorBadValueForParamNotAString error message in price customer multiprice. diff --git a/htdocs/compta/prelevement/class/bonprelevement.class.php b/htdocs/compta/prelevement/class/bonprelevement.class.php index a43423c0d78..e8a34d6e22f 100644 --- a/htdocs/compta/prelevement/class/bonprelevement.class.php +++ b/htdocs/compta/prelevement/class/bonprelevement.class.php @@ -1255,14 +1255,29 @@ class BonPrelevement extends CommonObject $fileDebiteurSection = ''; $fileEmetteurSection = ''; $i = 0; + $j = 0; $this->total = 0; /* * section Debiteur (sepa Debiteurs bloc lines) */ - $sql = "SELECT soc.code_client as code, soc.address, soc.zip, soc.town, c.code as country_code,"; - $sql.= " pl.client_nom as name, pl.code_banque as cb, pl.code_guichet as cg, pl.number as cc, pl.amount as somme,"; - $sql.= " f.facnumber as fac, pf.fk_facture as idfac, rib.iban_prefix as iban, rib.bic as bic, rib.datec, rib.rowid as drum"; + + $sql = "SELECT f.facnumber as fac FROM ".MAIN_DB_PREFIX."prelevement_lignes as pl, ".MAIN_DB_PREFIX."facture as f, ".MAIN_DB_PREFIX."prelevement_facture as pf, ".MAIN_DB_PREFIX."societe as soc, ".MAIN_DB_PREFIX."c_country as p, ".MAIN_DB_PREFIX."societe_rib as rib WHERE pl.fk_prelevement_bons = ".$this->id." AND pl.rowid = pf.fk_prelevement_lignes AND pf.fk_facture = f.rowid AND soc.fk_pays = p.rowid AND soc.rowid = f.fk_soc AND rib.fk_soc = f.fk_soc AND rib.default_rib = 1"; + $resql=$this->db->query($sql); + if ($resql) + { + $num = $this->db->num_rows($resql); + while ($j < $num) + { + $objfac = $this->db->fetch_object($resql); + $ListOfFactures = $ListOfFactures . $objfac->fac . ","; + $j++; + } + } + + $sql = "SELECT soc.code_client as code, soc.address, soc.zip, soc.town, soc.datec, p.code as country_code,"; + $sql.= " pl.client_nom as nom, pl.code_banque as cb, pl.code_guichet as cg, pl.number as cc, pl.amount as somme,"; + $sql.= " f.facnumber as fac, pf.fk_facture as idfac, rib.iban_prefix as iban, rib.bic as bic, rib.rowid as drum"; $sql.= " FROM"; $sql.= " ".MAIN_DB_PREFIX."prelevement_lignes as pl,"; $sql.= " ".MAIN_DB_PREFIX."facture as f,"; @@ -1285,7 +1300,7 @@ class BonPrelevement extends CommonObject while ($i < $num) { $obj = $this->db->fetch_object($resql); - $fileDebiteurSection .= $this->EnregDestinataireSEPA($obj->code, $obj->name, $obj->address, $obj->zip, $obj->town, $obj->country_code, $obj->cb, $obj->cg, $obj->cc, $obj->somme, $obj->facnumber, $obj->idfac, $obj->iban, $obj->bic, $obj->datec, $obj->drum); + $fileDebiteurSection .= $this->EnregDestinataireSEPA($obj->code, $obj->nom, $obj->address, $obj->zip, $obj->town, $obj->country_code, $obj->cb, $obj->cg, $obj->cc, $obj->somme, $ListOfFactures , $obj->idfac, $obj->iban, $obj->bic, $obj->datec, $obj->drum); $this->total = $this->total + $obj->somme; $i++; } @@ -1320,13 +1335,14 @@ class BonPrelevement extends CommonObject fputs($this->file, ' '.$this->total.''.$CrLf); fputs($this->file, ' '.$CrLf); fputs($this->file, ' '.$this->raison_sociale.''.$CrLf); -/* fputs($this->file, ' '.$CrLf); - fputs($this->file, ' '.$CrLf); - fputs($this->file, ' 0533883248'.$CrLf); - fputs($this->file, ' KBO-BCE'.$CrLf); + fputs($this->file, ' '.$CrLf); + fputs($this->file, ' '.$CrLf); fputs($this->file, ' '.$CrLf); + fputs($this->file, ' '.$conf->global->PRELEVEMENT_ICS.''.$CrLf); + fputs($this->file, ' '.$CrLf); + fputs($this->file, ' '.$CrLf); fputs($this->file, ' '.$CrLf); -*/ fputs($this->file, ' '.$CrLf); + fputs($this->file, ' '.$CrLf); fputs($this->file, ' '.$CrLf); // SEPA File Emetteur if ($result != -2) @@ -1515,19 +1531,19 @@ class BonPrelevement extends CommonObject // Define value for RUM // Example: RUMCustomerCode-CustomerBankAccountId-01424448606 (note: Date is date of creation of CustomerBankAccountId) $Date_Rum = strtotime($row_datec); - $pre = ($date_Rum > 1359673200) ? 'RUM' : '++R'; - $Rum = dol_trunc($pre.$row_code_client.'-'.$row_drum.'-0'.date('U', $Date_Rum), 35, 'right', 'UTF-8', 1); - + $DtOfSgntr = dol_print_date($row_datec, '%Y-%m-%d'); + $pre = ($date_Rum > 1359673200) ? 'Rum' : '++R'; + $Rum = $pre.$row_code_client.$row_drum.'-0'.date('U', $Date_Rum); $XML_DEBITOR =''; $XML_DEBITOR .=' '.$CrLf; $XML_DEBITOR .=' '.$CrLf; $XML_DEBITOR .=' '.('AS-'.$row_facnumber.'-'.$Rowing).''.$CrLf; $XML_DEBITOR .=' '.$CrLf; - $XML_DEBITOR .=' '.round($row_somme, 2).''.$CrLf; + $XML_DEBITOR .=' '.round($row_somme, 2).''.$CrLf; $XML_DEBITOR .=' '.$CrLf; $XML_DEBITOR .=' '.$CrLf; $XML_DEBITOR .=' '.$Rum.''.$CrLf; - $XML_DEBITOR .=' '.$row_datec.''.$CrLf; + $XML_DEBITOR .=' '.$DtOfSgntr.''.$CrLf; $XML_DEBITOR .=' false'.$CrLf; $XML_DEBITOR .=' '.$CrLf; $XML_DEBITOR .=' '.$CrLf; @@ -1540,17 +1556,18 @@ class BonPrelevement extends CommonObject $XML_DEBITOR .=' '.strtoupper(dol_string_unaccent($row_nom)).''.$CrLf; $XML_DEBITOR .=' '.$CrLf; $XML_DEBITOR .=' '.$row_country_code.''.$CrLf; - $XML_DEBITOR .=' '.strtr($row_adr, array(CHR(13) => ", ", CHR(10) => "")).''.$CrLf; + $XML_DEBITOR .=' '.strtr($row_address, array(CHR(13) => ", ", CHR(10) => "")).''.$CrLf; $XML_DEBITOR .=' '.dol_string_unaccent($row_zip.' '.$row_town).''.$CrLf; $XML_DEBITOR .=' '.$CrLf; $XML_DEBITOR .=' '.$CrLf; $XML_DEBITOR .=' '.$CrLf; $XML_DEBITOR .=' '.$CrLf; - $XML_DEBITOR .=' '.$row_iban.''.$CrLf; + $XML_DEBITOR .=' '.preg_replace('/\s/', '', $row_iban).''.$CrLf; $XML_DEBITOR .=' '.$CrLf; $XML_DEBITOR .=' '.$CrLf; $XML_DEBITOR .=' '.$CrLf; - $XML_DEBITOR .=' '.($row_facnumber.'/'.$Rowing.'/'.$Rum).''.$CrLf; + // $XML_DEBITOR .=' '.($row_facnumber.'/'.$Rowing.'/'.$Rum).''.$CrLf; + $XML_DEBITOR .=' '.$row_facnumber.''.$CrLf; $XML_DEBITOR .=' '.$CrLf; $XML_DEBITOR .=' '.$CrLf; return $XML_DEBITOR; From 856c8f24de618128d42df4e3492ceb5fc4c46ee3 Mon Sep 17 00:00:00 2001 From: Juanjo Menent Date: Fri, 27 Feb 2015 18:13:24 +0100 Subject: [PATCH 184/287] Fix: Bad SEPA xml file creation Conflicts: htdocs/compta/prelevement/class/bonprelevement.class.php --- ChangeLog | 1 + .../class/bonprelevement.class.php | 51 ++++++++++++------- 2 files changed, 35 insertions(+), 17 deletions(-) diff --git a/ChangeLog b/ChangeLog index a38c7751875..ebf41dd0516 100644 --- a/ChangeLog +++ b/ChangeLog @@ -222,6 +222,7 @@ Dolibarr better: - Fix: [ bug #1830 ] Salaries payment only allows checking accounts - Fix: [ bug #1825 ] External agenda: hide/show checkbox doesn't work - Fix: [ bug #1790 ] Email form behaves in an unexpected way when pressing Enter key +- Fix: Bad SEPA xml file creation ***** ChangeLog for 3.6.2 compared to 3.6.1 ***** - Fix: fix ErrorBadValueForParamNotAString error message in price customer multiprice. diff --git a/htdocs/compta/prelevement/class/bonprelevement.class.php b/htdocs/compta/prelevement/class/bonprelevement.class.php index d8324178f87..63ad32f9bf9 100644 --- a/htdocs/compta/prelevement/class/bonprelevement.class.php +++ b/htdocs/compta/prelevement/class/bonprelevement.class.php @@ -1249,14 +1249,29 @@ class BonPrelevement extends CommonObject $fileDebiteurSection = ''; $fileEmetteurSection = ''; $i = 0; + $j = 0; $this->total = 0; /* * section Debiteur (sepa Debiteurs bloc lines) */ - $sql = "SELECT soc.code_client as code, soc.address, soc.zip, soc.town, c.code as country_code,"; - $sql.= " pl.client_nom as name, pl.code_banque as cb, pl.code_guichet as cg, pl.number as cc, pl.amount as somme,"; - $sql.= " f.facnumber as fac, pf.fk_facture as idfac, rib.iban_prefix as iban, rib.bic as bic, rib.datec, rib.rowid as drum"; + + $sql = "SELECT f.facnumber as fac FROM ".MAIN_DB_PREFIX."prelevement_lignes as pl, ".MAIN_DB_PREFIX."facture as f, ".MAIN_DB_PREFIX."prelevement_facture as pf, ".MAIN_DB_PREFIX."societe as soc, ".MAIN_DB_PREFIX."c_country as p, ".MAIN_DB_PREFIX."societe_rib as rib WHERE pl.fk_prelevement_bons = ".$this->id." AND pl.rowid = pf.fk_prelevement_lignes AND pf.fk_facture = f.rowid AND soc.fk_pays = p.rowid AND soc.rowid = f.fk_soc AND rib.fk_soc = f.fk_soc AND rib.default_rib = 1"; + $resql=$this->db->query($sql); + if ($resql) + { + $num = $this->db->num_rows($resql); + while ($j < $num) + { + $objfac = $this->db->fetch_object($resql); + $ListOfFactures = $ListOfFactures . $objfac->fac . ","; + $j++; + } + } + + $sql = "SELECT soc.code_client as code, soc.address, soc.zip, soc.town, soc.datec, p.code as country_code,"; + $sql.= " pl.client_nom as nom, pl.code_banque as cb, pl.code_guichet as cg, pl.number as cc, pl.amount as somme,"; + $sql.= " f.facnumber as fac, pf.fk_facture as idfac, rib.iban_prefix as iban, rib.bic as bic, rib.rowid as drum"; $sql.= " FROM"; $sql.= " ".MAIN_DB_PREFIX."prelevement_lignes as pl,"; $sql.= " ".MAIN_DB_PREFIX."facture as f,"; @@ -1279,7 +1294,7 @@ class BonPrelevement extends CommonObject while ($i < $num) { $obj = $this->db->fetch_object($resql); - $fileDebiteurSection .= $this->EnregDestinataireSEPA($obj->code, $obj->name, $obj->address, $obj->zip, $obj->town, $obj->country_code, $obj->cb, $obj->cg, $obj->cc, $obj->somme, $obj->facnumber, $obj->idfac, $obj->iban, $obj->bic, $obj->datec, $obj->drum); + $fileDebiteurSection .= $this->EnregDestinataireSEPA($obj->code, $obj->nom, $obj->address, $obj->zip, $obj->town, $obj->country_code, $obj->cb, $obj->cg, $obj->cc, $obj->somme, $ListOfFactures , $obj->idfac, $obj->iban, $obj->bic, $obj->datec, $obj->drum); $this->total = $this->total + $obj->somme; $i++; } @@ -1314,13 +1329,14 @@ class BonPrelevement extends CommonObject fputs($this->file, ' '.$this->total.''.$CrLf); fputs($this->file, ' '.$CrLf); fputs($this->file, ' '.$this->raison_sociale.''.$CrLf); -/* fputs($this->file, ' '.$CrLf); - fputs($this->file, ' '.$CrLf); - fputs($this->file, ' 0533883248'.$CrLf); - fputs($this->file, ' KBO-BCE'.$CrLf); + fputs($this->file, ' '.$CrLf); + fputs($this->file, ' '.$CrLf); fputs($this->file, ' '.$CrLf); + fputs($this->file, ' '.$conf->global->PRELEVEMENT_ICS.''.$CrLf); + fputs($this->file, ' '.$CrLf); + fputs($this->file, ' '.$CrLf); fputs($this->file, ' '.$CrLf); -*/ fputs($this->file, ' '.$CrLf); + fputs($this->file, ' '.$CrLf); fputs($this->file, ' '.$CrLf); // SEPA File Emetteur if ($result != -2) @@ -1509,19 +1525,19 @@ class BonPrelevement extends CommonObject // Define value for RUM // Example: RUMCustomerCode-CustomerBankAccountId-01424448606 (note: Date is date of creation of CustomerBankAccountId) $Date_Rum = strtotime($row_datec); - $pre = ($date_Rum > 1359673200) ? 'RUM' : '++R'; - $Rum = dol_trunc($pre.$row_code_client.'-'.$row_drum.'-0'.date('U', $Date_Rum), 35, 'right', 'UTF-8', 1); - + $DtOfSgntr = dol_print_date($row_datec, '%Y-%m-%d'); + $pre = ($date_Rum > 1359673200) ? 'Rum' : '++R'; + $Rum = $pre.$row_code_client.$row_drum.'-0'.date('U', $Date_Rum); $XML_DEBITOR =''; $XML_DEBITOR .=' '.$CrLf; $XML_DEBITOR .=' '.$CrLf; $XML_DEBITOR .=' '.('AS-'.$row_facnumber.'-'.$Rowing).''.$CrLf; $XML_DEBITOR .=' '.$CrLf; - $XML_DEBITOR .=' '.round($row_somme, 2).''.$CrLf; + $XML_DEBITOR .=' '.round($row_somme, 2).''.$CrLf; $XML_DEBITOR .=' '.$CrLf; $XML_DEBITOR .=' '.$CrLf; $XML_DEBITOR .=' '.$Rum.''.$CrLf; - $XML_DEBITOR .=' '.$row_datec.''.$CrLf; + $XML_DEBITOR .=' '.$DtOfSgntr.''.$CrLf; $XML_DEBITOR .=' false'.$CrLf; $XML_DEBITOR .=' '.$CrLf; $XML_DEBITOR .=' '.$CrLf; @@ -1534,17 +1550,18 @@ class BonPrelevement extends CommonObject $XML_DEBITOR .=' '.strtoupper(dol_string_unaccent($row_nom)).''.$CrLf; $XML_DEBITOR .=' '.$CrLf; $XML_DEBITOR .=' '.$row_country_code.''.$CrLf; - $XML_DEBITOR .=' '.strtr($row_adr, array(CHR(13) => ", ", CHR(10) => "")).''.$CrLf; + $XML_DEBITOR .=' '.strtr($row_address, array(CHR(13) => ", ", CHR(10) => "")).''.$CrLf; $XML_DEBITOR .=' '.dol_string_unaccent($row_zip.' '.$row_town).''.$CrLf; $XML_DEBITOR .=' '.$CrLf; $XML_DEBITOR .=' '.$CrLf; $XML_DEBITOR .=' '.$CrLf; $XML_DEBITOR .=' '.$CrLf; - $XML_DEBITOR .=' '.$row_iban.''.$CrLf; + $XML_DEBITOR .=' '.preg_replace('/\s/', '', $row_iban).''.$CrLf; $XML_DEBITOR .=' '.$CrLf; $XML_DEBITOR .=' '.$CrLf; $XML_DEBITOR .=' '.$CrLf; - $XML_DEBITOR .=' '.($row_facnumber.'/'.$Rowing.'/'.$Rum).''.$CrLf; + // $XML_DEBITOR .=' '.($row_facnumber.'/'.$Rowing.'/'.$Rum).''.$CrLf; + $XML_DEBITOR .=' '.$row_facnumber.''.$CrLf; $XML_DEBITOR .=' '.$CrLf; $XML_DEBITOR .=' '.$CrLf; return $XML_DEBITOR; From 8c6ee6b7a8104a7e26eeefabd8318fa96b3029d3 Mon Sep 17 00:00:00 2001 From: Juanjo Menent Date: Fri, 27 Feb 2015 18:20:35 +0100 Subject: [PATCH 185/287] Trad: Syncro from transifex --- htdocs/langs/es_ES/accountancy.lang | 6 +++--- htdocs/langs/es_ES/admin.lang | 2 +- htdocs/langs/es_ES/agenda.lang | 2 +- htdocs/langs/es_ES/compta.lang | 2 +- htdocs/langs/es_ES/cron.lang | 4 ++-- htdocs/langs/es_ES/errors.lang | 4 ++-- htdocs/langs/es_ES/orders.lang | 8 ++++---- htdocs/langs/es_ES/productbatch.lang | 10 +++++----- htdocs/langs/es_ES/products.lang | 6 +++--- htdocs/langs/es_ES/projects.lang | 4 ++-- htdocs/langs/es_ES/sendings.lang | 22 +++++++++++----------- htdocs/langs/es_ES/stocks.lang | 20 ++++++++++---------- htdocs/langs/es_ES/suppliers.lang | 4 ++-- htdocs/langs/es_ES/withdrawals.lang | 2 +- htdocs/langs/es_ES/workflow.lang | 2 +- 15 files changed, 49 insertions(+), 49 deletions(-) diff --git a/htdocs/langs/es_ES/accountancy.lang b/htdocs/langs/es_ES/accountancy.lang index 67b6e7e7f4c..487078605dc 100644 --- a/htdocs/langs/es_ES/accountancy.lang +++ b/htdocs/langs/es_ES/accountancy.lang @@ -13,9 +13,9 @@ ConfigAccountingExpert=Configuración del módulo contable Journaux=Diarios JournalFinancial=Diarios financieros Exports=Exportaciones -Export=Export +Export=Exportar Modelcsv=Modelo de exportación -OptionsDeactivatedForThisExportModel=For this export model, options are deactivated +OptionsDeactivatedForThisExportModel=Las opciones están desactivadas para este modelo de exportación Selectmodelcsv=Seleccione un modelo de exportación Modelcsv_normal=Exportación clásica Modelcsv_CEGID=Exportar a Cegid Expert @@ -68,7 +68,7 @@ Lineofinvoice=Línea de la factura VentilatedinAccount=Contabilizada con éxito en la cuenta contable NotVentilatedinAccount=Cuenta sin contabilización en la contabilidad -ACCOUNTING_SEPARATORCSV=Column separator in export file +ACCOUNTING_SEPARATORCSV=Separador de columnas en el archivo de exportación ACCOUNTING_LIMIT_LIST_VENTILATION=Número de elementos a contabilizar que se muestran por página (máximo recomendado: 50) ACCOUNTING_LIST_SORT_VENTILATION_TODO=Ordenar las páginas de contabilización "A contabilizar" por los elementos más recientes diff --git a/htdocs/langs/es_ES/admin.lang b/htdocs/langs/es_ES/admin.lang index e07f8194142..78ce8878190 100644 --- a/htdocs/langs/es_ES/admin.lang +++ b/htdocs/langs/es_ES/admin.lang @@ -1568,4 +1568,4 @@ SalariesSetup=Configuración del módulo salarios SortOrder=Ordenación Format=Formatear TypePaymentDesc=0:Pago cliente,1:Pago proveedor,2:Tanto pago de cliente como de proveedor -IncludePath=Include path (defined into variable %s) +IncludePath=Include path (definida en la variable %s) diff --git a/htdocs/langs/es_ES/agenda.lang b/htdocs/langs/es_ES/agenda.lang index ad9ebcba1b2..64836535194 100644 --- a/htdocs/langs/es_ES/agenda.lang +++ b/htdocs/langs/es_ES/agenda.lang @@ -60,7 +60,7 @@ SupplierOrderSentByEMail=Pedido a proveedor %s enviada por e-mail SupplierInvoiceSentByEMail=Factura de proveedor %s enviada por e-mail ShippingSentByEMail=Expedición %s enviada por email ShippingValidated= Expedición %s validada -InterventionSentByEMail=Intervention %s sent by EMail +InterventionSentByEMail=Intervención %s enviada por e-mail NewCompanyToDolibarr= Tercero creado DateActionPlannedStart= Fecha de inicio prevista DateActionPlannedEnd= Fecha de fin prevista diff --git a/htdocs/langs/es_ES/compta.lang b/htdocs/langs/es_ES/compta.lang index 83e1dc18b6e..45438f35375 100644 --- a/htdocs/langs/es_ES/compta.lang +++ b/htdocs/langs/es_ES/compta.lang @@ -29,7 +29,7 @@ ReportTurnover=Volumen de ventas PaymentsNotLinkedToInvoice=Pagos vinculados a ninguna factura, por lo que ninguún tercero PaymentsNotLinkedToUser=Pagos no vinculados a un usuario Profit=Beneficio -AccountingResult=Accounting result +AccountingResult=Resultado contable Balance=Saldo Debit=Debe Credit=Haber diff --git a/htdocs/langs/es_ES/cron.lang b/htdocs/langs/es_ES/cron.lang index 477deb2e57a..d8d9065c901 100644 --- a/htdocs/langs/es_ES/cron.lang +++ b/htdocs/langs/es_ES/cron.lang @@ -14,8 +14,8 @@ URLToLaunchCronJobs=URL para ejecutar tareas Cron OrToLaunchASpecificJob=O para ejecutar una tarea en concreto KeyForCronAccess=Clave para la URL para ejecutar tareas Cron FileToLaunchCronJobs=Comando para ejecutar tareas Cron -CronExplainHowToRunUnix=On Unix environment you should use the following crontab entry to run the command line each 5 minutes -CronExplainHowToRunWin=On Microsoft(tm) Windows environement you can use Scheduled task tools to run the command line each 5 minutes +CronExplainHowToRunUnix=En entornos Unix se debe utilizar la siguiente entrada crontab para ejecutar el comando cada 5 minutos +CronExplainHowToRunWin=En entornos Microsoft (tm) Windows, puede utilizar las herramienta tareas programadas para ejecutar el comando cada 5 minutos # Menu CronJobs=Tareas programadas CronListActive=Listado de tareas activas/programadas diff --git a/htdocs/langs/es_ES/errors.lang b/htdocs/langs/es_ES/errors.lang index 16715819b76..18ee8a8a9ee 100644 --- a/htdocs/langs/es_ES/errors.lang +++ b/htdocs/langs/es_ES/errors.lang @@ -158,8 +158,8 @@ ErrorPriceExpression21=Resultado '%s' vacío ErrorPriceExpression22=Resultado '%s' negativo ErrorPriceExpressionInternal=Error interno '%s' ErrorPriceExpressionUnknown=Error desconocido '%s' -ErrorSrcAndTargetWarehouseMustDiffers=Source and target warehouses must differs -ErrorTryToMakeMoveOnProductRequiringBatchData=Error, trying to make a stock movement without batch/serial information, on a product requiring batch/serial information +ErrorSrcAndTargetWarehouseMustDiffers=Los almacenes de origen y destino deben de ser diferentes +ErrorTryToMakeMoveOnProductRequiringBatchData=Error, intenta hacer un movimiento de stock sin indicar lote/serie, en un producto que requiere de lote/serie # Warnings WarningMandatorySetupNotComplete=Los parámetros obligatorios de configuración no están todavía definidos diff --git a/htdocs/langs/es_ES/orders.lang b/htdocs/langs/es_ES/orders.lang index ce5b62a9033..895a5c32915 100644 --- a/htdocs/langs/es_ES/orders.lang +++ b/htdocs/langs/es_ES/orders.lang @@ -29,7 +29,7 @@ StatusOrderDraftShort=Borrador StatusOrderValidatedShort=Validado StatusOrderSentShort=Expedición en curso StatusOrderSent=Envío en curso -StatusOrderOnProcessShort=Ordered +StatusOrderOnProcessShort=Pedido StatusOrderProcessedShort=Procesado StatusOrderToBillShort=Emitido StatusOrderToBill2Short=A facturar @@ -41,7 +41,7 @@ StatusOrderReceivedAllShort=Recibido StatusOrderCanceled=Anulado StatusOrderDraft=Borrador (a validar) StatusOrderValidated=Validado -StatusOrderOnProcess=Ordered - Standby reception +StatusOrderOnProcess=Pedido - En espera de recibir StatusOrderProcessed=Procesado StatusOrderToBill=Emitido StatusOrderToBill2=A facturar @@ -50,8 +50,8 @@ StatusOrderRefused=Rechazado StatusOrderReceivedPartially=Recibido parcialmente StatusOrderReceivedAll=Recibido ShippingExist=Existe una expedición -ProductQtyInDraft=Product quantity into draft orders -ProductQtyInDraftOrWaitingApproved=Product quantity into draft or approved orders, not yet ordered +ProductQtyInDraft=Cantidades en pedidos borrador +ProductQtyInDraftOrWaitingApproved=Cantidades en pedidos borrador o aprobados, pero no realizados DraftOrWaitingApproved=Borrador o aprobado aún no controlado DraftOrWaitingShipped=Borrador o validado aún no expedido MenuOrdersToBill=Pedidos a facturar diff --git a/htdocs/langs/es_ES/productbatch.lang b/htdocs/langs/es_ES/productbatch.lang index 194a1ab5a5b..6fa46be9db5 100644 --- a/htdocs/langs/es_ES/productbatch.lang +++ b/htdocs/langs/es_ES/productbatch.lang @@ -1,8 +1,8 @@ # ProductBATCH language file - en_US - ProductBATCH -ManageLotSerial=Use batch/serial number -ProductStatusOnBatch=Yes (Batch/serial required) -ProductStatusNotOnBatch=No (Batch/serial not used) -ProductStatusOnBatchShort=Yes +ManageLotSerial=Usar numeración por lotes/series +ProductStatusOnBatch=Sí (se necesita lote/serie) +ProductStatusNotOnBatch=No (no se usa lote/serie) +ProductStatusOnBatchShort=Sí ProductStatusNotOnBatchShort=No Batch=Lote/Serie atleast1batchfield=Fecha de caducidad o Fecha de venta o Lote @@ -18,4 +18,4 @@ printQty=Cant.: %d AddDispatchBatchLine=Añada una línea para despacho por caducidad BatchDefaultNumber=Indefinido WhenProductBatchModuleOnOptionAreForced=Si el módulo de Lotes/Series está activado, el incremento/decremento de stock es forzado a lo último escogido y no puede editarse. Otras opciones pueden definirse si se necesita -ProductDoesNotUseBatchSerial=This product does not use batch/serial number +ProductDoesNotUseBatchSerial=Este producto no usa numeración por lotes/series diff --git a/htdocs/langs/es_ES/products.lang b/htdocs/langs/es_ES/products.lang index 97ad12c901b..e07e882a1ee 100644 --- a/htdocs/langs/es_ES/products.lang +++ b/htdocs/langs/es_ES/products.lang @@ -22,14 +22,14 @@ ProductAccountancySellCode=Código contable ventas ProductOrService=Producto o servicio ProductsAndServices=Productos y servicios ProductsOrServices=Productos o servicios -ProductsAndServicesOnSell=Products and Services for sale or for purchase -ProductsAndServicesNotOnSell=Products and Services out of sale +ProductsAndServicesOnSell=Productos y Servicios a la venta o en compra +ProductsAndServicesNotOnSell=Productos y Servicios fuera de venta ProductsAndServicesStatistics=Estadísticas productos y servicios ProductsStatistics=Estadísticas productos ProductsOnSell=Producto en venta o en compra ProductsNotOnSell=Producto fuera de venta y fuera de compra ProductsOnSellAndOnBuy=Productos en venta o en compra -ServicesOnSell=Services for sale or for purchase +ServicesOnSell=Servicios a la venta o en compra ServicesNotOnSell=Servicios fuera de venta ServicesOnSellAndOnBuy=Servicios a la venta o en compra InternalRef=Referencia interna diff --git a/htdocs/langs/es_ES/projects.lang b/htdocs/langs/es_ES/projects.lang index ce1af52a955..b17e8892198 100644 --- a/htdocs/langs/es_ES/projects.lang +++ b/htdocs/langs/es_ES/projects.lang @@ -3,7 +3,7 @@ RefProject=Ref. proyecto ProjectId=Id proyecto Project=Proyecto Projects=Proyectos -ProjectStatus=Project status +ProjectStatus=Estado del proyecto SharedProject=Proyecto compartido PrivateProject=Contactos del proyecto MyProjectsDesc=Esta vista muestra aquellos proyectos en los que usted es un contacto afectado (cualquier tipo). @@ -103,7 +103,7 @@ CloneContacts=Clonar los contactos CloneNotes=Clonar las notas CloneProjectFiles=Clonar los archivos adjuntos del proyecto CloneTaskFiles=Clonar los archivos adjuntos de la(s) tarea(s) (si se clonan la(s) tarea(s)) -CloneMoveDate=Update project/tasks dates from now ? +CloneMoveDate=¿Actualizar las fechas de los proyectos/tareas? ConfirmCloneProject=¿Está seguro de querer clonar este proyecto? ProjectReportDate=Cambiar las fechas de las tareas en función de la fecha de inicio del proyecto ErrorShiftTaskDate=Se ha producido un error en el cambio de las fechas de las tareas diff --git a/htdocs/langs/es_ES/sendings.lang b/htdocs/langs/es_ES/sendings.lang index d9e67d7c0e4..cf377a641db 100644 --- a/htdocs/langs/es_ES/sendings.lang +++ b/htdocs/langs/es_ES/sendings.lang @@ -4,8 +4,8 @@ Sending=Envío Sendings=Envíos Shipment=Envío Shipments=Envíos -ShowSending=Show Sending -Receivings=Receipts +ShowSending=Mostrar envío +Receivings=Recepciones SendingsArea=Área envíos ListOfSendings=Listado de envíos SendingMethod=Método de envío @@ -15,7 +15,7 @@ SearchASending=Buscar envío StatisticsOfSendings=Estadísticas de envíos NbOfSendings=Número de envíos NumberOfShipmentsByMonth=Número de envíos por mes -SendingCard=Shipment card +SendingCard=Ficha envío NewSending=Nuevo envío CreateASending=Crear un envío CreateSending=Crear envío @@ -38,7 +38,7 @@ StatusSendingCanceledShort=Anulado StatusSendingDraftShort=Borrador StatusSendingValidatedShort=Validado StatusSendingProcessedShort=Procesado -SendingSheet=Shipment sheet +SendingSheet=Nota de entrega Carriers=Transportistas Carrier=Transportista CarriersArea=Área transportistas @@ -59,15 +59,15 @@ SendShippingRef=Envío de la expedición %s ActionsOnShipping=Eventos sobre la expedición LinkToTrackYourPackage=Enlace para el seguimento de su paquete ShipmentCreationIsDoneFromOrder=De momento, la creación de una nueva expedición se realiza desde la ficha de pedido. -RelatedShippings=Related shipments +RelatedShippings=Expediciones asociadas ShipmentLine=Línea de expedición CarrierList=Listado de transportistas -SendingRunning=Product from ordered customer orders -SuppliersReceiptRunning=Product from ordered supplier orders -ProductQtyInCustomersOrdersRunning=Product quantity into opened customers orders -ProductQtyInSuppliersOrdersRunning=Product quantity into opened suppliers orders -ProductQtyInShipmentAlreadySent=Product quantity from opended customer order already sent -ProductQtyInSuppliersShipmentAlreadyRecevied=Product quantity from opened supplier order already received +SendingRunning=Producto de pedidos de clientes +SuppliersReceiptRunning=Producto de pedidos a proveedores +ProductQtyInCustomersOrdersRunning=Cantidad en pedidos de clientes abiertos +ProductQtyInSuppliersOrdersRunning=Cantidad en pedidos a proveedores abiertos +ProductQtyInShipmentAlreadySent=Cantidad en pedidos de clientes ya enviados +ProductQtyInSuppliersShipmentAlreadyRecevied=Cantidad en pedidos a proveedores ya recibidos # Sending methods SendingMethodCATCH=Recogido por el cliente diff --git a/htdocs/langs/es_ES/stocks.lang b/htdocs/langs/es_ES/stocks.lang index 652c750edb2..c45945ede6e 100644 --- a/htdocs/langs/es_ES/stocks.lang +++ b/htdocs/langs/es_ES/stocks.lang @@ -48,8 +48,8 @@ PMPValueShort=PMP EnhancedValueOfWarehouses=Valor de stocks UserWarehouseAutoCreate=Crear automáticamente existencias/almacén propio del usuario en la creación del usuario QtyDispatched=Cantidad recibida -QtyDispatchedShort=Qty dispatched -QtyToDispatchShort=Qty to dispatch +QtyDispatchedShort=Cant. recibida +QtyToDispatchShort=Cant. a enviar OrderDispatch=Recepción de stocks RuleForStockManagementDecrease=Regla de gestión de decrementos de stock RuleForStockManagementIncrease=Regla de gestión de incrementos de stock @@ -61,7 +61,7 @@ ReStockOnValidateOrder=Incrementar los stocks físicos sobre los pedidos a prove ReStockOnDispatchOrder=Incrementa los stocks físicos en el desglose manual de la recepción de los pedidos a proveedores en los almacenes ReStockOnDeleteInvoice=Incrementa los stocks físicos en la eliminación de facturas OrderStatusNotReadyToDispatch=El pedido aún no está o no tiene un estado que permita un desglose de stock. -StockDiffPhysicTeoric=Explanation for difference between physical and theoretical stock +StockDiffPhysicTeoric=Motivo de la diferencia entre valores físicos y teóricos NoPredefinedProductToDispatch=No hay productos predefinidos en este objeto. Por lo tanto no se puede realizar un desglose de stock. DispatchVerb=Validar recepción StockLimitShort=Límite para alerta @@ -118,15 +118,15 @@ MassMovement=Movimientos en masa MassStockMovement=Movimientos de stock en masa SelectProductInAndOutWareHouse=Selecccione un producto, una cantidad, un almacén origen y un almacén destino, seguidamente haga clic "%s". Una vez seleccionados todos los movimientos, haga clic en "%s". RecordMovement=Registrar transferencias -ReceivingForSameOrder=Receipts for this order +ReceivingForSameOrder=Recepciones de este pedido StockMovementRecorded=Movimiento de stock registrado RuleForStockAvailability=Reglas de requerimiento de stock StockMustBeEnoughForInvoice=El nivel de existencias debe ser suficiente para añadir productos/servicios en facturas StockMustBeEnoughForOrder=El nivel de existencias debe ser suficiente para añadir productos/servicios en pedidos StockMustBeEnoughForShipment= El nivel de existencias debe ser suficiente para añadir productos/servicios en envíos -MovementLabel=Label of movement -InventoryCode=Movement or inventory code -IsInPackage=Contained into package -ShowWarehouse=Show warehouse -MovementCorrectStock=Stock content correction for product %s -MovementTransferStock=Stock transfer of product %s into another warehouse +MovementLabel=Etiqueta del movimiento +InventoryCode=Movimiento o código de inventario +IsInPackage=Contenido en el paquete +ShowWarehouse=Mostrar almacén +MovementCorrectStock=Corrección de stock del producto %s +MovementTransferStock=Transferencia de stock del producto %s a otro almacén diff --git a/htdocs/langs/es_ES/suppliers.lang b/htdocs/langs/es_ES/suppliers.lang index 88db48b131a..a7d37289ca7 100644 --- a/htdocs/langs/es_ES/suppliers.lang +++ b/htdocs/langs/es_ES/suppliers.lang @@ -42,5 +42,5 @@ NoneOrBatchFileNeverRan=Ninguno o lote %s no se ha ejecutado recientement SentToSuppliers=Enviado a proveedores ListOfSupplierOrders=Listado de pedidos a proveedor MenuOrdersSupplierToBill=Pedidos a proveedor a facturar -NbDaysToDelivery=Delivery delay in days -DescNbDaysToDelivery=The biggest delay is display among order product list +NbDaysToDelivery=Tiempo de entrega en días +DescNbDaysToDelivery=El plazo mayor se visualiza el el listado de pedidos de productos diff --git a/htdocs/langs/es_ES/withdrawals.lang b/htdocs/langs/es_ES/withdrawals.lang index b1a5531479e..b5e6bd3cdee 100644 --- a/htdocs/langs/es_ES/withdrawals.lang +++ b/htdocs/langs/es_ES/withdrawals.lang @@ -79,7 +79,7 @@ CreditDate=Abonada el WithdrawalFileNotCapable=No es posible generar el fichero bancario de domiciliación para el país %s (El país no está soportado) ShowWithdraw=Ver domiciliación IfInvoiceNeedOnWithdrawPaymentWontBeClosed=Sin embargo, si la factura tiene pendiente algún pago por domiciliación, no será cerrada para permitir la gestión de la domiciliación. -DoStandingOrdersBeforePayments=This tab allows you to request a standing order. Once done, go into menu Bank->Withdrawal to manage the standing order. When standing order is closed, payment on invoice will be automatically recorded, and invoice closed if remainder to pay is null. +DoStandingOrdersBeforePayments=Esta pestaña le permite realizar una petición de domiciliación. Una vez realizadas las peticiones, vaya al menú Bancos->Domiciliaciones para gestionar la domiciliación. Al cerrar una domiciliación, los pagos de las facturas se registrarán automáticamente, y las facturas completamente pagadas serán cerradas. WithdrawalFile=Archivo de la domiciliación SetToStatusSent=Clasificar como "Archivo enviado" ThisWillAlsoAddPaymentOnInvoice=Se crearán los pagos de las facturas y las clasificará como pagadas diff --git a/htdocs/langs/es_ES/workflow.lang b/htdocs/langs/es_ES/workflow.lang index 826ad1eb61e..8f97c568178 100644 --- a/htdocs/langs/es_ES/workflow.lang +++ b/htdocs/langs/es_ES/workflow.lang @@ -1,6 +1,6 @@ # Dolibarr language file - Source file is en_US - admin WorkflowSetup=Configuración del módulo Flujo de trabajo -WorkflowDesc=This module is designed to modify the behaviour of automatic actions into application. By default, workflow is opened (you make thing in order you want). You can activate the automatic actions that you are interesting in. +WorkflowDesc=Este módulo le permite cambiar el comportamiento de las acciones automáticas en la aplicación. De forma predeterminada, el workflow está abierto (configure según sus necesidades). Active las acciones automáticas que le interesen. ThereIsNoWorkflowToModify=No hay workflow modificable para los módulos que tiene activados. descWORKFLOW_PROPAL_AUTOCREATE_ORDER=Crear un pedido de cliente automáticamente a la firma de un presupuesto descWORKFLOW_PROPAL_AUTOCREATE_INVOICE=Crear una factura a cliente automáticamente a la firma de un presupuesto From a67d0f712cbe59c4477378f1f355dc302836a899 Mon Sep 17 00:00:00 2001 From: Juanjo Menent Date: Fri, 27 Feb 2015 18:21:41 +0100 Subject: [PATCH 186/287] Trad: Syncro from transifex --- htdocs/langs/es_ES/accountancy.lang | 6 +++--- htdocs/langs/es_ES/admin.lang | 2 +- htdocs/langs/es_ES/agenda.lang | 2 +- htdocs/langs/es_ES/compta.lang | 2 +- htdocs/langs/es_ES/cron.lang | 4 ++-- htdocs/langs/es_ES/errors.lang | 4 ++-- htdocs/langs/es_ES/orders.lang | 8 ++++---- htdocs/langs/es_ES/productbatch.lang | 10 +++++----- htdocs/langs/es_ES/products.lang | 6 +++--- htdocs/langs/es_ES/projects.lang | 4 ++-- htdocs/langs/es_ES/sendings.lang | 22 +++++++++++----------- htdocs/langs/es_ES/stocks.lang | 20 ++++++++++---------- htdocs/langs/es_ES/suppliers.lang | 4 ++-- htdocs/langs/es_ES/withdrawals.lang | 2 +- htdocs/langs/es_ES/workflow.lang | 2 +- 15 files changed, 49 insertions(+), 49 deletions(-) diff --git a/htdocs/langs/es_ES/accountancy.lang b/htdocs/langs/es_ES/accountancy.lang index 67b6e7e7f4c..487078605dc 100644 --- a/htdocs/langs/es_ES/accountancy.lang +++ b/htdocs/langs/es_ES/accountancy.lang @@ -13,9 +13,9 @@ ConfigAccountingExpert=Configuración del módulo contable Journaux=Diarios JournalFinancial=Diarios financieros Exports=Exportaciones -Export=Export +Export=Exportar Modelcsv=Modelo de exportación -OptionsDeactivatedForThisExportModel=For this export model, options are deactivated +OptionsDeactivatedForThisExportModel=Las opciones están desactivadas para este modelo de exportación Selectmodelcsv=Seleccione un modelo de exportación Modelcsv_normal=Exportación clásica Modelcsv_CEGID=Exportar a Cegid Expert @@ -68,7 +68,7 @@ Lineofinvoice=Línea de la factura VentilatedinAccount=Contabilizada con éxito en la cuenta contable NotVentilatedinAccount=Cuenta sin contabilización en la contabilidad -ACCOUNTING_SEPARATORCSV=Column separator in export file +ACCOUNTING_SEPARATORCSV=Separador de columnas en el archivo de exportación ACCOUNTING_LIMIT_LIST_VENTILATION=Número de elementos a contabilizar que se muestran por página (máximo recomendado: 50) ACCOUNTING_LIST_SORT_VENTILATION_TODO=Ordenar las páginas de contabilización "A contabilizar" por los elementos más recientes diff --git a/htdocs/langs/es_ES/admin.lang b/htdocs/langs/es_ES/admin.lang index e07f8194142..78ce8878190 100644 --- a/htdocs/langs/es_ES/admin.lang +++ b/htdocs/langs/es_ES/admin.lang @@ -1568,4 +1568,4 @@ SalariesSetup=Configuración del módulo salarios SortOrder=Ordenación Format=Formatear TypePaymentDesc=0:Pago cliente,1:Pago proveedor,2:Tanto pago de cliente como de proveedor -IncludePath=Include path (defined into variable %s) +IncludePath=Include path (definida en la variable %s) diff --git a/htdocs/langs/es_ES/agenda.lang b/htdocs/langs/es_ES/agenda.lang index ad9ebcba1b2..64836535194 100644 --- a/htdocs/langs/es_ES/agenda.lang +++ b/htdocs/langs/es_ES/agenda.lang @@ -60,7 +60,7 @@ SupplierOrderSentByEMail=Pedido a proveedor %s enviada por e-mail SupplierInvoiceSentByEMail=Factura de proveedor %s enviada por e-mail ShippingSentByEMail=Expedición %s enviada por email ShippingValidated= Expedición %s validada -InterventionSentByEMail=Intervention %s sent by EMail +InterventionSentByEMail=Intervención %s enviada por e-mail NewCompanyToDolibarr= Tercero creado DateActionPlannedStart= Fecha de inicio prevista DateActionPlannedEnd= Fecha de fin prevista diff --git a/htdocs/langs/es_ES/compta.lang b/htdocs/langs/es_ES/compta.lang index 83e1dc18b6e..45438f35375 100644 --- a/htdocs/langs/es_ES/compta.lang +++ b/htdocs/langs/es_ES/compta.lang @@ -29,7 +29,7 @@ ReportTurnover=Volumen de ventas PaymentsNotLinkedToInvoice=Pagos vinculados a ninguna factura, por lo que ninguún tercero PaymentsNotLinkedToUser=Pagos no vinculados a un usuario Profit=Beneficio -AccountingResult=Accounting result +AccountingResult=Resultado contable Balance=Saldo Debit=Debe Credit=Haber diff --git a/htdocs/langs/es_ES/cron.lang b/htdocs/langs/es_ES/cron.lang index 477deb2e57a..d8d9065c901 100644 --- a/htdocs/langs/es_ES/cron.lang +++ b/htdocs/langs/es_ES/cron.lang @@ -14,8 +14,8 @@ URLToLaunchCronJobs=URL para ejecutar tareas Cron OrToLaunchASpecificJob=O para ejecutar una tarea en concreto KeyForCronAccess=Clave para la URL para ejecutar tareas Cron FileToLaunchCronJobs=Comando para ejecutar tareas Cron -CronExplainHowToRunUnix=On Unix environment you should use the following crontab entry to run the command line each 5 minutes -CronExplainHowToRunWin=On Microsoft(tm) Windows environement you can use Scheduled task tools to run the command line each 5 minutes +CronExplainHowToRunUnix=En entornos Unix se debe utilizar la siguiente entrada crontab para ejecutar el comando cada 5 minutos +CronExplainHowToRunWin=En entornos Microsoft (tm) Windows, puede utilizar las herramienta tareas programadas para ejecutar el comando cada 5 minutos # Menu CronJobs=Tareas programadas CronListActive=Listado de tareas activas/programadas diff --git a/htdocs/langs/es_ES/errors.lang b/htdocs/langs/es_ES/errors.lang index 16715819b76..18ee8a8a9ee 100644 --- a/htdocs/langs/es_ES/errors.lang +++ b/htdocs/langs/es_ES/errors.lang @@ -158,8 +158,8 @@ ErrorPriceExpression21=Resultado '%s' vacío ErrorPriceExpression22=Resultado '%s' negativo ErrorPriceExpressionInternal=Error interno '%s' ErrorPriceExpressionUnknown=Error desconocido '%s' -ErrorSrcAndTargetWarehouseMustDiffers=Source and target warehouses must differs -ErrorTryToMakeMoveOnProductRequiringBatchData=Error, trying to make a stock movement without batch/serial information, on a product requiring batch/serial information +ErrorSrcAndTargetWarehouseMustDiffers=Los almacenes de origen y destino deben de ser diferentes +ErrorTryToMakeMoveOnProductRequiringBatchData=Error, intenta hacer un movimiento de stock sin indicar lote/serie, en un producto que requiere de lote/serie # Warnings WarningMandatorySetupNotComplete=Los parámetros obligatorios de configuración no están todavía definidos diff --git a/htdocs/langs/es_ES/orders.lang b/htdocs/langs/es_ES/orders.lang index ce5b62a9033..895a5c32915 100644 --- a/htdocs/langs/es_ES/orders.lang +++ b/htdocs/langs/es_ES/orders.lang @@ -29,7 +29,7 @@ StatusOrderDraftShort=Borrador StatusOrderValidatedShort=Validado StatusOrderSentShort=Expedición en curso StatusOrderSent=Envío en curso -StatusOrderOnProcessShort=Ordered +StatusOrderOnProcessShort=Pedido StatusOrderProcessedShort=Procesado StatusOrderToBillShort=Emitido StatusOrderToBill2Short=A facturar @@ -41,7 +41,7 @@ StatusOrderReceivedAllShort=Recibido StatusOrderCanceled=Anulado StatusOrderDraft=Borrador (a validar) StatusOrderValidated=Validado -StatusOrderOnProcess=Ordered - Standby reception +StatusOrderOnProcess=Pedido - En espera de recibir StatusOrderProcessed=Procesado StatusOrderToBill=Emitido StatusOrderToBill2=A facturar @@ -50,8 +50,8 @@ StatusOrderRefused=Rechazado StatusOrderReceivedPartially=Recibido parcialmente StatusOrderReceivedAll=Recibido ShippingExist=Existe una expedición -ProductQtyInDraft=Product quantity into draft orders -ProductQtyInDraftOrWaitingApproved=Product quantity into draft or approved orders, not yet ordered +ProductQtyInDraft=Cantidades en pedidos borrador +ProductQtyInDraftOrWaitingApproved=Cantidades en pedidos borrador o aprobados, pero no realizados DraftOrWaitingApproved=Borrador o aprobado aún no controlado DraftOrWaitingShipped=Borrador o validado aún no expedido MenuOrdersToBill=Pedidos a facturar diff --git a/htdocs/langs/es_ES/productbatch.lang b/htdocs/langs/es_ES/productbatch.lang index 194a1ab5a5b..6fa46be9db5 100644 --- a/htdocs/langs/es_ES/productbatch.lang +++ b/htdocs/langs/es_ES/productbatch.lang @@ -1,8 +1,8 @@ # ProductBATCH language file - en_US - ProductBATCH -ManageLotSerial=Use batch/serial number -ProductStatusOnBatch=Yes (Batch/serial required) -ProductStatusNotOnBatch=No (Batch/serial not used) -ProductStatusOnBatchShort=Yes +ManageLotSerial=Usar numeración por lotes/series +ProductStatusOnBatch=Sí (se necesita lote/serie) +ProductStatusNotOnBatch=No (no se usa lote/serie) +ProductStatusOnBatchShort=Sí ProductStatusNotOnBatchShort=No Batch=Lote/Serie atleast1batchfield=Fecha de caducidad o Fecha de venta o Lote @@ -18,4 +18,4 @@ printQty=Cant.: %d AddDispatchBatchLine=Añada una línea para despacho por caducidad BatchDefaultNumber=Indefinido WhenProductBatchModuleOnOptionAreForced=Si el módulo de Lotes/Series está activado, el incremento/decremento de stock es forzado a lo último escogido y no puede editarse. Otras opciones pueden definirse si se necesita -ProductDoesNotUseBatchSerial=This product does not use batch/serial number +ProductDoesNotUseBatchSerial=Este producto no usa numeración por lotes/series diff --git a/htdocs/langs/es_ES/products.lang b/htdocs/langs/es_ES/products.lang index 97ad12c901b..e07e882a1ee 100644 --- a/htdocs/langs/es_ES/products.lang +++ b/htdocs/langs/es_ES/products.lang @@ -22,14 +22,14 @@ ProductAccountancySellCode=Código contable ventas ProductOrService=Producto o servicio ProductsAndServices=Productos y servicios ProductsOrServices=Productos o servicios -ProductsAndServicesOnSell=Products and Services for sale or for purchase -ProductsAndServicesNotOnSell=Products and Services out of sale +ProductsAndServicesOnSell=Productos y Servicios a la venta o en compra +ProductsAndServicesNotOnSell=Productos y Servicios fuera de venta ProductsAndServicesStatistics=Estadísticas productos y servicios ProductsStatistics=Estadísticas productos ProductsOnSell=Producto en venta o en compra ProductsNotOnSell=Producto fuera de venta y fuera de compra ProductsOnSellAndOnBuy=Productos en venta o en compra -ServicesOnSell=Services for sale or for purchase +ServicesOnSell=Servicios a la venta o en compra ServicesNotOnSell=Servicios fuera de venta ServicesOnSellAndOnBuy=Servicios a la venta o en compra InternalRef=Referencia interna diff --git a/htdocs/langs/es_ES/projects.lang b/htdocs/langs/es_ES/projects.lang index ce1af52a955..b17e8892198 100644 --- a/htdocs/langs/es_ES/projects.lang +++ b/htdocs/langs/es_ES/projects.lang @@ -3,7 +3,7 @@ RefProject=Ref. proyecto ProjectId=Id proyecto Project=Proyecto Projects=Proyectos -ProjectStatus=Project status +ProjectStatus=Estado del proyecto SharedProject=Proyecto compartido PrivateProject=Contactos del proyecto MyProjectsDesc=Esta vista muestra aquellos proyectos en los que usted es un contacto afectado (cualquier tipo). @@ -103,7 +103,7 @@ CloneContacts=Clonar los contactos CloneNotes=Clonar las notas CloneProjectFiles=Clonar los archivos adjuntos del proyecto CloneTaskFiles=Clonar los archivos adjuntos de la(s) tarea(s) (si se clonan la(s) tarea(s)) -CloneMoveDate=Update project/tasks dates from now ? +CloneMoveDate=¿Actualizar las fechas de los proyectos/tareas? ConfirmCloneProject=¿Está seguro de querer clonar este proyecto? ProjectReportDate=Cambiar las fechas de las tareas en función de la fecha de inicio del proyecto ErrorShiftTaskDate=Se ha producido un error en el cambio de las fechas de las tareas diff --git a/htdocs/langs/es_ES/sendings.lang b/htdocs/langs/es_ES/sendings.lang index d9e67d7c0e4..cf377a641db 100644 --- a/htdocs/langs/es_ES/sendings.lang +++ b/htdocs/langs/es_ES/sendings.lang @@ -4,8 +4,8 @@ Sending=Envío Sendings=Envíos Shipment=Envío Shipments=Envíos -ShowSending=Show Sending -Receivings=Receipts +ShowSending=Mostrar envío +Receivings=Recepciones SendingsArea=Área envíos ListOfSendings=Listado de envíos SendingMethod=Método de envío @@ -15,7 +15,7 @@ SearchASending=Buscar envío StatisticsOfSendings=Estadísticas de envíos NbOfSendings=Número de envíos NumberOfShipmentsByMonth=Número de envíos por mes -SendingCard=Shipment card +SendingCard=Ficha envío NewSending=Nuevo envío CreateASending=Crear un envío CreateSending=Crear envío @@ -38,7 +38,7 @@ StatusSendingCanceledShort=Anulado StatusSendingDraftShort=Borrador StatusSendingValidatedShort=Validado StatusSendingProcessedShort=Procesado -SendingSheet=Shipment sheet +SendingSheet=Nota de entrega Carriers=Transportistas Carrier=Transportista CarriersArea=Área transportistas @@ -59,15 +59,15 @@ SendShippingRef=Envío de la expedición %s ActionsOnShipping=Eventos sobre la expedición LinkToTrackYourPackage=Enlace para el seguimento de su paquete ShipmentCreationIsDoneFromOrder=De momento, la creación de una nueva expedición se realiza desde la ficha de pedido. -RelatedShippings=Related shipments +RelatedShippings=Expediciones asociadas ShipmentLine=Línea de expedición CarrierList=Listado de transportistas -SendingRunning=Product from ordered customer orders -SuppliersReceiptRunning=Product from ordered supplier orders -ProductQtyInCustomersOrdersRunning=Product quantity into opened customers orders -ProductQtyInSuppliersOrdersRunning=Product quantity into opened suppliers orders -ProductQtyInShipmentAlreadySent=Product quantity from opended customer order already sent -ProductQtyInSuppliersShipmentAlreadyRecevied=Product quantity from opened supplier order already received +SendingRunning=Producto de pedidos de clientes +SuppliersReceiptRunning=Producto de pedidos a proveedores +ProductQtyInCustomersOrdersRunning=Cantidad en pedidos de clientes abiertos +ProductQtyInSuppliersOrdersRunning=Cantidad en pedidos a proveedores abiertos +ProductQtyInShipmentAlreadySent=Cantidad en pedidos de clientes ya enviados +ProductQtyInSuppliersShipmentAlreadyRecevied=Cantidad en pedidos a proveedores ya recibidos # Sending methods SendingMethodCATCH=Recogido por el cliente diff --git a/htdocs/langs/es_ES/stocks.lang b/htdocs/langs/es_ES/stocks.lang index 652c750edb2..c45945ede6e 100644 --- a/htdocs/langs/es_ES/stocks.lang +++ b/htdocs/langs/es_ES/stocks.lang @@ -48,8 +48,8 @@ PMPValueShort=PMP EnhancedValueOfWarehouses=Valor de stocks UserWarehouseAutoCreate=Crear automáticamente existencias/almacén propio del usuario en la creación del usuario QtyDispatched=Cantidad recibida -QtyDispatchedShort=Qty dispatched -QtyToDispatchShort=Qty to dispatch +QtyDispatchedShort=Cant. recibida +QtyToDispatchShort=Cant. a enviar OrderDispatch=Recepción de stocks RuleForStockManagementDecrease=Regla de gestión de decrementos de stock RuleForStockManagementIncrease=Regla de gestión de incrementos de stock @@ -61,7 +61,7 @@ ReStockOnValidateOrder=Incrementar los stocks físicos sobre los pedidos a prove ReStockOnDispatchOrder=Incrementa los stocks físicos en el desglose manual de la recepción de los pedidos a proveedores en los almacenes ReStockOnDeleteInvoice=Incrementa los stocks físicos en la eliminación de facturas OrderStatusNotReadyToDispatch=El pedido aún no está o no tiene un estado que permita un desglose de stock. -StockDiffPhysicTeoric=Explanation for difference between physical and theoretical stock +StockDiffPhysicTeoric=Motivo de la diferencia entre valores físicos y teóricos NoPredefinedProductToDispatch=No hay productos predefinidos en este objeto. Por lo tanto no se puede realizar un desglose de stock. DispatchVerb=Validar recepción StockLimitShort=Límite para alerta @@ -118,15 +118,15 @@ MassMovement=Movimientos en masa MassStockMovement=Movimientos de stock en masa SelectProductInAndOutWareHouse=Selecccione un producto, una cantidad, un almacén origen y un almacén destino, seguidamente haga clic "%s". Una vez seleccionados todos los movimientos, haga clic en "%s". RecordMovement=Registrar transferencias -ReceivingForSameOrder=Receipts for this order +ReceivingForSameOrder=Recepciones de este pedido StockMovementRecorded=Movimiento de stock registrado RuleForStockAvailability=Reglas de requerimiento de stock StockMustBeEnoughForInvoice=El nivel de existencias debe ser suficiente para añadir productos/servicios en facturas StockMustBeEnoughForOrder=El nivel de existencias debe ser suficiente para añadir productos/servicios en pedidos StockMustBeEnoughForShipment= El nivel de existencias debe ser suficiente para añadir productos/servicios en envíos -MovementLabel=Label of movement -InventoryCode=Movement or inventory code -IsInPackage=Contained into package -ShowWarehouse=Show warehouse -MovementCorrectStock=Stock content correction for product %s -MovementTransferStock=Stock transfer of product %s into another warehouse +MovementLabel=Etiqueta del movimiento +InventoryCode=Movimiento o código de inventario +IsInPackage=Contenido en el paquete +ShowWarehouse=Mostrar almacén +MovementCorrectStock=Corrección de stock del producto %s +MovementTransferStock=Transferencia de stock del producto %s a otro almacén diff --git a/htdocs/langs/es_ES/suppliers.lang b/htdocs/langs/es_ES/suppliers.lang index 88db48b131a..a7d37289ca7 100644 --- a/htdocs/langs/es_ES/suppliers.lang +++ b/htdocs/langs/es_ES/suppliers.lang @@ -42,5 +42,5 @@ NoneOrBatchFileNeverRan=Ninguno o lote %s no se ha ejecutado recientement SentToSuppliers=Enviado a proveedores ListOfSupplierOrders=Listado de pedidos a proveedor MenuOrdersSupplierToBill=Pedidos a proveedor a facturar -NbDaysToDelivery=Delivery delay in days -DescNbDaysToDelivery=The biggest delay is display among order product list +NbDaysToDelivery=Tiempo de entrega en días +DescNbDaysToDelivery=El plazo mayor se visualiza el el listado de pedidos de productos diff --git a/htdocs/langs/es_ES/withdrawals.lang b/htdocs/langs/es_ES/withdrawals.lang index b1a5531479e..b5e6bd3cdee 100644 --- a/htdocs/langs/es_ES/withdrawals.lang +++ b/htdocs/langs/es_ES/withdrawals.lang @@ -79,7 +79,7 @@ CreditDate=Abonada el WithdrawalFileNotCapable=No es posible generar el fichero bancario de domiciliación para el país %s (El país no está soportado) ShowWithdraw=Ver domiciliación IfInvoiceNeedOnWithdrawPaymentWontBeClosed=Sin embargo, si la factura tiene pendiente algún pago por domiciliación, no será cerrada para permitir la gestión de la domiciliación. -DoStandingOrdersBeforePayments=This tab allows you to request a standing order. Once done, go into menu Bank->Withdrawal to manage the standing order. When standing order is closed, payment on invoice will be automatically recorded, and invoice closed if remainder to pay is null. +DoStandingOrdersBeforePayments=Esta pestaña le permite realizar una petición de domiciliación. Una vez realizadas las peticiones, vaya al menú Bancos->Domiciliaciones para gestionar la domiciliación. Al cerrar una domiciliación, los pagos de las facturas se registrarán automáticamente, y las facturas completamente pagadas serán cerradas. WithdrawalFile=Archivo de la domiciliación SetToStatusSent=Clasificar como "Archivo enviado" ThisWillAlsoAddPaymentOnInvoice=Se crearán los pagos de las facturas y las clasificará como pagadas diff --git a/htdocs/langs/es_ES/workflow.lang b/htdocs/langs/es_ES/workflow.lang index 826ad1eb61e..8f97c568178 100644 --- a/htdocs/langs/es_ES/workflow.lang +++ b/htdocs/langs/es_ES/workflow.lang @@ -1,6 +1,6 @@ # Dolibarr language file - Source file is en_US - admin WorkflowSetup=Configuración del módulo Flujo de trabajo -WorkflowDesc=This module is designed to modify the behaviour of automatic actions into application. By default, workflow is opened (you make thing in order you want). You can activate the automatic actions that you are interesting in. +WorkflowDesc=Este módulo le permite cambiar el comportamiento de las acciones automáticas en la aplicación. De forma predeterminada, el workflow está abierto (configure según sus necesidades). Active las acciones automáticas que le interesen. ThereIsNoWorkflowToModify=No hay workflow modificable para los módulos que tiene activados. descWORKFLOW_PROPAL_AUTOCREATE_ORDER=Crear un pedido de cliente automáticamente a la firma de un presupuesto descWORKFLOW_PROPAL_AUTOCREATE_INVOICE=Crear una factura a cliente automáticamente a la firma de un presupuesto From 8e26c71fa77a4ee93b86da199904f5a519bb2ab5 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 28 Feb 2015 04:59:27 +0100 Subject: [PATCH 187/287] Rewrite code for supplier order and invoice to use shared code of customer supplier and invoice. Work on extrafield for supplier order and invoice. --- htdocs/comm/propal.php | 12 +- htdocs/comm/propal/class/propal.class.php | 16 +-- htdocs/commande/card.php | 16 ++- htdocs/commande/class/commande.class.php | 18 +-- htdocs/compta/facture.php | 12 +- htdocs/compta/facture/class/facture.class.php | 16 +-- htdocs/contrat/card.php | 20 +-- htdocs/contrat/class/contrat.class.php | 32 ++--- htdocs/core/actions_lineupdown.inc.php | 73 +++++++++++ htdocs/fichinter/card.php | 20 +-- htdocs/fichinter/class/fichinter.class.php | 8 +- .../class/fournisseur.commande.class.php | 90 +++++++------ .../fourn/class/fournisseur.facture.class.php | 28 +++-- htdocs/fourn/commande/card.php | 118 ++++++++++-------- htdocs/fourn/facture/card.php | 68 ++++++---- 15 files changed, 334 insertions(+), 213 deletions(-) create mode 100644 htdocs/core/actions_lineupdown.inc.php diff --git a/htdocs/comm/propal.php b/htdocs/comm/propal.php index 430f71ae540..104c0215c2f 100644 --- a/htdocs/comm/propal.php +++ b/htdocs/comm/propal.php @@ -435,12 +435,12 @@ if (empty($reshook)) // Extrafields if (empty($conf->global->MAIN_EXTRAFIELDS_DISABLED) && method_exists($lines[$i], 'fetch_optionals')) { $lines[$i]->fetch_optionals($lines[$i]->rowid); - $array_option = $lines[$i]->array_options; + $array_options = $lines[$i]->array_options; } $tva_tx=get_default_tva($mysoc, $object->thirdparty); - $result = $object->addline($desc, $lines[$i]->subprice, $lines[$i]->qty, $tva_tx, $lines[$i]->localtax1_tx, $lines[$i]->localtax2_tx, $lines[$i]->fk_product, $lines[$i]->remise_percent, 'HT', 0, $lines[$i]->info_bits, $product_type, $lines[$i]->rang, $lines[$i]->special_code, $fk_parent_line, $lines[$i]->fk_fournprice, $lines[$i]->pa_ht, $label, $date_start, $date_end, $array_option); + $result = $object->addline($desc, $lines[$i]->subprice, $lines[$i]->qty, $tva_tx, $lines[$i]->localtax1_tx, $lines[$i]->localtax2_tx, $lines[$i]->fk_product, $lines[$i]->remise_percent, 'HT', 0, $lines[$i]->info_bits, $product_type, $lines[$i]->rang, $lines[$i]->special_code, $fk_parent_line, $lines[$i]->fk_fournprice, $lines[$i]->pa_ht, $label, $date_start, $date_end, $array_options); if ($result > 0) { $lineid = $result; @@ -652,7 +652,7 @@ if (empty($reshook)) // Extrafields $extrafieldsline = new ExtraFields($db); $extralabelsline = $extrafieldsline->fetch_name_optionals_label($object->table_element_line); - $array_option = $extrafieldsline->getOptionalsFromPost($extralabelsline, $predef); + $array_options = $extrafieldsline->getOptionalsFromPost($extralabelsline, $predef); // Unset extrafield if (is_array($extralabelsline)) { // Get extra fields @@ -812,7 +812,7 @@ if (empty($reshook)) setEventMessage($mesg, 'errors'); } else { // Insert line - $result = $object->addline($desc, $pu_ht, $qty, $tva_tx, $localtax1_tx, $localtax2_tx, $idprod, $remise_percent, $price_base_type, $pu_ttc, $info_bits, $type, - 1, 0, GETPOST('fk_parent_line'), $fournprice, $buyingprice, $label, $date_start, $date_end, $array_option); + $result = $object->addline($desc, $pu_ht, $qty, $tva_tx, $localtax1_tx, $localtax2_tx, $idprod, $remise_percent, $price_base_type, $pu_ttc, $info_bits, $type, - 1, 0, GETPOST('fk_parent_line'), $fournprice, $buyingprice, $label, $date_start, $date_end, $array_options); if ($result > 0) { $db->commit(); @@ -895,7 +895,7 @@ if (empty($reshook)) // Extrafields $extrafieldsline = new ExtraFields($db); $extralabelsline = $extrafieldsline->fetch_name_optionals_label($object->table_element_line); - $array_option = $extrafieldsline->getOptionalsFromPost($extralabelsline); + $array_options = $extrafieldsline->getOptionalsFromPost($extralabelsline); // Unset extrafield if (is_array($extralabelsline)) { // Get extra fields @@ -940,7 +940,7 @@ if (empty($reshook)) if (! $error) { $db->begin(); - $result = $object->updateline(GETPOST('lineid'), $pu_ht, GETPOST('qty'), GETPOST('remise_percent'), $vat_rate, $localtax1_rate, $localtax2_rate, $description, 'HT', $info_bits, $special_code, GETPOST('fk_parent_line'), 0, $fournprice, $buyingprice, $label, $type, $date_start, $date_end, $array_option); + $result = $object->updateline(GETPOST('lineid'), $pu_ht, GETPOST('qty'), GETPOST('remise_percent'), $vat_rate, $localtax1_rate, $localtax2_rate, $description, 'HT', $info_bits, $special_code, GETPOST('fk_parent_line'), 0, $fournprice, $buyingprice, $label, $type, $date_start, $date_end, $array_options); if ($result >= 0) { $db->commit(); diff --git a/htdocs/comm/propal/class/propal.class.php b/htdocs/comm/propal/class/propal.class.php index dc1184b7490..189c6101594 100644 --- a/htdocs/comm/propal/class/propal.class.php +++ b/htdocs/comm/propal/class/propal.class.php @@ -314,12 +314,12 @@ class Propal extends CommonObject * @param string $label ??? * @param int $date_start Start date of the line * @param int $date_end End date of the line - * @param array $array_option extrafields array + * @param array $array_options extrafields array * @return int >0 if OK, <0 if KO * * @see add_product */ - function addline($desc, $pu_ht, $qty, $txtva, $txlocaltax1=0.0, $txlocaltax2=0.0, $fk_product=0, $remise_percent=0.0, $price_base_type='HT', $pu_ttc=0.0, $info_bits=0, $type=0, $rang=-1, $special_code=0, $fk_parent_line=0, $fk_fournprice=0, $pa_ht=0, $label='',$date_start='', $date_end='',$array_option=0) + function addline($desc, $pu_ht, $qty, $txtva, $txlocaltax1=0.0, $txlocaltax2=0.0, $fk_product=0, $remise_percent=0.0, $price_base_type='HT', $pu_ttc=0.0, $info_bits=0, $type=0, $rang=-1, $special_code=0, $fk_parent_line=0, $fk_fournprice=0, $pa_ht=0, $label='',$date_start='', $date_end='',$array_options=0) { global $mysoc; @@ -440,8 +440,8 @@ class Propal extends CommonObject $this->line->price=$price; $this->line->remise=$remise; - if (is_array($array_option) && count($array_option)>0) { - $this->line->array_options=$array_option; + if (is_array($array_options) && count($array_options)>0) { + $this->line->array_options=$array_options; } $result=$this->line->insert(); @@ -496,10 +496,10 @@ class Propal extends CommonObject * @param int $type 0/1=Product/service * @param int $date_start Start date of the line * @param int $date_end End date of the line - * @param array $array_option extrafields array + * @param array $array_options extrafields array * @return int 0 if OK, <0 if KO */ - function updateline($rowid, $pu, $qty, $remise_percent, $txtva, $txlocaltax1=0.0, $txlocaltax2=0.0, $desc='', $price_base_type='HT', $info_bits=0, $special_code=0, $fk_parent_line=0, $skip_update_total=0, $fk_fournprice=0, $pa_ht=0, $label='', $type=0, $date_start='', $date_end='', $array_option=0) + function updateline($rowid, $pu, $qty, $remise_percent, $txtva, $txlocaltax1=0.0, $txlocaltax2=0.0, $desc='', $price_base_type='HT', $info_bits=0, $special_code=0, $fk_parent_line=0, $skip_update_total=0, $fk_fournprice=0, $pa_ht=0, $label='', $type=0, $date_start='', $date_end='', $array_options=0) { global $mysoc; @@ -601,8 +601,8 @@ class Propal extends CommonObject $this->line->price=$price; $this->line->remise=$remise; - if (is_array($array_option) && count($array_option)>0) { - $this->line->array_options=$array_option; + if (is_array($array_options) && count($array_options)>0) { + $this->line->array_options=$array_options; } $result=$this->line->update(); diff --git a/htdocs/commande/card.php b/htdocs/commande/card.php index 6696dffed21..5f57170eef5 100644 --- a/htdocs/commande/card.php +++ b/htdocs/commande/card.php @@ -343,10 +343,10 @@ if (empty($reshook)) // trigger used { $lines[$i]->fetch_optionals($lines[$i]->rowid); - $array_option = $lines[$i]->array_options; + $array_options = $lines[$i]->array_options; } - $result = $object->addline($desc, $lines[$i]->subprice, $lines[$i]->qty, $lines[$i]->tva_tx, $lines[$i]->localtax1_tx, $lines[$i]->localtax2_tx, $lines[$i]->fk_product, $lines[$i]->remise_percent, $lines[$i]->info_bits, $lines[$i]->fk_remise_except, 'HT', 0, $date_start, $date_end, $product_type, $lines[$i]->rang, $lines[$i]->special_code, $fk_parent_line, $lines[$i]->fk_fournprice, $lines[$i]->pa_ht, $label, $array_option); + $result = $object->addline($desc, $lines[$i]->subprice, $lines[$i]->qty, $lines[$i]->tva_tx, $lines[$i]->localtax1_tx, $lines[$i]->localtax2_tx, $lines[$i]->fk_product, $lines[$i]->remise_percent, $lines[$i]->info_bits, $lines[$i]->fk_remise_except, 'HT', 0, $date_start, $date_end, $product_type, $lines[$i]->rang, $lines[$i]->special_code, $fk_parent_line, $lines[$i]->fk_fournprice, $lines[$i]->pa_ht, $label, $array_options); if ($result < 0) { $error ++; @@ -561,7 +561,7 @@ if (empty($reshook)) // Extrafields $extrafieldsline = new ExtraFields($db); $extralabelsline = $extrafieldsline->fetch_name_optionals_label($object->table_element_line); - $array_option = $extrafieldsline->getOptionalsFromPost($extralabelsline, $predef); + $array_options = $extrafieldsline->getOptionalsFromPost($extralabelsline, $predef); // Unset extrafield if (is_array($extralabelsline)) { // Get extra fields @@ -734,7 +734,7 @@ if (empty($reshook)) setEventMessage($mesg, 'errors'); } else { // Insert line - $result = $object->addline($desc, $pu_ht, $qty, $tva_tx, $localtax1_tx, $localtax2_tx, $idprod, $remise_percent, $info_bits, 0, $price_base_type, $pu_ttc, $date_start, $date_end, $type, - 1, 0, GETPOST('fk_parent_line'), $fournprice, $buyingprice, $label, $array_option); + $result = $object->addline($desc, $pu_ht, $qty, $tva_tx, $localtax1_tx, $localtax2_tx, $idprod, $remise_percent, $info_bits, 0, $price_base_type, $pu_ttc, $date_start, $date_end, $type, - 1, 0, GETPOST('fk_parent_line'), $fournprice, $buyingprice, $label, $array_options); if ($result > 0) { $ret = $object->fetch($object->id); // Reload to get new records @@ -821,7 +821,7 @@ if (empty($reshook)) // Extrafields Lines $extrafieldsline = new ExtraFields($db); $extralabelsline = $extrafieldsline->fetch_name_optionals_label($object->table_element_line); - $array_option = $extrafieldsline->getOptionalsFromPost($extralabelsline); + $array_options = $extrafieldsline->getOptionalsFromPost($extralabelsline); // Unset extrafield POST Data if (is_array($extralabelsline)) { foreach ($extralabelsline as $key => $value) { @@ -859,7 +859,7 @@ if (empty($reshook)) } if (! $error) { - $result = $object->updateline(GETPOST('lineid'), $description, $pu_ht, GETPOST('qty'), GETPOST('remise_percent'), $vat_rate, $localtax1_rate, $localtax2_rate, 'HT', $info_bits, $date_start, $date_end, $type, GETPOST('fk_parent_line'), 0, $fournprice, $buyingprice, $label, 0, $array_option); + $result = $object->updateline(GETPOST('lineid'), $description, $pu_ht, GETPOST('qty'), GETPOST('remise_percent'), $vat_rate, $localtax1_rate, $localtax2_rate, 'HT', $info_bits, $date_start, $date_end, $type, GETPOST('fk_parent_line'), 0, $fournprice, $buyingprice, $label, 0, $array_options); if ($result >= 0) { if (empty($conf->global->MAIN_DISABLE_PDF_AUTOUPDATE)) { @@ -1687,9 +1687,7 @@ if ($action == 'create' && $user->rights->commande->creer) $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"] . '?id=' . $object->id, $langs->trans('Cancel'), $text, 'confirm_cancel', $formquestion, 0, 1); } - /* - * Confirmation de la suppression d'une ligne produit - */ + // Confirmation to delete line if ($action == 'ask_deleteline') { $formconfirm=$form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id.'&lineid='.$lineid, $langs->trans('DeleteProductLine'), $langs->trans('ConfirmDeleteProductLine'), 'confirm_deleteline', '', 0, 1); diff --git a/htdocs/commande/class/commande.class.php b/htdocs/commande/class/commande.class.php index 1817ea4a992..c1c0fa9ec4e 100644 --- a/htdocs/commande/class/commande.class.php +++ b/htdocs/commande/class/commande.class.php @@ -1101,7 +1101,7 @@ class Commande extends CommonOrder * @param int $fk_fournprice Id supplier price * @param int $pa_ht Buying price (without tax) * @param string $label Label - * @param array $array_option extrafields array + * @param array $array_options extrafields array * @return int >0 if OK, <0 if KO * * @see add_product @@ -1111,7 +1111,7 @@ class Commande extends CommonOrder * par l'appelant par la methode get_default_tva(societe_vendeuse,societe_acheteuse,produit) * et le desc doit deja avoir la bonne valeur (a l'appelant de gerer le multilangue) */ - function addline($desc, $pu_ht, $qty, $txtva, $txlocaltax1=0, $txlocaltax2=0, $fk_product=0, $remise_percent=0, $info_bits=0, $fk_remise_except=0, $price_base_type='HT', $pu_ttc=0, $date_start='', $date_end='', $type=0, $rang=-1, $special_code=0, $fk_parent_line=0, $fk_fournprice=null, $pa_ht=0, $label='',$array_option=0) + function addline($desc, $pu_ht, $qty, $txtva, $txlocaltax1=0, $txlocaltax2=0, $fk_product=0, $remise_percent=0, $info_bits=0, $fk_remise_except=0, $price_base_type='HT', $pu_ttc=0, $date_start='', $date_end='', $type=0, $rang=-1, $special_code=0, $fk_parent_line=0, $fk_fournprice=null, $pa_ht=0, $label='',$array_options=0) { global $mysoc, $conf, $langs; @@ -1250,8 +1250,8 @@ class Commande extends CommonOrder $this->line->price=$price; $this->line->remise=$remise; - if (is_array($array_option) && count($array_option)>0) { - $this->line->array_options=$array_option; + if (is_array($array_options) && count($array_options)>0) { + $this->line->array_options=$array_options; } $result=$this->line->insert(); @@ -2346,10 +2346,10 @@ class Commande extends CommonOrder * @param int $pa_ht Price (without tax) of product when it was bought * @param string $label Label * @param int $special_code Special code (also used by externals modules!) - * @param array $array_option extrafields array + * @param array $array_options extrafields array * @return int < 0 if KO, > 0 if OK */ - function updateline($rowid, $desc, $pu, $qty, $remise_percent, $txtva, $txlocaltax1=0.0,$txlocaltax2=0.0, $price_base_type='HT', $info_bits=0, $date_start='', $date_end='', $type=0, $fk_parent_line=0, $skip_update_total=0, $fk_fournprice=null, $pa_ht=0, $label='', $special_code=0, $array_option=0) + function updateline($rowid, $desc, $pu, $qty, $remise_percent, $txtva, $txlocaltax1=0.0,$txlocaltax2=0.0, $price_base_type='HT', $info_bits=0, $date_start='', $date_end='', $type=0, $fk_parent_line=0, $skip_update_total=0, $fk_fournprice=null, $pa_ht=0, $label='', $special_code=0, $array_options=0) { global $conf, $mysoc; @@ -2458,8 +2458,8 @@ class Commande extends CommonOrder $this->line->price=$price; $this->line->remise=$remise; - if (is_array($array_option) && count($array_option)>0) { - $this->line->array_options=$array_option; + if (is_array($array_options) && count($array_options)>0) { + $this->line->array_options=$array_options; } $result=$this->line->update(); @@ -3516,7 +3516,7 @@ class OrderLine extends CommonOrderLine } } - if (! $notrigger) + if (! $error && ! $notrigger) { // Call trigger $result=$this->call_trigger('LINEORDER_INSERT',$user); diff --git a/htdocs/compta/facture.php b/htdocs/compta/facture.php index dd440c6d547..fa7f50c0628 100644 --- a/htdocs/compta/facture.php +++ b/htdocs/compta/facture.php @@ -1061,10 +1061,10 @@ if (empty($reshook)) // Extrafields if (empty($conf->global->MAIN_EXTRAFIELDS_DISABLED) && method_exists($lines[$i], 'fetch_optionals')) { $lines[$i]->fetch_optionals($lines[$i]->rowid); - $array_option = $lines[$i]->array_options; + $array_options = $lines[$i]->array_options; } - $result = $object->addline($desc, $lines[$i]->subprice, $lines[$i]->qty, $lines[$i]->tva_tx, $lines[$i]->localtax1_tx, $lines[$i]->localtax2_tx, $lines[$i]->fk_product, $lines[$i]->remise_percent, $date_start, $date_end, 0, $lines[$i]->info_bits, $lines[$i]->fk_remise_except, 'HT', 0, $product_type, $lines[$i]->rang, $lines[$i]->special_code, $object->origin, $lines[$i]->rowid, $fk_parent_line, $lines[$i]->fk_fournprice, $lines[$i]->pa_ht, $label, $array_option, $lines[$i]->situation_percent, $lines[$i]->fk_prev_id); + $result = $object->addline($desc, $lines[$i]->subprice, $lines[$i]->qty, $lines[$i]->tva_tx, $lines[$i]->localtax1_tx, $lines[$i]->localtax2_tx, $lines[$i]->fk_product, $lines[$i]->remise_percent, $date_start, $date_end, 0, $lines[$i]->info_bits, $lines[$i]->fk_remise_except, 'HT', 0, $product_type, $lines[$i]->rang, $lines[$i]->special_code, $object->origin, $lines[$i]->rowid, $fk_parent_line, $lines[$i]->fk_fournprice, $lines[$i]->pa_ht, $label, $array_options, $lines[$i]->situation_percent, $lines[$i]->fk_prev_id); if ($result > 0) { $lineid = $result; @@ -1196,7 +1196,7 @@ if (empty($reshook)) // Extrafields $extrafieldsline = new ExtraFields($db); $extralabelsline = $extrafieldsline->fetch_name_optionals_label($object->table_element_line); - $array_option = $extrafieldsline->getOptionalsFromPost($extralabelsline, $predef); + $array_options = $extrafieldsline->getOptionalsFromPost($extralabelsline, $predef); // Unset extrafield if (is_array($extralabelsline)) { // Get extra fields @@ -1374,7 +1374,7 @@ if (empty($reshook)) setEventMessage($mesg, 'errors'); } else { // Insert line - $result = $object->addline($desc, $pu_ht, $qty, $tva_tx, $localtax1_tx, $localtax2_tx, $idprod, $remise_percent, $date_start, $date_end, 0, $info_bits, '', $price_base_type, $pu_ttc, $type, - 1, $special_code, '', 0, GETPOST('fk_parent_line'), $fournprice, $buyingprice, $label, $array_option, $_POST['progress']); + $result = $object->addline($desc, $pu_ht, $qty, $tva_tx, $localtax1_tx, $localtax2_tx, $idprod, $remise_percent, $date_start, $date_end, 0, $info_bits, '', $price_base_type, $pu_ttc, $type, - 1, $special_code, '', 0, GETPOST('fk_parent_line'), $fournprice, $buyingprice, $label, $array_options, $_POST['progress']); if ($result > 0) { @@ -1469,7 +1469,7 @@ if (empty($reshook)) // Extrafields $extrafieldsline = new ExtraFields($db); $extralabelsline = $extrafieldsline->fetch_name_optionals_label($object->table_element_line); - $array_option = $extrafieldsline->getOptionalsFromPost($extralabelsline); + $array_options = $extrafieldsline->getOptionalsFromPost($extralabelsline); // Unset extrafield if (is_array($extralabelsline)) { // Get extra fields @@ -1528,7 +1528,7 @@ if (empty($reshook)) // Update line if (! $error) { - $result = $object->updateline(GETPOST('lineid'), $description, $pu_ht, $qty, GETPOST('remise_percent'), $date_start, $date_end, $vat_rate, $localtax1_rate, $localtax2_rate, 'HT', $info_bits, $type, GETPOST('fk_parent_line'), 0, $fournprice, $buyingprice, $label, 0, $array_option, GETPOST('progress')); + $result = $object->updateline(GETPOST('lineid'), $description, $pu_ht, $qty, GETPOST('remise_percent'), $date_start, $date_end, $vat_rate, $localtax1_rate, $localtax2_rate, 'HT', $info_bits, $type, GETPOST('fk_parent_line'), 0, $fournprice, $buyingprice, $label, 0, $array_options, GETPOST('progress')); if ($result >= 0) { if (empty($conf->global->MAIN_DISABLE_PDF_AUTOUPDATE)) { diff --git a/htdocs/compta/facture/class/facture.class.php b/htdocs/compta/facture/class/facture.class.php index 0c277014a64..4fbdddd5703 100644 --- a/htdocs/compta/facture/class/facture.class.php +++ b/htdocs/compta/facture/class/facture.class.php @@ -2034,12 +2034,12 @@ class Facture extends CommonInvoice * @param int $fk_fournprice Supplier price id (to calculate margin) or '' * @param int $pa_ht Buying price of line (to calculate margin) or '' * @param string $label Label of the line (deprecated, do not use) - * @param array $array_option extrafields array + * @param array $array_options extrafields array * @param int $situation_percent Situation advance percentage * @param int $fk_prev_id Previous situation line id reference * @return int <0 if KO, Id of line if OK */ - function addline($desc, $pu_ht, $qty, $txtva, $txlocaltax1=0, $txlocaltax2=0, $fk_product=0, $remise_percent=0, $date_start='', $date_end='', $ventil=0, $info_bits=0, $fk_remise_except='', $price_base_type='HT', $pu_ttc=0, $type=self::TYPE_STANDARD, $rang=-1, $special_code=0, $origin='', $origin_id=0, $fk_parent_line=0, $fk_fournprice=null, $pa_ht=0, $label='', $array_option=0, $situation_percent=100, $fk_prev_id='') + function addline($desc, $pu_ht, $qty, $txtva, $txlocaltax1=0, $txlocaltax2=0, $fk_product=0, $remise_percent=0, $date_start='', $date_end='', $ventil=0, $info_bits=0, $fk_remise_except='', $price_base_type='HT', $pu_ttc=0, $type=self::TYPE_STANDARD, $rang=-1, $special_code=0, $origin='', $origin_id=0, $fk_parent_line=0, $fk_fournprice=null, $pa_ht=0, $label='', $array_options=0, $situation_percent=100, $fk_prev_id='') { global $mysoc, $conf, $langs; @@ -2162,8 +2162,8 @@ class Facture extends CommonInvoice $this->line->fk_fournprice = $fk_fournprice; $this->line->pa_ht = $pa_ht; - if (is_array($array_option) && count($array_option)>0) { - $this->line->array_options=$array_option; + if (is_array($array_options) && count($array_options)>0) { + $this->line->array_options=$array_options; } $result=$this->line->insert(); @@ -2217,11 +2217,11 @@ class Facture extends CommonInvoice * @param int $pa_ht Price (without tax) of product when it was bought * @param string $label Label of the line (deprecated, do not use) * @param int $special_code Special code (also used by externals modules!) - * @param array $array_option extrafields array + * @param array $array_options extrafields array * @param int $situation_percent Situation advance percentage * @return int < 0 if KO, > 0 if OK */ - function updateline($rowid, $desc, $pu, $qty, $remise_percent, $date_start, $date_end, $txtva, $txlocaltax1=0, $txlocaltax2=0, $price_base_type='HT', $info_bits=0, $type= self::TYPE_STANDARD, $fk_parent_line=0, $skip_update_total=0, $fk_fournprice=null, $pa_ht=0, $label='', $special_code=0, $array_option=0, $situation_percent=0) + function updateline($rowid, $desc, $pu, $qty, $remise_percent, $date_start, $date_end, $txtva, $txlocaltax1=0, $txlocaltax2=0, $price_base_type='HT', $info_bits=0, $type= self::TYPE_STANDARD, $fk_parent_line=0, $skip_update_total=0, $fk_fournprice=null, $pa_ht=0, $label='', $special_code=0, $array_options=0, $situation_percent=0) { include_once DOL_DOCUMENT_ROOT.'/core/lib/price.lib.php'; @@ -2322,8 +2322,8 @@ class Facture extends CommonInvoice } $this->line->pa_ht = $pa_ht; - if (is_array($array_option) && count($array_option)>0) { - $this->line->array_options=$array_option; + if (is_array($array_options) && count($array_options)>0) { + $this->line->array_options=$array_options; } $result=$this->line->update(); diff --git a/htdocs/contrat/card.php b/htdocs/contrat/card.php index 3948418312f..2674d30c57d 100644 --- a/htdocs/contrat/card.php +++ b/htdocs/contrat/card.php @@ -84,7 +84,7 @@ if ($id > 0 || ! empty($ref)) { // fetch optionals attributes and labels $extralabels = $extrafields->fetch_name_optionals_label($object->table_element); -// fetch optionals attributes lines and labels +// fetch optionals attributes lines and labels $extrafieldsline = new ExtraFields($db); $extralabelslines=$extrafieldsline->fetch_name_optionals_label($object->table_element_line); @@ -416,7 +416,7 @@ else if ($action == 'addline' && $user->rights->contrat->creer) // Extrafields $extrafieldsline = new ExtraFields($db); $extralabelsline = $extrafieldsline->fetch_name_optionals_label($object->table_element_line); - $array_option = $extrafieldsline->getOptionalsFromPost($extralabelsline, $predef); + $array_options = $extrafieldsline->getOptionalsFromPost($extralabelsline, $predef); // Unset extrafield if (is_array($extralabelsline)) { // Get extra fields @@ -538,7 +538,7 @@ else if ($action == 'addline' && $user->rights->contrat->creer) $info_bits, $fk_fournprice, $pa_ht, - $array_option + $array_options ); } @@ -638,9 +638,9 @@ else if ($action == 'updateligne' && $user->rights->contrat->creer && ! GETPOST( // Extrafields $extrafieldsline = new ExtraFields($db); $extralabelsline = $extrafieldsline->fetch_name_optionals_label($objectline->table_element); - $array_option = $extrafieldsline->getOptionalsFromPost($extralabelsline, $predef); - $objectline->array_options=$array_option; - + $array_options = $extrafieldsline->getOptionalsFromPost($extralabelsline, $predef); + $objectline->array_options=$array_options; + // TODO verifier price_min si fk_product et multiprix $result=$objectline->update($user); @@ -1416,8 +1416,8 @@ else print ''; print ''; } - - + + //Display lines extrafields if (is_array($extralabelslines) && count($extralabelslines)>0) { print ''; @@ -1483,7 +1483,7 @@ else print '
'.$langs->trans("DateEndPlanned").' '; $form->select_date($db->jdate($objp->date_fin),"date_end_update",$usehm,$usehm,($db->jdate($objp->date_fin)>0?0:1),"update"); print ''; - + if (is_array($extralabelslines) && count($extralabelslines)>0) { print ''; $line = new ContratLigne($db); @@ -1491,7 +1491,7 @@ else print $line->showOptionals($extrafieldsline, 'edit', array('style'=>$bc[$var], 'colspan'=>$colspan)); print ''; } - + print ''; } diff --git a/htdocs/contrat/class/contrat.class.php b/htdocs/contrat/class/contrat.class.php index bb00a5d9838..0a93dc07701 100644 --- a/htdocs/contrat/class/contrat.class.php +++ b/htdocs/contrat/class/contrat.class.php @@ -1239,10 +1239,10 @@ class Contrat extends CommonObject * @param int $info_bits Bits de type de lignes * @param int $fk_fournprice Fourn price id * @param int $pa_ht Buying price HT - * @param array $array_option extrafields array + * @param array $array_options extrafields array * @return int <0 si erreur, >0 si ok */ - function addline($desc, $pu_ht, $qty, $txtva, $txlocaltax1, $txlocaltax2, $fk_product, $remise_percent, $date_start, $date_end, $price_base_type='HT', $pu_ttc=0.0, $info_bits=0, $fk_fournprice=null, $pa_ht = 0,$array_option=0) + function addline($desc, $pu_ht, $qty, $txtva, $txlocaltax1, $txlocaltax2, $fk_product, $remise_percent, $date_start, $date_end, $price_base_type='HT', $pu_ttc=0.0, $info_bits=0, $fk_fournprice=null, $pa_ht = 0,$array_options=0) { global $user, $langs, $conf, $mysoc; @@ -1350,11 +1350,11 @@ class Contrat extends CommonObject $result=$this->update_statut($user); if ($result > 0) { - - if (empty($conf->global->MAIN_EXTRAFIELDS_DISABLED) && is_array($array_option) && count($array_option)>0) // For avoid conflicts if trigger used + + if (empty($conf->global->MAIN_EXTRAFIELDS_DISABLED) && is_array($array_options) && count($array_options)>0) // For avoid conflicts if trigger used { $contractline = new ContratLigne($this->db); - $contractline->array_options=$array_option; + $contractline->array_options=$array_options; $contractline->id= $this->db->last_insert_id(MAIN_DB_PREFIX.$contractline->table_element); $result=$contractline->insertExtraFields(); if ($result < 0) @@ -1363,7 +1363,7 @@ class Contrat extends CommonObject $error++; } } - + if (empty($error)) { // Call trigger $result=$this->call_trigger('LINECONTRACT_CREATE',$user); @@ -1373,7 +1373,7 @@ class Contrat extends CommonObject return -1; } // End call triggers - + $this->db->commit(); return 1; } @@ -1417,10 +1417,10 @@ class Contrat extends CommonObject * @param int $info_bits Bits de type de lignes * @param int $fk_fournprice Fourn price id * @param int $pa_ht Buying price HT - * @param array $array_option extrafields array + * @param array $array_options extrafields array * @return int < 0 si erreur, > 0 si ok */ - function updateline($rowid, $desc, $pu, $qty, $remise_percent, $date_start, $date_end, $tvatx, $localtax1tx=0.0, $localtax2tx=0.0, $date_debut_reel='', $date_fin_reel='', $price_base_type='HT', $info_bits=0, $fk_fournprice=null, $pa_ht = 0,$array_option=0) + function updateline($rowid, $desc, $pu, $qty, $remise_percent, $date_start, $date_end, $tvatx, $localtax1tx=0.0, $localtax2tx=0.0, $date_debut_reel='', $date_fin_reel='', $price_base_type='HT', $info_bits=0, $fk_fournprice=null, $pa_ht = 0,$array_options=0) { global $user, $conf, $langs, $mysoc; @@ -1520,8 +1520,8 @@ class Contrat extends CommonObject $result=$this->update_statut($user); if ($result >= 0) { - - if (empty($conf->global->MAIN_EXTRAFIELDS_DISABLED) && is_array($array_option) && count($array_option)>0) // For avoid conflicts if trigger used + + if (empty($conf->global->MAIN_EXTRAFIELDS_DISABLED) && is_array($array_options) && count($array_options)>0) // For avoid conflicts if trigger used { $contractline = new ContratLigne($this->db); $contractline->array_options=$array_option; @@ -1533,7 +1533,7 @@ class Contrat extends CommonObject $error++; } } - + if (empty($error)) { // Call trigger $result=$this->call_trigger('LINECONTRACT_UPDATE',$user); @@ -1543,7 +1543,7 @@ class Contrat extends CommonObject return -3; } // End call triggers - + $this->db->commit(); return 1; } @@ -1597,7 +1597,7 @@ class Contrat extends CommonObject $this->error="Error ".$this->db->lasterror(); $error++; } - + if (empty($error)) { // Remove extrafields if (empty($conf->global->MAIN_EXTRAFIELDS_DISABLED)) // For avoid conflicts if trigger used @@ -2522,10 +2522,10 @@ class ContratLigne extends CommonObject $error++; //return -1; } - + if (empty($conf->global->MAIN_EXTRAFIELDS_DISABLED) && is_array($this->array_options) && count($this->array_options)>0) // For avoid conflicts if trigger used { - + $result=$this->insertExtraFields(); if ($result < 0) { diff --git a/htdocs/core/actions_lineupdown.inc.php b/htdocs/core/actions_lineupdown.inc.php new file mode 100644 index 00000000000..825bdac1615 --- /dev/null +++ b/htdocs/core/actions_lineupdown.inc.php @@ -0,0 +1,73 @@ + + * + * 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 3 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, see . + * or see http://www.gnu.org/ + */ + +/** + * \file htdocs/core/actions_lineupdown.inc.php + * \brief Code for actions on moving lines up or down onto object page + */ + + +// $action must be defined +// $permissiontoedit must be defined to permission to edit object +// $object must be defined +// $langs must be defined +// $hidedetails, $hidedesc, $hideref must de defined + +if ($action == 'up' && $permissiontoedit) +{ + $object->line_up(GETPOST('rowid')); + + // Define output language + $outputlangs = $langs; + $newlang = ''; + if ($conf->global->MAIN_MULTILANGS && empty($newlang) && GETPOST('lang_id')) $newlang = GETPOST('lang_id','alpha'); + if ($conf->global->MAIN_MULTILANGS && empty($newlang)) $newlang = $object->thirdparty->default_lang; + if (! empty($newlang)) { + $outputlangs = new Translate("", $conf); + $outputlangs->setDefaultLang($newlang); + } + + if (empty($conf->global->MAIN_DISABLE_PDF_AUTOUPDATE)) { + $object->generateDocument($object->modelpdf, $outputlangs, $hidedetails, $hidedesc, $hideref); + } + + header('Location: ' . $_SERVER["PHP_SELF"] . '?id=' . $object->id . '#' . GETPOST('rowid')); + exit(); +} + +if ($action == 'down' && $permissiontoedit) +{ + $object->line_down(GETPOST('rowid')); + + // Define output language + $outputlangs = $langs; + $newlang = ''; + if ($conf->global->MAIN_MULTILANGS && empty($newlang) && GETPOST('lang_id')) $newlang = GETPOST('lang_id','alpha'); + if ($conf->global->MAIN_MULTILANGS && empty($newlang)) $newlang = $object->thirdparty->default_lang; + if (! empty($newlang)) { + $outputlangs = new Translate("", $conf); + $outputlangs->setDefaultLang($newlang); + } + if (empty($conf->global->MAIN_DISABLE_PDF_AUTOUPDATE)) { + $object->generateDocument($object->modelpdf, $outputlangs, $hidedetails, $hidedesc, $hideref); + } + + header('Location: ' . $_SERVER["PHP_SELF"] . '?id=' . $object->id . '#' . GETPOST('rowid')); + exit(); +} + diff --git a/htdocs/fichinter/card.php b/htdocs/fichinter/card.php index 1746db04abf..661ffc9af30 100644 --- a/htdocs/fichinter/card.php +++ b/htdocs/fichinter/card.php @@ -206,9 +206,9 @@ else if ($action == 'add' && $user->rights->ficheinter->creer) // Extrafields $extrafields = new ExtraFields($db); $extralabels = $extrafields->fetch_name_optionals_label($object->table_element); - $array_option = $extrafields->getOptionalsFromPost($extralabels); + $array_options = $extrafields->getOptionalsFromPost($extralabels); - $object->array_options = $array_option; + $object->array_options = $array_options; $id = $object->create($user); @@ -288,7 +288,7 @@ else if ($action == 'add' && $user->rights->ficheinter->creer) // Extrafields $extrafieldsline = new ExtraFields($db); $extralabelsline = $extrafieldsline->fetch_name_optionals_label($object->table_element_line); - $array_option = $extrafieldsline->getOptionalsFromPost($extralabelsline, $predef); + $array_options = $extrafieldsline->getOptionalsFromPost($extralabelsline, $predef); $result = $object->addline( @@ -297,7 +297,7 @@ else if ($action == 'add' && $user->rights->ficheinter->creer) $desc, $date_intervention, $duration, - $array_option + $array_options ); if ($result < 0) @@ -327,9 +327,9 @@ else if ($action == 'add' && $user->rights->ficheinter->creer) // Extrafields $extrafields = new ExtraFields($db); $extralabels = $extrafields->fetch_name_optionals_label($object->table_element); - $array_option = $extrafields->getOptionalsFromPost($extralabels); + $array_options = $extrafields->getOptionalsFromPost($extralabels); - $object->array_options = $array_option; + $object->array_options = $array_options; $result = $object->create($user); if ($result > 0) @@ -470,7 +470,7 @@ else if ($action == "addline" && $user->rights->ficheinter->creer) // Extrafields $extrafieldsline = new ExtraFields($db); $extralabelsline = $extrafieldsline->fetch_name_optionals_label($object->table_element_line); - $array_option = $extrafieldsline->getOptionalsFromPost($extralabelsline); + $array_options = $extrafieldsline->getOptionalsFromPost($extralabelsline); $result=$object->addline( $user, @@ -478,7 +478,7 @@ else if ($action == "addline" && $user->rights->ficheinter->creer) $desc, $date_intervention, $duration, - $array_option + $array_options ); // Define output language @@ -568,8 +568,8 @@ else if ($action == 'updateline' && $user->rights->ficheinter->creer && GETPOST( // Extrafields $extrafieldsline = new ExtraFields($db); $extralabelsline = $extrafieldsline->fetch_name_optionals_label($object->table_element_line); - $array_option = $extrafieldsline->getOptionalsFromPost($extralabelsline); - $objectline->array_options = $array_option; + $array_options = $extrafieldsline->getOptionalsFromPost($extralabelsline); + $objectline->array_options = $array_options; $result = $objectline->update($user); if ($result < 0) diff --git a/htdocs/fichinter/class/fichinter.class.php b/htdocs/fichinter/class/fichinter.class.php index 6ec66add085..7be3b0bf3bd 100644 --- a/htdocs/fichinter/class/fichinter.class.php +++ b/htdocs/fichinter/class/fichinter.class.php @@ -889,10 +889,10 @@ class Fichinter extends CommonObject * @param string $desc Line description * @param date $date_intervention Intervention date * @param int $duration Intervention duration - * @param array $array_option Array option + * @param array $array_options Array option * @return int >0 if ok, <0 if ko */ - function addline($user,$fichinterid, $desc, $date_intervention, $duration, $array_option='') + function addline($user,$fichinterid, $desc, $date_intervention, $duration, $array_options='') { dol_syslog(get_class($this)."::addline $fichinterid, $desc, $date_intervention, $duration"); @@ -908,8 +908,8 @@ class Fichinter extends CommonObject $line->datei = $date_intervention; $line->duration = $duration; - if (is_array($array_option) && count($array_option)>0) { - $line->array_options=$array_option; + if (is_array($array_options) && count($array_options)>0) { + $line->array_options=$array_options; } $result=$line->insert($user); diff --git a/htdocs/fourn/class/fournisseur.commande.class.php b/htdocs/fourn/class/fournisseur.commande.class.php index 57a9a2806c3..14ba275d044 100644 --- a/htdocs/fourn/class/fournisseur.commande.class.php +++ b/htdocs/fourn/class/fournisseur.commande.class.php @@ -1122,10 +1122,10 @@ class CommandeFournisseur extends CommonOrder * @param bool $notrigger Disable triggers * @param int $date_start Date start of service * @param int $date_end Date end of service - * @param array $array_option extrafields array + * @param array $array_options extrafields array * @return int <=0 if KO, >0 if OK */ - function addline($desc, $pu_ht, $qty, $txtva, $txlocaltax1=0.0, $txlocaltax2=0.0, $fk_product=0, $fk_prod_fourn_price=0, $fourn_ref='', $remise_percent=0.0, $price_base_type='HT', $pu_ttc=0.0, $type=0, $info_bits=0, $notrigger=false, $date_start=null, $date_end=null, $array_option=0) + function addline($desc, $pu_ht, $qty, $txtva, $txlocaltax1=0.0, $txlocaltax2=0.0, $fk_product=0, $fk_prod_fourn_price=0, $fourn_ref='', $remise_percent=0.0, $price_base_type='HT', $pu_ttc=0.0, $type=0, $info_bits=0, $notrigger=false, $date_start=null, $date_end=null, $array_options=0) { global $langs,$mysoc; @@ -1260,7 +1260,19 @@ class CommandeFournisseur extends CommonOrder { $this->rowid = $this->db->last_insert_id(MAIN_DB_PREFIX.'commande_fournisseurdet'); - if (! $notrigger) + if (empty($conf->global->MAIN_EXTRAFIELDS_DISABLED)) // For avoid conflicts if trigger used + { + $linetmp = new CommandeFournisseurLigne($this->db); + $linetmp->id=$this->rowid; + $linetmp->array_options = $array_options; + $result=$linetmp->insertExtraFields(); + if ($result < 0) + { + $error++; + } + } + + if (! $error && ! $notrigger) { global $conf, $langs, $user; // Call trigger @@ -1399,51 +1411,53 @@ class CommandeFournisseur extends CommonOrder * * @param int $idline Id of line to delete * @param int $notrigger 1=Disable call to triggers - * @return >=0 if OK, <0 if KO + * @return <0 if KO, >0 if OK */ function deleteline($idline, $notrigger=0) { global $user,$langs,$conf; - if ($this->statut == 0) + + if ($this->statut != 0) { - $this->db->begin(); + return -1; + } - if (! $notrigger) + $this->db->begin(); + + if (! $notrigger) + { + // Call trigger + $result=$this->call_trigger('LINEORDER_SUPPLIER_DELETE',$user); + if ($result < 0) $error++; + // End call triggers + } + + if (! $error) + { + $sql = "DELETE FROM ".MAIN_DB_PREFIX."commande_fournisseurdet WHERE rowid = ".$idline; + $resql=$this->db->query($sql); + + dol_syslog(get_class($this)."::deleteline sql=".$sql); + if (! $resql) { - // Call trigger - $result=$this->call_trigger('LINEORDER_SUPPLIER_DELETE',$user); - if ($result < 0) $error++; - // End call triggers + $this->error=$this->db->lasterror(); + $error++; } + } - if (! $error) - { - $sql = "DELETE FROM ".MAIN_DB_PREFIX."commande_fournisseurdet WHERE rowid = ".$idline; - $resql=$this->db->query($sql); + if (! $error) + { + $result=$this->update_price(); + } - dol_syslog(get_class($this)."::deleteline sql=".$sql); - if (! $resql) - { - $this->error=$this->db->lasterror(); - $error++; - } - } - - if (! $error) - { - $result=$this->update_price(); - - $this->db->commit(); - return 0; - } - else - { - $this->db->rollback(); - return -1; - } + if (! $error) + { + $this->db->commit(); + return 1; } else - { + { + $this->db->rollback(); return -1; } } @@ -1779,10 +1793,10 @@ class CommandeFournisseur extends CommonOrder * @param int $notrigger Disable triggers * @param timestamp $date_start Date start of service * @param timestamp $date_end Date end of service - * @param array $array_option extrafields array + * @param array $array_options extrafields array * @return int < 0 if error, > 0 if ok */ - function updateline($rowid, $desc, $pu, $qty, $remise_percent, $txtva, $txlocaltax1=0, $txlocaltax2=0, $price_base_type='HT', $info_bits=0, $type=0, $notrigger=false, $date_start='', $date_end='', $array_option=0) + function updateline($rowid, $desc, $pu, $qty, $remise_percent, $txtva, $txlocaltax1=0, $txlocaltax2=0, $price_base_type='HT', $info_bits=0, $type=0, $notrigger=false, $date_start='', $date_end='', $array_options=0) { global $mysoc; dol_syslog(get_class($this)."::updateline $rowid, $desc, $pu, $qty, $remise_percent, $txtva, $price_base_type, $info_bits, $type"); diff --git a/htdocs/fourn/class/fournisseur.facture.class.php b/htdocs/fourn/class/fournisseur.facture.class.php index 1adeb714792..cada8c42af9 100644 --- a/htdocs/fourn/class/fournisseur.facture.class.php +++ b/htdocs/fourn/class/fournisseur.facture.class.php @@ -1115,12 +1115,12 @@ class FactureFournisseur extends CommonInvoice * @param int $type Type of line (0=product, 1=service) * @param int $rang Position of line * @param int $notrigger Disable triggers - * @param array $array_option extrafields array + * @param array $array_options extrafields array * @return int >0 if OK, <0 if KO * * FIXME Add field ref (that should be named ref_supplier) and label into update. For example can be filled when product line created from order. */ - function addline($desc, $pu, $txtva, $txlocaltax1, $txlocaltax2, $qty, $fk_product=0, $remise_percent=0, $date_start='', $date_end='', $ventil=0, $info_bits='', $price_base_type='HT', $type=0, $rang=-1, $notrigger=false, $array_option=0) + function addline($desc, $pu, $txtva, $txlocaltax1, $txlocaltax2, $qty, $fk_product=0, $remise_percent=0, $date_start='', $date_end='', $ventil=0, $info_bits='', $price_base_type='HT', $type=0, $rang=-1, $notrigger=false, $array_options=0) { dol_syslog(get_class($this)."::addline $desc,$pu,$qty,$txtva,$fk_product,$remise_percent,$date_start,$date_end,$ventil,$info_bits,$price_base_type,$type", LOG_DEBUG); include_once DOL_DOCUMENT_ROOT.'/core/lib/price.lib.php'; @@ -1157,7 +1157,7 @@ class FactureFournisseur extends CommonInvoice { $idligne = $this->db->last_insert_id(MAIN_DB_PREFIX.'facture_fourn_det'); - $result=$this->updateline($idligne, $desc, $pu, $txtva, $txlocaltax1, $txlocaltax2, $qty, $fk_product, $price_base_type, $info_bits, $type, $remise_percent, true); + $result=$this->updateline($idligne, $desc, $pu, $txtva, $txlocaltax1, $txlocaltax2, $qty, $fk_product, $price_base_type, $info_bits, $type, $remise_percent, true, '', '', $array_options); if ($result > 0) { $this->rowid = $idligne; @@ -1211,10 +1211,10 @@ class FactureFournisseur extends CommonInvoice * @param int $notrigger Disable triggers * @param timestamp $date_start Date start of service * @param timestamp $date_end Date end of service - * @param array $array_option extrafields array + * @param array $array_options extrafields array * @return int <0 if KO, >0 if OK */ - function updateline($id, $desc, $pu, $vatrate, $txlocaltax1=0, $txlocaltax2=0, $qty=1, $idproduct=0, $price_base_type='HT', $info_bits=0, $type=0, $remise_percent=0, $notrigger=false, $date_start='', $date_end='', $array_option=0) + function updateline($id, $desc, $pu, $vatrate, $txlocaltax1=0, $txlocaltax2=0, $qty=1, $idproduct=0, $price_base_type='HT', $info_bits=0, $type=0, $remise_percent=0, $notrigger=false, $date_start='', $date_end='', $array_options=0) { global $mysoc; dol_syslog(get_class($this)."::updateline $id,$desc,$pu,$vatrate,$qty,$idproduct,$price_base_type,$info_bits,$type,$remise_percent", LOG_DEBUG); @@ -1295,7 +1295,19 @@ class FactureFournisseur extends CommonInvoice { $this->rowid = $id; - if (! $notrigger) + if (empty($conf->global->MAIN_EXTRAFIELDS_DISABLED)) // For avoid conflicts if trigger used + { + $linetmp = new FactureFournisseurLigne($this->db); + $linetmp->id=$this->rowid; + $linetmp->array_options = $array_options; + $result=$linetmp->insertExtraFields(); + if ($result < 0) + { + $error++; + } + } + + if (! $error && ! $notrigger) { global $conf, $langs, $user; // Call trigger @@ -1328,7 +1340,7 @@ class FactureFournisseur extends CommonInvoice * * @param int $rowid Id of line to delete * @param int $notrigger 1=Does not execute triggers, 0= execute triggers - * @return void + * @return int <0 if KO, >0 if OK */ function deleteline($rowid, $notrigger=0) { @@ -1366,7 +1378,7 @@ class FactureFournisseur extends CommonInvoice if (! $error) { // Mise a jour prix facture - $this->update_price(); + $result=$this->update_price(); } if (! $error) diff --git a/htdocs/fourn/commande/card.php b/htdocs/fourn/commande/card.php index 8b5cef74098..0fe73c981f4 100644 --- a/htdocs/fourn/commande/card.php +++ b/htdocs/fourn/commande/card.php @@ -229,7 +229,7 @@ if (empty($reshook)) // Extrafields $extrafieldsline = new ExtraFields($db); $extralabelsline = $extrafieldsline->fetch_name_optionals_label($object->table_element_line); - $array_option = $extrafieldsline->getOptionalsFromPost($extralabelsline, $predef); + $array_options = $extrafieldsline->getOptionalsFromPost($extralabelsline, $predef); // Unset extrafield if (is_array($extralabelsline)) { // Get extra fields @@ -442,7 +442,7 @@ if (empty($reshook)) // Extrafields Lines $extrafieldsline = new ExtraFields($db); $extralabelsline = $extrafieldsline->fetch_name_optionals_label($object->table_element_line); - $array_option = $extrafieldsline->getOptionalsFromPost($extralabelsline); + $array_options = $extrafieldsline->getOptionalsFromPost($extralabelsline); // Unset extrafield POST Data if (is_array($extralabelsline)) { foreach ($extralabelsline as $key => $value) { @@ -507,37 +507,37 @@ if (empty($reshook)) } } - if ($action == 'confirm_deleteproductline' && $confirm == 'yes' && $user->rights->fournisseur->commande->creer) + // Remove a product line + if ($action == 'confirm_deleteline' && $confirm == 'yes' && $user->rights->fournisseur->commande->creer) { + $result = $object->deleteline($lineid); + if ($result > 0) + { + // Define output language + $outputlangs = $langs; + $newlang = ''; + if ($conf->global->MAIN_MULTILANGS && empty($newlang) && GETPOST('lang_id')) + $newlang = GETPOST('lang_id'); + if ($conf->global->MAIN_MULTILANGS && empty($newlang)) + $newlang = $object->thirdparty->default_lang; + if (! empty($newlang)) { + $outputlangs = new Translate("", $conf); + $outputlangs->setDefaultLang($newlang); + } + if (empty($conf->global->MAIN_DISABLE_PDF_AUTOUPDATE)) { + $ret = $object->fetch($object->id); // Reload to get new records + $object->generateDocument($object->modelpdf, $outputlangs, $hidedetails, $hidedesc, $hideref); + } - $result = $object->deleteline(GETPOST('lineid')); - if ($result >= 0) - { - if (empty($conf->global->MAIN_DISABLE_PDF_AUTOUPDATE)) - { - $outputlangs = $langs; - $newlang = ''; - if ($conf->global->MAIN_MULTILANGS && empty($newlang) && GETPOST('lang_id')) $newlang = GETPOST('lang_id','alpha'); - if ($conf->global->MAIN_MULTILANGS && empty($newlang)) $newlang = $object->thirdparty->default_lang; - if (! empty($newlang)) { - $outputlangs = new Translate("", $conf); - $outputlangs->setDefaultLang($newlang); - } - $ret=$object->fetch($object->id); // Reload to get new records - $object->generateDocument($object->modelpdf, $outputlangs, $hidedetails, $hidedesc, $hideref); - } - } - else - { - $error++; - setEventMessage($object->error, 'errors'); - } - - if (! $error) - { - header("Location: ".$_SERVER["PHP_SELF"]."?id=".$object->id); - exit; - } + header('Location: '.$_SERVER["PHP_SELF"].'?id='.$object->id); + exit; + } + else + { + setEventMessages($object->error, $object->errors, 'errors'); + /* Fix bug 1485 : Reset action to avoid asking again confirmation on failure */ + $action=''; + } } if ($action == 'confirm_valid' && $confirm == 'yes' && @@ -1352,12 +1352,14 @@ elseif (! empty($object->id)) dol_fiche_head($head, 'card', $title, 0, 'order'); + $formconfirm=''; + /* * Confirmation de la suppression de la commande */ if ($action == 'delete') { - print $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id, $langs->trans('DeleteOrder'), $langs->trans('ConfirmDeleteOrder'), 'confirm_delete', '', 0, 2); + $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id, $langs->trans('DeleteOrder'), $langs->trans('ConfirmDeleteOrder'), 'confirm_delete', '', 0, 2); } @@ -1369,7 +1371,7 @@ elseif (! empty($object->id)) //array('type' => 'checkbox', 'name' => 'update_prices', 'label' => $langs->trans("PuttingPricesUpToDate"), 'value' => 1) ); // Paiement incomplet. On demande si motif = escompte ou autre - print $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id,$langs->trans('CloneOrder'),$langs->trans('ConfirmCloneOrder',$object->ref),'confirm_clone',$formquestion,'yes',1); + $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id,$langs->trans('CloneOrder'),$langs->trans('ConfirmCloneOrder',$object->ref),'confirm_clone',$formquestion,'yes',1); } @@ -1400,7 +1402,7 @@ elseif (! empty($object->id)) $text.=$notify->confirmMessage('ORDER_SUPPLIER_APPROVE', $object->socid); } - print $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id, $langs->trans('ValidateOrder'), $text, 'confirm_valid', '', 0, 1); + $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id, $langs->trans('ValidateOrder'), $text, 'confirm_valid', '', 0, 1); } } @@ -1433,7 +1435,7 @@ elseif (! empty($object->id)) ); } - print $form->formconfirm($_SERVER['PHP_SELF']."?id=".$object->id,$langs->trans("ApproveThisOrder"),$langs->trans("ConfirmApproveThisOrder",$object->ref),"confirm_approve", $formquestion, 1, 1, 240); + $formconfirm = $form->formconfirm($_SERVER['PHP_SELF']."?id=".$object->id,$langs->trans("ApproveThisOrder"),$langs->trans("ConfirmApproveThisOrder",$object->ref),"confirm_approve", $formquestion, 1, 1, 240); } @@ -1442,7 +1444,7 @@ elseif (! empty($object->id)) */ if ($action == 'refuse') { - print $form->formconfirm($_SERVER['PHP_SELF']."?id=$object->id",$langs->trans("DenyingThisOrder"),$langs->trans("ConfirmDenyingThisOrder",$object->ref),"confirm_refuse", '', 0, 1); + $formconfirm = $form->formconfirm($_SERVER['PHP_SELF']."?id=$object->id",$langs->trans("DenyingThisOrder"),$langs->trans("ConfirmDenyingThisOrder",$object->ref),"confirm_refuse", '', 0, 1); } @@ -1451,7 +1453,7 @@ elseif (! empty($object->id)) */ if ($action == 'cancel') { - print $form->formconfirm($_SERVER['PHP_SELF']."?id=$object->id",$langs->trans("Cancel"),$langs->trans("ConfirmCancelThisOrder",$object->ref),"confirm_cancel", '', 0, 1); + $formconfirm = $form->formconfirm($_SERVER['PHP_SELF']."?id=$object->id",$langs->trans("Cancel"),$langs->trans("ConfirmCancelThisOrder",$object->ref),"confirm_cancel", '', 0, 1); } @@ -1461,19 +1463,24 @@ elseif (! empty($object->id)) if ($action == 'commande') { $date_com = dol_mktime(0,0,0,$_POST["remonth"],$_POST["reday"],$_POST["reyear"]); - print $form->formconfirm($_SERVER['PHP_SELF']."?id=".$object->id."&datecommande=".$date_com."&methode=".$_POST["methodecommande"]."&comment=".urlencode($_POST["comment"]), $langs->trans("MakeOrder"),$langs->trans("ConfirmMakeOrder",dol_print_date($date_com,'day')),"confirm_commande",'',0,2); + $formconfirm = $form->formconfirm($_SERVER['PHP_SELF']."?id=".$object->id."&datecommande=".$date_com."&methode=".$_POST["methodecommande"]."&comment=".urlencode($_POST["comment"]), $langs->trans("MakeOrder"),$langs->trans("ConfirmMakeOrder",dol_print_date($date_com,'day')),"confirm_commande",'',0,2); } - /* - * Confirmation de la suppression d'une ligne produit - */ - if ($action == 'delete_product_line') + // Confirmation to delete line + if ($action == 'ask_deleteline') { - print $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id.'&lineid='.$_GET["lineid"], $langs->trans('DeleteProductLine'), $langs->trans('ConfirmDeleteProductLine'), 'confirm_deleteproductline','',0,2); - + $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id.'&lineid='.$lineid, $langs->trans('DeleteProductLine'), $langs->trans('ConfirmDeleteProductLine'), 'confirm_deleteline', '', 0, 1); } + if (!$formconfirm) { + $parameters=array('lineid'=>$lineid); + $formconfirm=$hookmanager->executeHooks('formConfirm',$parameters,$object,$action); // Note that $action and $object may have been modified by hook + } + + // Print form confirm + print $formconfirm; + /* * Commande */ @@ -1718,6 +1725,10 @@ elseif (! empty($object->id)) print ''; + // Add free products/services form + global $forceall, $senderissupplier, $dateSelector; + $forceall=1; $senderissupplier=1; $dateSelector=0; + // Show object lines $inputalsopricewithtax=1; if (! empty($object->lines)) @@ -1904,19 +1915,18 @@ elseif (! empty($object->id)) } */ // Form to add new line - if ($object->statut == 0 && $user->rights->fournisseur->commande->creer && $action != 'editline') + if ($object->statut == 0 && $user->rights->fournisseur->commande->creer) { - // Add free products/services form - global $forceall, $senderissupplier, $dateSelector; - $forceall=1; $senderissupplier=1; $dateSelector=0; + if ($action != 'editline') + { + $var = true; - $var = true; + // Add free products/services + $object->formAddObjectLine(1, $societe, $mysoc); - // Add free products/services - $object->formAddObjectLine(1, $societe, $mysoc); - - $parameters = array(); - $reshook = $hookmanager->executeHooks('formAddObjectLine', $parameters, $object, $action); // Note that $action and $object may have been modified by hook + $parameters = array(); + $reshook = $hookmanager->executeHooks('formAddObjectLine', $parameters, $object, $action); // Note that $action and $object may have been modified by hook + } } print '
'; diff --git a/htdocs/fourn/facture/card.php b/htdocs/fourn/facture/card.php index 8875e56800c..c2628b0cd0c 100644 --- a/htdocs/fourn/facture/card.php +++ b/htdocs/fourn/facture/card.php @@ -187,13 +187,29 @@ if (empty($reshook)) } } - elseif ($action == 'confirm_delete_line' && $confirm == 'yes' && $user->rights->fournisseur->facture->creer) + // Remove a product line + else if ($action == 'confirm_deleteline' && $confirm == 'yes' && $user->rights->fournisseur->facture->creer) { - $object->fetch($id); - $ret = $object->deleteline(GETPOST('lineid')); - if ($ret > 0) + $result = $object->deleteline($lineid); + if ($result > 0) { - header('Location: '.$_SERVER["PHP_SELF"].'?id='.$id); + // Define output language + $outputlangs = $langs; + $newlang = ''; + if ($conf->global->MAIN_MULTILANGS && empty($newlang) && GETPOST('lang_id')) + $newlang = GETPOST('lang_id'); + if ($conf->global->MAIN_MULTILANGS && empty($newlang)) + $newlang = $object->thirdparty->default_lang; + if (! empty($newlang)) { + $outputlangs = new Translate("", $conf); + $outputlangs->setDefaultLang($newlang); + } + if (empty($conf->global->MAIN_DISABLE_PDF_AUTOUPDATE)) { + $ret = $object->fetch($object->id); // Reload to get new records + $object->generateDocument($object->modelpdf, $outputlangs, $hidedetails, $hidedesc, $hideref); + } + + header('Location: '.$_SERVER["PHP_SELF"].'?id='.$object->id); exit; } else @@ -555,7 +571,7 @@ if (empty($reshook)) // Extrafields Lines $extrafieldsline = new ExtraFields($db); $extralabelsline = $extrafieldsline->fetch_name_optionals_label($object->table_element_line); - $array_option = $extrafieldsline->getOptionalsFromPost($extralabelsline); + $array_options = $extrafieldsline->getOptionalsFromPost($extralabelsline); // Unset extrafield POST Data if (is_array($extralabelsline)) { foreach ($extralabelsline as $key => $value) { @@ -613,7 +629,7 @@ if (empty($reshook)) // Extrafields $extrafieldsline = new ExtraFields($db); $extralabelsline = $extrafieldsline->fetch_name_optionals_label($object->table_element_line); - $array_option = $extrafieldsline->getOptionalsFromPost($extralabelsline, $predef); + $array_options = $extrafieldsline->getOptionalsFromPost($extralabelsline, $predef); // Unset extrafield if (is_array($extralabelsline)) { // Get extra fields @@ -1589,12 +1605,6 @@ else dol_fiche_head($head, 'card', $titre, 0, 'bill'); - // Confirmation de la suppression d'une ligne produit - if ($action == 'confirm_delete_line') - { - $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id.'&lineid='.$_GET["lineid"], $langs->trans('DeleteProductLine'), $langs->trans('ConfirmDeleteProductLine'), 'confirm_delete_line', '', 1, 1); - } - // Clone confirmation if ($action == 'clone') { @@ -1678,7 +1688,13 @@ else } - if (!$formconfirm) { + // Confirmation to delete line + if ($action == 'ask_deleteline') + { + $formconfirm=$form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id.'&lineid='.$lineid, $langs->trans('DeleteProductLine'), $langs->trans('ConfirmDeleteProductLine'), 'confirm_deleteline', '', 0, 1); + } + + if (!$formconfirm) { $parameters=array('lineid'=>$lineid); $formconfirm=$hookmanager->executeHooks('formConfirm',$parameters,$object,$action); // Note that $action and $object may have been modified by hook } @@ -2026,6 +2042,9 @@ else print ''; + global $forceall, $senderissupplier, $dateSelector, $inputalsopricewithtax; + $forceall=1; $senderissupplier=1; $dateSelector=0; $inputalsopricewithtax=1; + // Show object lines if (! empty($object->lines)) $ret = $object->printObjectLines($action, $soc, $mysoc, $lineid, 1, $user->rights->fournisseur->facture->creer); @@ -2215,22 +2234,17 @@ else } */ // Form to add new line - if ($object->statut == 0 && $action != 'editline') - { - global $forceall, $senderissupplier, $dateSelector, $inputalsopricewithtax; - $forceall=1; $senderissupplier=1; $dateSelector=0; $inputalsopricewithtax=1; - if ($object->statut == 0 && $user->rights->fournisseur->facture->creer) + if ($object->statut == 0 && $user->rights->fournisseur->facture->creer) + { + if ($action != 'editline') { - if ($action != 'editline') - { - $var = true; + $var = true; - // Add free products/services - $object->formAddObjectLine(1, $societe, $mysoc); + // Add free products/services + $object->formAddObjectLine(1, $societe, $mysoc); - $parameters = array(); - $reshook = $hookmanager->executeHooks('formAddObjectLine', $parameters, $object, $action); // Note that $action and $object may have been modified by hook - } + $parameters = array(); + $reshook = $hookmanager->executeHooks('formAddObjectLine', $parameters, $object, $action); // Note that $action and $object may have been modified by hook } } From 78af862c1913d147b3610af344018e5064944460 Mon Sep 17 00:00:00 2001 From: aspangaro Date: Sat, 28 Feb 2015 08:46:40 +0100 Subject: [PATCH 188/287] NEW: Add a search field and report on hrm area --- htdocs/compta/hrm.php | 190 ++++++++++++++++++++++++---------- htdocs/expensereport/list.php | 11 +- 2 files changed, 142 insertions(+), 59 deletions(-) diff --git a/htdocs/compta/hrm.php b/htdocs/compta/hrm.php index 6252f0f6ef7..191fb34d2e8 100644 --- a/htdocs/compta/hrm.php +++ b/htdocs/compta/hrm.php @@ -2,6 +2,7 @@ /* Copyright (C) 2011 Dimitri Mouillard * Copyright (C) 2013-2014 Laurent Destailleur * Copyright (C) 2012-2014 Regis Houssin + * Copyright (C) 2015 Alexandre Spangaro * * 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 @@ -31,7 +32,8 @@ require_once DOL_DOCUMENT_ROOT.'/user/class/user.class.php'; require_once DOL_DOCUMENT_ROOT.'/user/class/usergroup.class.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/usergroups.lib.php'; -require_once DOL_DOCUMENT_ROOT.'/compta/deplacement/class/deplacement.class.php'; +if ($conf->deplacement->enabled) require_once DOL_DOCUMENT_ROOT.'/compta/deplacement/class/deplacement.class.php'; +if ($conf->expensereport->enabled) require_once DOL_DOCUMENT_ROOT.'/expensereport/class/expensereport.class.php'; require_once DOL_DOCUMENT_ROOT.'/holiday/class/holiday.class.php'; $langs->load('users'); @@ -107,6 +109,20 @@ if (! empty($conf->deplacement->enabled) && $user->rights->deplacement->lire) print "

"; } +if (! empty($conf->expensereport->enabled) && $user->rights->expensereport->lire) +{ + $langs->load("trips"); + print '
'; + print ''; + print ''; + print ''; + print ""; + print "'; + print ''; + //print "'; + print ''; + print "
'.$langs->trans("SearchATripAndExpense").'
:
:

"; +} print '
'; @@ -115,65 +131,131 @@ $max=10; $langs->load("boxes"); // Last trips -$sql = "SELECT u.rowid as uid, u.lastname, u.firstname, d.rowid, d.dated as date, d.tms as dm, d.km, d.fk_statut"; -$sql.= " FROM ".MAIN_DB_PREFIX."deplacement as d, ".MAIN_DB_PREFIX."user as u"; -if (!$user->rights->societe->client->voir && !$user->societe_id) $sql.= ", ".MAIN_DB_PREFIX."societe as s, ".MAIN_DB_PREFIX."societe_commerciaux as sc"; -$sql.= " WHERE u.rowid = d.fk_user"; -$sql.= " AND d.entity = ".$conf->entity; -if (empty($user->rights->deplacement->readall) && empty($user->rights->deplacement->lire_tous)) $sql.=' AND d.fk_user IN ('.join(',',$childids).')'; -if (!$user->rights->societe->client->voir && !$user->societe_id) $sql.= " AND d.fk_soc = s. rowid AND s.rowid = sc.fk_soc AND sc.fk_user = " .$user->id; -if (!empty($socid)) $sql.= " AND d.fk_soc = ".$socid; -$sql.= $db->order("d.tms","DESC"); -$sql.= $db->plimit($max, 0); - -$result = $db->query($sql); -if ($result) +if (! empty($conf->deplacement->enabled) && $user->rights->deplacement->lire) { - $var=false; - $num = $db->num_rows($result); + $sql = "SELECT u.rowid as uid, u.lastname, u.firstname, d.rowid, d.dated as date, d.tms as dm, d.km, d.fk_statut"; + $sql.= " FROM ".MAIN_DB_PREFIX."deplacement as d, ".MAIN_DB_PREFIX."user as u"; + if (!$user->rights->societe->client->voir && !$user->societe_id) $sql.= ", ".MAIN_DB_PREFIX."societe as s, ".MAIN_DB_PREFIX."societe_commerciaux as sc"; + $sql.= " WHERE u.rowid = d.fk_user"; + $sql.= " AND d.entity = ".$conf->entity; + if (empty($user->rights->deplacement->readall) && empty($user->rights->deplacement->lire_tous)) $sql.=' AND d.fk_user IN ('.join(',',$childids).')'; + if (!$user->rights->societe->client->voir && !$user->societe_id) $sql.= " AND d.fk_soc = s. rowid AND s.rowid = sc.fk_soc AND sc.fk_user = " .$user->id; + if (!empty($socid)) $sql.= " AND d.fk_soc = ".$socid; + $sql.= $db->order("d.tms","DESC"); + $sql.= $db->plimit($max, 0); - $i = 0; + $result = $db->query($sql); + if ($result) + { + $var=false; + $num = $db->num_rows($result); - print ''; - print ''; - print ''; - print ''; - print ''; - print ''; - print ''; - if ($num) - { - $total_ttc = $totalam = $total = 0; + $i = 0; - $deplacementstatic=new Deplacement($db); - $userstatic=new User($db); - while ($i < $num && $i < $max) - { - $obj = $db->fetch_object($result); - $deplacementstatic->ref=$obj->rowid; - $deplacementstatic->id=$obj->rowid; - $userstatic->id=$obj->uid; - $userstatic->lastname=$obj->lastname; - $userstatic->firstname=$obj->firstname; - print ''; - print ''; - print ''; - print ''; - print ''; - print ''; - print ''; - $var=!$var; - $i++; - } + print '
'.$langs->trans("BoxTitleLastModifiedExpenses",min($max,$num)).''.$langs->trans("FeesKilometersOrAmout").''.$langs->trans("DateModificationShort").' 
'.$deplacementstatic->getNomUrl(1).''.$userstatic->getNomUrl(1).''.$obj->km.''.dol_print_date($db->jdate($obj->dm),'day').''.$deplacementstatic->LibStatut($obj->fk_statut,3).'
'; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + if ($num) + { + $total_ttc = $totalam = $total = 0; - } - else - { - print ''; - } - print '
'.$langs->trans("BoxTitleLastModifiedExpenses",min($max,$num)).''.$langs->trans("FeesKilometersOrAmout").''.$langs->trans("DateModificationShort").' 
'.$langs->trans("None").'

'; + $deplacementstatic=new Deplacement($db); + $userstatic=new User($db); + while ($i < $num && $i < $max) + { + $obj = $db->fetch_object($result); + $deplacementstatic->ref=$obj->rowid; + $deplacementstatic->id=$obj->rowid; + $userstatic->id=$obj->uid; + $userstatic->lastname=$obj->lastname; + $userstatic->firstname=$obj->firstname; + print ''; + print ''.$deplacementstatic->getNomUrl(1).''; + print ''.$userstatic->getNomUrl(1).''; + print ''.$obj->km.''; + print ''.dol_print_date($db->jdate($obj->dm),'day').''; + print ''.$deplacementstatic->LibStatut($obj->fk_statut,3).''; + print ''; + $var=!$var; + $i++; + } + + } + else + { + print ''.$langs->trans("None").''; + } + print '
'; + } + else dol_print_error($db); +} + +if (! empty($conf->expensereport->enabled) && $user->rights->expensereport->lire) +{ + $sql = "SELECT u.rowid as uid, u.lastname, u.firstname, x.rowid, x.date_debut as date, x.tms as dm, x.total_ttc"; + $sql.= " FROM ".MAIN_DB_PREFIX."expensereport as x, ".MAIN_DB_PREFIX."user as u"; + if (!$user->rights->societe->client->voir && !$user->societe_id) $sql.= ", ".MAIN_DB_PREFIX."societe as s, ".MAIN_DB_PREFIX."societe_commerciaux as sc"; + $sql.= " WHERE u.rowid = x.fk_user_author"; + $sql.= " AND x.entity = ".$conf->entity; + if (empty($user->rights->expensereport->readall) && empty($user->rights->expensereport->lire_tous)) $sql.=' AND x.fk_user_author IN ('.join(',',$childids).')'; + //if (!$user->rights->societe->client->voir && !$user->societe_id) $sql.= " AND x.fk_soc = s. rowid AND s.rowid = sc.fk_soc AND sc.fk_user = " .$user->id; + //if (!empty($socid)) $sql.= " AND x.fk_soc = ".$socid; + $sql.= $db->order("x.tms","DESC"); + $sql.= $db->plimit($max, 0); + + $result = $db->query($sql); + if ($result) + { + $var=false; + $num = $db->num_rows($result); + + $i = 0; + + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + if ($num) + { + $total_ttc = $totalam = $total = 0; + + $expensereportstatic=new ExpenseReport($db); + $userstatic=new User($db); + while ($i < $num && $i < $max) + { + $obj = $db->fetch_object($result); + $expensereportstatic->ref=$obj->rowid; + $expensereportstatic->id=$obj->rowid; + $userstatic->id=$obj->uid; + $userstatic->lastname=$obj->lastname; + $userstatic->firstname=$obj->firstname; + print ''; + print ''; + print ''; + print ''; + print ''; + //print ''; + print ''; + $var=!$var; + $i++; + } + + } + else + { + print ''; + } + print '
'.$langs->trans("BoxTitleLastModifiedExpenses",min($max,$num)).''.$langs->trans("FeesAmount").''.$langs->trans("DateModificationShort").' 
'.$expensereportstatic->getNomUrl(1).''.$userstatic->getNomUrl(1).''.$obj->total_ttc.''.dol_print_date($db->jdate($obj->dm),'day').''.$expensereportstatic->LibStatut($obj->fk_statut,3).'
'.$langs->trans("None").'

'; + } + else dol_print_error($db); } -else dol_print_error($db); print '
'; diff --git a/htdocs/expensereport/list.php b/htdocs/expensereport/list.php index a8e10f40464..1499662cc1a 100755 --- a/htdocs/expensereport/list.php +++ b/htdocs/expensereport/list.php @@ -1,8 +1,9 @@ - * Copyright (C) 2004-2008 Laurent Destailleur - * Copyright (C) 2004 Eric Seigne - * Copyright (C) 2005-2009 Regis Houssin +/* Copyright (C) 2003 Rodolphe Quiedeville + * Copyright (C) 2004-2008 Laurent Destailleur + * Copyright (C) 2004 Eric Seigne + * Copyright (C) 2005-2009 Regis Houssin + * Copyright (C) 2015 Alexandre Spangaro * * 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 @@ -302,7 +303,7 @@ if ($resql) print ""; print '
'; $db->free($resql); From 105dcde7aa7916d348e90fd570d8d1620950998c Mon Sep 17 00:00:00 2001 From: aspangaro Date: Sat, 28 Feb 2015 08:50:47 +0100 Subject: [PATCH 189/287] Key language --- htdocs/expensereport/list.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/expensereport/list.php b/htdocs/expensereport/list.php index 1499662cc1a..d6700ac26a2 100755 --- a/htdocs/expensereport/list.php +++ b/htdocs/expensereport/list.php @@ -64,7 +64,7 @@ $html = new Form($db); $formother = new FormOther($db); $expensereporttmp=new ExpenseReport($db); -llxHeader('', $langs->trans("ListOfExpenseReports")); +llxHeader('', $langs->trans("ListOfTrips")); $max_year = 5; $min_year = 5; From 84b5888cd56589dcdbab49592606115703747046 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20FRANCE?= Date: Sat, 28 Feb 2015 10:45:48 +0100 Subject: [PATCH 190/287] Update card.php --- htdocs/projet/card.php | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/htdocs/projet/card.php b/htdocs/projet/card.php index 0f6a74f1a48..a862cff0f40 100644 --- a/htdocs/projet/card.php +++ b/htdocs/projet/card.php @@ -51,9 +51,14 @@ $object = new Project($db); $extrafields = new ExtraFields($db); if ($id > 0 || ! empty($ref)) { - $object->fetch($id,$ref); - $object->fetch_thirdparty(); - $id=$object->id; + $ret = $object->fetch($id,$ref); + if ($ret > 0) { + $object->fetch_thirdparty(); + $id=$object->id; + } else { + setEventMessage($object->error, 'errors'); + $action=''; + } } // Security check From eb2cc110fc7cd5498f820c974ee1c9be81f58c8e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20FRANCE?= Date: Sat, 28 Feb 2015 10:49:14 +0100 Subject: [PATCH 191/287] phpcs --- htdocs/compta/prelevement/class/bonprelevement.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/compta/prelevement/class/bonprelevement.class.php b/htdocs/compta/prelevement/class/bonprelevement.class.php index 63ad32f9bf9..a9e02a54d99 100644 --- a/htdocs/compta/prelevement/class/bonprelevement.class.php +++ b/htdocs/compta/prelevement/class/bonprelevement.class.php @@ -1294,7 +1294,7 @@ class BonPrelevement extends CommonObject while ($i < $num) { $obj = $this->db->fetch_object($resql); - $fileDebiteurSection .= $this->EnregDestinataireSEPA($obj->code, $obj->nom, $obj->address, $obj->zip, $obj->town, $obj->country_code, $obj->cb, $obj->cg, $obj->cc, $obj->somme, $ListOfFactures , $obj->idfac, $obj->iban, $obj->bic, $obj->datec, $obj->drum); + $fileDebiteurSection .= $this->EnregDestinataireSEPA($obj->code, $obj->nom, $obj->address, $obj->zip, $obj->town, $obj->country_code, $obj->cb, $obj->cg, $obj->cc, $obj->somme, $ListOfFactures, $obj->idfac, $obj->iban, $obj->bic, $obj->datec, $obj->drum); $this->total = $this->total + $obj->somme; $i++; } From 4d226885cbdcccbb1a2a72e6d7d00f773f2841f8 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 28 Feb 2015 18:10:31 +0100 Subject: [PATCH 192/287] Rewrite code for supplier order and invoice to use shared code of customer supplier and invoice. Work on extrafield for supplier order and invoice. --- htdocs/core/class/commonobject.class.php | 19 ++++--- htdocs/core/tpl/objectline_edit.tpl.php | 39 ++++++-------- htdocs/core/tpl/objectline_view.tpl.php | 12 +++-- .../class/fournisseur.commande.class.php | 53 ++++++++++++++----- .../fourn/class/fournisseur.facture.class.php | 16 ++++-- htdocs/fourn/commande/card.php | 46 ++++++++++------ htdocs/fourn/facture/card.php | 33 +++++++----- 7 files changed, 138 insertions(+), 80 deletions(-) diff --git a/htdocs/core/class/commonobject.class.php b/htdocs/core/class/commonobject.class.php index 3150625ba87..1134d3f0945 100644 --- a/htdocs/core/class/commonobject.class.php +++ b/htdocs/core/class/commonobject.class.php @@ -2573,39 +2573,38 @@ abstract class CommonObject */ function printObjectLines($action, $seller, $buyer, $selected=0, $dateSelector=0, $permtoedit=0) { - global $conf, $hookmanager, $inputalsopricewithtax, $usermargins, $langs, $user; + global $conf, $hookmanager, $inputalsopricewithtax, $usemargins, $langs, $user; # Define usemargins $usemargins=0; if (! empty($conf->margin->enabled) && ! empty($this->element) && in_array($this->element,array('facture','propal','commande'))) $usemargins=1; - print ''; if (! empty($conf->global->MAIN_VIEW_LINE_NUMBER)) print ' '; // Description - print ''; + print ''.$langs->trans('Description').''; // VAT - print ''; + print ''.$langs->trans('VAT').''; // Price HT - print ''; + print ''.$langs->trans('PriceUHT').''; - if ($inputalsopricewithtax) print ' '; + if ($inputalsopricewithtax) print ''.$langs->trans('PriceUTTC').''; // Qty - print ''; + print ''.$langs->trans('Qty').''; // Reduction short - print ''; + print ''.$langs->trans('ReductionShort').''; if ($this->situation_cycle_ref) { - print ''; + print '' . $langs->trans('Progress') . ''; } - if ($usermargins && ! empty($conf->margin->enabled) && empty($user->societe_id)) + if ($usemargins && ! empty($conf->margin->enabled) && empty($user->societe_id)) { if ($conf->global->MARGIN_TYPE == "1") print ''.$langs->trans('BuyingPrice').''; diff --git a/htdocs/core/tpl/objectline_edit.tpl.php b/htdocs/core/tpl/objectline_edit.tpl.php index d844cc09c76..98f1b842f1a 100644 --- a/htdocs/core/tpl/objectline_edit.tpl.php +++ b/htdocs/core/tpl/objectline_edit.tpl.php @@ -43,7 +43,7 @@ if (empty($inputalsopricewithtax)) $inputalsopricewithtax=0; // Define colspan for button Add $colspan = 3; // Col total ht + col edit + col delete if (! empty($inputalsopricewithtax)) $colspan++; // We add 1 if col total ttc -if (in_array($object->element,array('propal','facture','invoice','commande','order'))) $colspan++; // With this, there is a column move button +if (in_array($object->element,array('propal','facture','invoice','commande','order','order_supplier','invoice_supplier'))) $colspan++; // With this, there is a column move button ?> @@ -109,20 +109,18 @@ $coldisplay=-1; // We remove first td } $coldisplay++; - print 'situation_counter > 1) { - print 'readonly="readonly" '; - } + print 'situation_counter > 1) print ' readonly="readonly"'; print '>'; - if ($inputalsopricewithtax) { + if ($inputalsopricewithtax) + { $coldisplay++; - print 'situation_counter > 1) { - print 'readonly="readonly" '; - } + print 'situation_counter > 1) print ' readonly="readonly"'; print '>'; - } ?> + } + ?> info_bits & 2) != 2) { @@ -130,11 +128,9 @@ $coldisplay=-1; // We remove first td // for example always visible on invoice but must be visible only if stock module on and stock decrease option is on invoice validation and status is not validated // must also not be output for most entities (proposal, intervention, ...) //if($line->qty > $line->stock) print img_picto($langs->trans("StockTooLow"),"warning", 'style="vertical-align: bottom;"')." "; - print 'situation_counter > 1) { - print 'readonly="readonly" '; - } - print '/>'; + print 'situation_counter > 1) print ' readonly="readonly"'; + print '>'; } else { ?>   @@ -142,11 +138,9 @@ $coldisplay=-1; // We remove first td info_bits & 2) != 2) { - print 'situation_counter > 1) { - print 'readonly="readonly" '; - } - print '/>%'; + print 'situation_counter > 1) print ' readonly="readonly"'; + print '>%'; } else { ?>   @@ -189,7 +183,8 @@ $coldisplay=-1; // We remove first td $coldisplay++; } } - } ?> + } + ?> diff --git a/htdocs/core/tpl/objectline_view.tpl.php b/htdocs/core/tpl/objectline_view.tpl.php index a40e923fc39..0664d471dec 100644 --- a/htdocs/core/tpl/objectline_view.tpl.php +++ b/htdocs/core/tpl/objectline_view.tpl.php @@ -122,10 +122,10 @@ if (empty($usemargins)) $usemargins=0; tva_tx,'%',$line->info_bits); ?> - subprice); ?> + pu_ht)?price($line->pu_ht):price($line->subprice)); ?> -   + pu_ttc)?price($line->pu_ttc):price($line->subprice)); ?> @@ -139,7 +139,11 @@ if (empty($usemargins)) $usemargins=0; remise_percent) && $line->special_code != 3) { ?> - remise_percent,$langs); ?> + remise_percent,$langs); + ?>   ' . $line->situation_percent . '%'; } - if ($usermargins && ! empty($conf->margin->enabled) && empty($user->societe_id)) + if ($usemargins && ! empty($conf->margin->enabled) && empty($user->societe_id)) { $rounding = min($conf->global->MAIN_MAX_DECIMALS_UNIT,$conf->global->MAIN_MAX_DECIMALS_TOT); ?> diff --git a/htdocs/fourn/class/fournisseur.commande.class.php b/htdocs/fourn/class/fournisseur.commande.class.php index 14ba275d044..e626760f83e 100644 --- a/htdocs/fourn/class/fournisseur.commande.class.php +++ b/htdocs/fourn/class/fournisseur.commande.class.php @@ -1873,8 +1873,19 @@ class CommandeFournisseur extends CommonOrder if ($result > 0) { $this->rowid = $rowid; + if (empty($conf->global->MAIN_EXTRAFIELDS_DISABLED)) // For avoid conflicts if trigger used + { + $tmpline = new CommandeFournisseurLigne($this->db); + $tmpline->id=$this->rowid; + $tmpline->array_options = $array_options; + $result=$tmpline->insertExtraFields(); + if ($result < 0) + { + $error++; + } + } - if (! $notrigger) + if (! $error && ! $notrigger) { global $conf, $langs, $user; // Call trigger @@ -1888,14 +1899,25 @@ class CommandeFournisseur extends CommonOrder } // Mise a jour info denormalisees au niveau facture - $this->update_price('','auto'); + if (! $error) + { + $this->update_price('','auto'); + } - $this->db->commit(); - return $result; + if (! $error) + { + $this->db->commit(); + return $result; + } + else + { + $this->db->rollback(); + return -1; + } } else { - $this->error=$this->db->error(); + $this->error=$this->db->lasterror(); $this->db->rollback(); return -1; } @@ -2163,17 +2185,22 @@ class CommandeFournisseur extends CommonOrder */ function getMaxDeliveryTimeDay($langs) { - if (empty($this->lines)) return $langs->trans('Undefined'); + if (empty($this->lines)) return ''; + + $obj = new ProductFournisseur($this->db); $nb = 0; - foreach ($this->lines as $line) { - $obj = new ProductFournisseur($this->db); - $idp = $obj->find_min_price_product_fournisseur($line->fk_product, $line->qty); - if ($idp) { - $obj->fetch($idp); - if ($obj->delivery_time_days > $nb) $nb = $obj->delivery_time_days; + foreach ($this->lines as $line) + { + if ($line->fk_product > 0) + { + $idp = $obj->find_min_price_product_fournisseur($line->fk_product, $line->qty); + if ($idp) + { + $obj->fetch($idp); + if ($obj->delivery_time_days > $nb) $nb = $obj->delivery_time_days; + } } - } if ($nb === 0) return $langs->trans('Undefined'); diff --git a/htdocs/fourn/class/fournisseur.facture.class.php b/htdocs/fourn/class/fournisseur.facture.class.php index cada8c42af9..8283f1cb957 100644 --- a/htdocs/fourn/class/fournisseur.facture.class.php +++ b/htdocs/fourn/class/fournisseur.facture.class.php @@ -1323,9 +1323,16 @@ class FactureFournisseur extends CommonInvoice // Update total price into invoice record $result=$this->update_price('','auto'); - $this->db->commit(); - - return $result; + if (! $error) + { + $this->db->commit(); + return $result; + } + else + { + $this->db->rollback(); + return -1; + } } else { @@ -1847,6 +1854,9 @@ class FactureFournisseurLigne extends CommonInvoice var $db; var $error; + var $pu_ht; + var $pu_ttc; + public $element='facture_fourn_det'; public $table_element='facture_fourn_det'; diff --git a/htdocs/fourn/commande/card.php b/htdocs/fourn/commande/card.php index 0fe73c981f4..68724345411 100644 --- a/htdocs/fourn/commande/card.php +++ b/htdocs/fourn/commande/card.php @@ -347,16 +347,16 @@ if (empty($reshook)) $localtax1_tx= get_localtax($tva_tx, 1,$mysoc,$object->thirdparty); $localtax2_tx= get_localtax($tva_tx, 2,$mysoc,$object->thirdparty); - if (!empty($_POST['price_ht'])) + if (GETPOST('price_ht')!=='') { $price_base_type = 'HT'; - $ht = price2num($_POST['price_ht']); + $ht = price2num(GETPOST('price_ht')); $result=$object->addline($desc, $ht, $qty, $tva_tx, $localtax1_tx, $localtax2_tx, 0, 0, '', $remise_percent, $price_base_type, 0, $type,'','', $date_start, $date_end, $array_options); } else { - $ttc = price2num($_POST['price_ttc']); - $ht = $ttc / (1 + ($tauxtva / 100)); + $ttc = price2num(GETPOST('price_ttc')); + $ht = $ttc / (1 + ($tva_tx / 100)); $price_base_type = 'HT'; $result=$object->addline($desc, $ht, $qty, $tva_tx, $localtax1_tx, $localtax2_tx, 0, 0, '', $remise_percent, $price_base_type, $ttc, $type,'','', $date_start, $date_end, $array_options); } @@ -426,18 +426,34 @@ if (empty($reshook)) */ if ($action == 'updateline' && $user->rights->fournisseur->commande->creer && ! GETPOST('cancel')) { - if ($_POST["elrowid"]) + $tva_tx = GETPOST('tva_tx'); + + if (GETPOST('price_ht') != '') + { + $price_base_type = 'HT'; + $ht = price2num(GETPOST('price_ht')); + $result=$object->addline($desc, $ht, $qty, $tva_tx, $localtax1_tx, $localtax2_tx, 0, 0, '', $remise_percent, $price_base_type, 0, $type,'','', $date_start, $date_end); + } + else + { + $ttc = price2num(GETPOST('price_ttc')); + $ht = $ttc / (1 + ($tva_tx / 100)); + $price_base_type = 'HT'; + $result=$object->addline($desc, $ht, $qty, $tva_tx, $localtax1_tx, $localtax2_tx, 0, 0, '', $remise_percent, $price_base_type, $ttc, $type,'','', $date_start, $date_end); + } + + if ($lineid) { $line = new CommandeFournisseurLigne($db); - $res = $line->fetch($_POST["elrowid"]); + $res = $line->fetch($lineid); if (!$res) dol_print_error($db); } $date_start=dol_mktime(GETPOST('date_start'.$date_pf.'hour'), GETPOST('date_start'.$date_pf.'min'), 0, GETPOST('date_start'.$date_pf.'month'), GETPOST('date_start'.$date_pf.'day'), GETPOST('date_start'.$date_pf.'year')); $date_end=dol_mktime(GETPOST('date_end'.$date_pf.'hour'), GETPOST('date_end'.$date_pf.'min'), 0, GETPOST('date_end'.$date_pf.'month'), GETPOST('date_end'.$date_pf.'day'), GETPOST('date_end'.$date_pf.'year')); - $localtax1_tx=get_localtax($_POST['tva_tx'],1,$mysoc,$object->thirdparty); - $localtax2_tx=get_localtax($_POST['tva_tx'],2,$mysoc,$object->thirdparty); + $localtax1_tx=get_localtax($tva_tx,1,$mysoc,$object->thirdparty); + $localtax2_tx=get_localtax($tva_tx,2,$mysoc,$object->thirdparty); // Extrafields Lines $extrafieldsline = new ExtraFields($db); @@ -451,21 +467,21 @@ if (empty($reshook)) } $result = $object->updateline( - $_POST['elrowid'], - $_POST['eldesc'], - $_POST['pu'], + $lineid, + $_POST['product_desc'], + $ht, $_POST['qty'], $_POST['remise_percent'], - $_POST['tva_tx'], + $tva_tx, $localtax1_tx, $localtax2_tx, - 'HT', + $price_base_type, 0, isset($_POST["type"])?$_POST["type"]:$line->product_type, false, $date_start, $date_end, - $array_option + $array_options ); unset($_POST['qty']); unset($_POST['type']); @@ -1730,7 +1746,7 @@ elseif (! empty($object->id)) $forceall=1; $senderissupplier=1; $dateSelector=0; // Show object lines - $inputalsopricewithtax=1; + $inputalsopricewithtax=0; if (! empty($object->lines)) $ret = $object->printObjectLines($action, $soc, $mysoc, $lineid, 1, $user->rights->fournisseur->commande->creer); diff --git a/htdocs/fourn/facture/card.php b/htdocs/fourn/facture/card.php index c2628b0cd0c..01be69f1590 100644 --- a/htdocs/fourn/facture/card.php +++ b/htdocs/fourn/facture/card.php @@ -438,7 +438,10 @@ if (empty($reshook)) 0, $lines[$i]->info_bits, 'HT', - $product_type + $product_type, + $lines[$i]->rang, + 1, + $lines[$i]->array_options ); if ($result < 0) @@ -492,7 +495,7 @@ if (empty($reshook)) $product=new Product($db); $product->fetch($_POST['idprod'.$i]); - $ret=$object->addline($label, $amount, $tauxtva, $product->localtax1_tx, $product->localtax2_tx, $qty, $fk_product, $remise_percent, '', '', '', 0, $price_base); + $ret=$object->addline($label, $amount, $tauxtva, $product->localtax1_tx, $product->localtax2_tx, $qty, $fk_product, $remise_percent, '', '', '', 0, $price_base, $_POST['rang'.$i], 1); if ($ret < 0) $error++; } } @@ -535,16 +538,20 @@ if (empty($reshook)) $object->fetch($id); $object->fetch_thirdparty(); - if ($_POST['puht']) - { - $pu=$_POST['puht']; - $price_base_type='HT'; - } - if ($_POST['puttc']) - { - $pu=$_POST['puttc']; - $price_base_type='TTC'; - } + $tva_tx = GETPOST('tva_tx'); + + if (GETPOST('price_ht') != '') + { + $up = price2num(GETPOST('price_ht')); + $price_base_type = 'HT'; + $result=$object->addline($desc, $ht, $qty, $tva_tx, $localtax1_tx, $localtax2_tx, 0, 0, '', $remise_percent, $price_base_type, 0, $type,'','', $date_start, $date_end); + } + else + { + $up = price2num(GETPOST('price_ttc')); + $price_base_type = 'TTC'; + $result=$object->addline($desc, $ht, $qty, $tva_tx, $localtax1_tx, $localtax2_tx, 0, 0, '', $remise_percent, $price_base_type, $ttc, $type,'','', $date_start, $date_end); + } if (GETPOST('idprod')) { @@ -579,7 +586,7 @@ if (empty($reshook)) } } - $result=$object->updateline(GETPOST('lineid'), $label, $pu, GETPOST('tauxtva'), $localtax1_tx, $localtax2_tx, GETPOST('qty'), GETPOST('idprod'), $price_base_type, 0, $type, $remise_percent, 0, $date_start, $date_end, $array_options); + $result=$object->updateline(GETPOST('lineid'), $label, $up, $tva_tx, $localtax1_tx, $localtax2_tx, GETPOST('qty'), GETPOST('idprod'), $price_base_type, 0, $type, $remise_percent, 0, $date_start, $date_end, $array_options); if ($result >= 0) { unset($_POST['label']); From 1cdd77a6716c956f994f0af2bb4c2f615b1ad163 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 28 Feb 2015 18:18:41 +0100 Subject: [PATCH 193/287] Fix: use bad var --- htdocs/fourn/commande/card.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/fourn/commande/card.php b/htdocs/fourn/commande/card.php index 0257b51c946..7750250b00b 100644 --- a/htdocs/fourn/commande/card.php +++ b/htdocs/fourn/commande/card.php @@ -334,7 +334,7 @@ if ($action == 'addline' && $user->rights->fournisseur->commande->creer) else { $ttc = price2num($_POST['price_ttc']); - $ht = $ttc / (1 + ($tauxtva / 100)); + $ht = $ttc / (1 + ($tva_tx / 100)); $price_base_type = 'HT'; $result=$object->addline($desc, $ht, $qty, $tva_tx, $localtax1_tx, $localtax2_tx, 0, 0, '', $remise_percent, $price_base_type, $ttc, $type,'','', $date_start, $date_end); } From 7baaf18ad1f157767d6d645631cbc50ad3d86f98 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 28 Feb 2015 18:44:06 +0100 Subject: [PATCH 194/287] Fix can be null --- htdocs/install/mysql/migration/3.6.0-3.7.0.sql | 3 +++ htdocs/install/mysql/tables/llx_projet_task.sql | 8 ++++---- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/htdocs/install/mysql/migration/3.6.0-3.7.0.sql b/htdocs/install/mysql/migration/3.6.0-3.7.0.sql index 2efb6996993..d9d972cc25c 100755 --- a/htdocs/install/mysql/migration/3.6.0-3.7.0.sql +++ b/htdocs/install/mysql/migration/3.6.0-3.7.0.sql @@ -1095,6 +1095,9 @@ ALTER TABLE llx_projet_task_time ADD INDEX idx_projet_task_time_task (fk_task); ALTER TABLE llx_projet_task_time ADD INDEX idx_projet_task_time_date (task_date); ALTER TABLE llx_projet_task_time ADD INDEX idx_projet_task_time_datehour (task_datehour); +ALTER TABLE llx_projet_task CHANGE COLUMN duration_effective real DEFAULT 0 NULL; +ALTER TABLE llx_projet_task CHANGE COLUMN planned_workload real DEFAULT 0 NULL; + -- add extrafield on ficheinter lines CREATE TABLE llx_fichinterdet_extrafields diff --git a/htdocs/install/mysql/tables/llx_projet_task.sql b/htdocs/install/mysql/tables/llx_projet_task.sql index 98c8845974e..5b9decd23ef 100644 --- a/htdocs/install/mysql/tables/llx_projet_task.sql +++ b/htdocs/install/mysql/tables/llx_projet_task.sql @@ -31,10 +31,10 @@ create table llx_projet_task datev datetime, -- date validation label varchar(255) NOT NULL, description text, - duration_effective real DEFAULT 0 NOT NULL, - planned_workload real DEFAULT 0 NOT NULL, - progress integer DEFAULT 0, -- percentage increase - priority integer DEFAULT 0, -- priority + duration_effective real DEFAULT 0, + planned_workload real DEFAULT 0, + progress integer DEFAULT 0, -- percentage increase + priority integer DEFAULT 0, -- priority fk_user_creat integer, -- user who created the task fk_user_valid integer, -- user who validated the task fk_statut smallint DEFAULT 0 NOT NULL, From 51fff77355914a0b60dee32f032a31d62e3745c2 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 28 Feb 2015 19:02:03 +0100 Subject: [PATCH 195/287] Fix: time 0 must be different than time unknown. --- htdocs/core/class/html.form.class.php | 4 ++-- htdocs/core/lib/date.lib.php | 2 +- htdocs/core/lib/project.lib.php | 16 ++++++++++++---- htdocs/projet/tasks/index.php | 2 +- htdocs/projet/tasks/task.php | 12 +++++++++--- 5 files changed, 25 insertions(+), 11 deletions(-) diff --git a/htdocs/core/class/html.form.class.php b/htdocs/core/class/html.form.class.php index 6a6474c8306..719a79dcd1c 100644 --- a/htdocs/core/class/html.form.class.php +++ b/htdocs/core/class/html.form.class.php @@ -4097,7 +4097,7 @@ class Form * Function to show a form to select a duration on a page * * @param string $prefix Prefix for input fields - * @param int $iSecond Default preselected duration (number of seconds) + * @param int $iSecond Default preselected duration (number of seconds or '') * @param int $disabled Disable the combo box * @param string $typehour If 'select' then input hour and input min is a combo, if 'text' input hour is in text and input min is a combo * @param string $minunderhours If 1, show minutes selection under the hours @@ -4112,7 +4112,7 @@ class Form $hourSelected=0; $minSelected=0; - if ($iSecond) + if ($iSecond != '') { require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php'; diff --git a/htdocs/core/lib/date.lib.php b/htdocs/core/lib/date.lib.php index 072db988dc1..777b3633cb5 100644 --- a/htdocs/core/lib/date.lib.php +++ b/htdocs/core/lib/date.lib.php @@ -166,7 +166,7 @@ function convertTime2Seconds($iHours=0,$iMinutes=0,$iSeconds=0) /** Return, in clear text, value of a number of seconds in days, hours and minutes * * @param int $iSecond Number of seconds - * @param string $format Output format (all: total delay days hour:min like "2 days 12:30"", allhourmin: total delay hours:min like "60:30", allhour: total delay hours without min/sec like "60:30", fullhour: total delay hour decimal like "60.5" for 60:30, hour: only hours part "12", min: only minutes part "30", sec: only seconds part, month: only month part, year: only year part); + * @param string $format Output format ('all': total delay days hour:min like "2 days 12:30"", 'allhourmin': total delay hours:min like "60:30", 'allhour': total delay hours without min/sec like "60:30", 'fullhour': total delay hour decimal like "60.5" for 60:30, 'hour': only hours part "12", 'min': only minutes part "30", 'sec': only seconds part, 'month': only month part, 'year': only year part); * @param int $lengthOfDay Length of day (default 86400 seconds for 1 day, 28800 for 8 hour) * @param int $lengthOfWeek Length of week (default 7) * @return string Formated text of duration diff --git a/htdocs/core/lib/project.lib.php b/htdocs/core/lib/project.lib.php index 27f0a5fe63f..27499f65c73 100644 --- a/htdocs/core/lib/project.lib.php +++ b/htdocs/core/lib/project.lib.php @@ -352,11 +352,16 @@ function projectLinesa(&$inc, $parent, &$lines, &$level, $var, $showproject, &$t print dol_print_date($lines[$i]->date_end,'dayhour'); print ''; + $plannedworkloadoutputformat='allhourmin'; + $timespentoutputformat='allhourmin'; + if (! empty($conf->global->PROJECT_PLANNED_WORKLOAD_FORMAT)) $plannedworkloadoutputformat=$conf->global->PROJECT_PLANNED_WORKLOAD_FORMAT; + if (! empty($conf->global->PROJECT_TIMES_PENT_FORMAT)) $timespentoutputformat=$conf->global->PROJECT_TIME_SPENT_FORMAT; + // Planned Workload (in working hours) print ''; - $fullhour=convertSecondToTime($lines[$i]->planned_workload,'allhourmin'); + $fullhour=convertSecondToTime($lines[$i]->planned_workload,$plannedworkloadoutputformat); $workingdelay=convertSecondToTime($lines[$i]->planned_workload,'all',86400,7); // TODO Replace 86400 and 7 to take account working hours per day and working day per weeks - if ($lines[$i]->planned_workload) + if ($lines[$i]->planned_workload != '') { print $fullhour; // TODO Add delay taking account of working hours per day and working day per week @@ -367,14 +372,17 @@ function projectLinesa(&$inc, $parent, &$lines, &$level, $var, $showproject, &$t // Progress declared print ''; - print $lines[$i]->progress.' %'; + if ($lines[$i]->progress != '') + { + print $lines[$i]->progress.' %'; + } print ''; // Time spent print ''; if ($showlineingray) print ''; else print ''; - if ($lines[$i]->duration) print convertSecondToTime($lines[$i]->duration,'allhourmin'); + if ($lines[$i]->duration) print convertSecondToTime($lines[$i]->duration,$timespentoutputformat); else print '--:--'; if ($showlineingray) print ''; else print ''; diff --git a/htdocs/projet/tasks/index.php b/htdocs/projet/tasks/index.php index a9b059fce81..21c6afb49fa 100644 --- a/htdocs/projet/tasks/index.php +++ b/htdocs/projet/tasks/index.php @@ -108,7 +108,7 @@ print ''.$langs->trans("RefTask").''; print ''.$langs->trans("LabelTask").''; print ''.$langs->trans("DateStart").''; print ''.$langs->trans("DateEnd").''; -print ''.$langs->trans("PlannedWorkload"); +print ''.$langs->trans("PlannedWorkload"); // TODO Replace 86400 and 7 to take account working hours per day and working day per weeks //print '
('.$langs->trans("DelayWorkHour").')'; print ''; diff --git a/htdocs/projet/tasks/task.php b/htdocs/projet/tasks/task.php index 27774057e4e..06f62c9f4c7 100644 --- a/htdocs/projet/tasks/task.php +++ b/htdocs/projet/tasks/task.php @@ -441,17 +441,23 @@ if ($id > 0 || ! empty($ref)) // Planned workload print ''.$langs->trans("PlannedWorkload").''; - print convertSecondToTime($object->planned_workload,'allhourmin'); + if ($object->planned_workload != '') + { + print convertSecondToTime($object->planned_workload,'allhourmin'); + } print ''; // Progress declared print ''.$langs->trans("ProgressDeclared").''; - print $object->progress.' %'; + if ($object->progress != '') + { + print $object->progress.' %'; + } print ''; // Progress calculated print ''.$langs->trans("ProgressCalculated").''; - if ($object->planned_workload) + if ($object->planned_workload != '') { $tmparray=$object->getSummaryOfTimeSpent(); if ($tmparray['total_duration'] > 0) print round($tmparray['total_duration'] / $object->planned_workload * 100, 2).' %'; From 8dffe2a9102bdc27d80f36871694e039592fe127 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcos=20Garci=CC=81a=20de=20La=20Fuente?= Date: Sat, 28 Feb 2015 19:33:19 +0100 Subject: [PATCH 196/287] Corrected FunctionsLibTest:testGetBrowserInfo --- test/phpunit/FunctionsLibTest.php | 1 - 1 file changed, 1 deletion(-) diff --git a/test/phpunit/FunctionsLibTest.php b/test/phpunit/FunctionsLibTest.php index 2ebebb2b4dc..fe8561b9ac8 100755 --- a/test/phpunit/FunctionsLibTest.php +++ b/test/phpunit/FunctionsLibTest.php @@ -192,7 +192,6 @@ class FunctionsLibTest extends PHPUnit_Framework_TestCase $this->assertEquals('ios',$tmp['browseros']); $this->assertEquals('tablet',$tmp['layout']); $this->assertEquals('iphone',$tmp['phone']); - $this->assertTrue($tmp['phone']); } From f8e9a38e5cecddc7ebef63cc66a4cdc731592681 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 28 Feb 2015 19:37:44 +0100 Subject: [PATCH 197/287] Fix: Avoid empty table into setup when module are missing. --- htdocs/admin/stock.php | 131 +++++++++++++++++++++------------- htdocs/langs/en_US/admin.lang | 2 + 2 files changed, 82 insertions(+), 51 deletions(-) diff --git a/htdocs/admin/stock.php b/htdocs/admin/stock.php index 6b2c626da39..87ed5fe64c6 100644 --- a/htdocs/admin/stock.php +++ b/htdocs/admin/stock.php @@ -136,6 +136,8 @@ print "  \n"; print ''."\n"; $var=true; +$found=0; + if (! empty($conf->facture->enabled)) { $var=!$var; @@ -148,6 +150,7 @@ if (! empty($conf->facture->enabled)) print $form->selectyesno("STOCK_CALCULATE_ON_BILL",$conf->global->STOCK_CALCULATE_ON_BILL,1,$disabled); print ''; print "\n\n\n"; + $found++; } if (! empty($conf->commande->enabled)) @@ -162,6 +165,7 @@ if (! empty($conf->commande->enabled)) print $form->selectyesno("STOCK_CALCULATE_ON_VALIDATE_ORDER",$conf->global->STOCK_CALCULATE_ON_VALIDATE_ORDER,1,$disabled); print ''; print "\n\n\n"; + $found++; } if (! empty($conf->expedition->enabled)) @@ -176,7 +180,17 @@ if (! empty($conf->expedition->enabled)) print $form->selectyesno("STOCK_CALCULATE_ON_SHIPMENT",$conf->global->STOCK_CALCULATE_ON_SHIPMENT,1,$disabled); print ''; print "\n\n\n"; + $found++; } + +if (! $found) +{ + $var=!$var; + print ""; + print ''.$langs->trans("NoModueToManageStockDecrease").''; + print "\n"; +} + print ''; print '
'; @@ -189,6 +203,8 @@ print "  \n"; print ''."\n"; $var=true; +$found=0; + if (! empty($conf->fournisseur->enabled)) { $var=!$var; @@ -201,6 +217,7 @@ if (! empty($conf->fournisseur->enabled)) print $form->selectyesno("STOCK_CALCULATE_ON_SUPPLIER_BILL",$conf->global->STOCK_CALCULATE_ON_SUPPLIER_BILL,1,$disabled); print ''; print "\n\n\n"; + $found++; } if (! empty($conf->fournisseur->enabled)) @@ -215,6 +232,7 @@ if (! empty($conf->fournisseur->enabled)) print $form->selectyesno("STOCK_CALCULATE_ON_SUPPLIER_VALIDATE_ORDER",$conf->global->STOCK_CALCULATE_ON_SUPPLIER_VALIDATE_ORDER,1,$disabled); print ''; print "\n\n\n"; + $found++; } if (! empty($conf->fournisseur->enabled)) { @@ -228,65 +246,76 @@ if (! empty($conf->fournisseur->enabled)) print $form->selectyesno("STOCK_CALCULATE_ON_SUPPLIER_DISPATCH_ORDER",$conf->global->STOCK_CALCULATE_ON_SUPPLIER_DISPATCH_ORDER,1,$disabled); print ''; print "\n\n\n"; + $found++; +} + +if (! $found) +{ + $var=!$var; + print ""; + print ''.$langs->trans("NoModueToManageStockIncrease").''; + print "\n"; } print ''; // Optio to force stock to be enough before adding a line into document -print '
'; -print ''; -print ''; -print " \n"; -print " \n"; -print ''."\n"; +if ($conf->invoice->enabled || $conf->order->enabled || $conf->expedition->enabled) +{ + print '
'; + print '
".$langs->trans("RuleForStockAvailability")." 
'; + print ''; + print " \n"; + print " \n"; + print ''."\n"; -if($conf->invoice->enabled) { - $var = !$var; - print ""; - print ''; - print '\n"; - print "\n"; + if($conf->invoice->enabled) { + $var = !$var; + print ""; + print ''; + print '\n"; + print "\n"; + } + + if($conf->order->enabled) { + $var = !$var; + print ""; + print ''; + print '\n"; + print "\n"; + } + + if($conf->expedition->enabled) { + $var = !$var; + print ""; + print ''; + print '\n"; + print "\n"; + } + print '
".$langs->trans("RuleForStockAvailability")." 
'.$langs->trans("StockMustBeEnoughForInvoice").''; - print "
"; - print ''; - print ""; - print $form->selectyesno("STOCK_MUST_BE_ENOUGH_FOR_INVOICE",$conf->global->STOCK_MUST_BE_ENOUGH_FOR_INVOICE,1); - print ''; - print '
'; - print "
'.$langs->trans("StockMustBeEnoughForInvoice").''; + print "
"; + print ''; + print ""; + print $form->selectyesno("STOCK_MUST_BE_ENOUGH_FOR_INVOICE",$conf->global->STOCK_MUST_BE_ENOUGH_FOR_INVOICE,1); + print ''; + print '
'; + print "
'.$langs->trans("StockMustBeEnoughForOrder").''; + print "
"; + print ''; + print ""; + print $form->selectyesno("STOCK_MUST_BE_ENOUGH_FOR_ORDER",$conf->global->STOCK_MUST_BE_ENOUGH_FOR_ORDER,1); + print ''; + print '
'; + print "
'.$langs->trans("StockMustBeEnoughForShipment").''; + print "
"; + print ''; + print ""; + print $form->selectyesno("STOCK_MUST_BE_ENOUGH_FOR_SHIPMENT",$conf->global->STOCK_MUST_BE_ENOUGH_FOR_SHIPMENT,1); + print ''; + print '
'; + print "
'; } -if($conf->order->enabled) { - $var = !$var; - print ""; - print ''.$langs->trans("StockMustBeEnoughForOrder").''; - print ''; - print "
"; - print ''; - print ""; - print $form->selectyesno("STOCK_MUST_BE_ENOUGH_FOR_ORDER",$conf->global->STOCK_MUST_BE_ENOUGH_FOR_ORDER,1); - print ''; - print '
'; - print "\n"; - print "\n"; -} - -if($conf->expedition->enabled) { - $var = !$var; - print ""; - print ''.$langs->trans("StockMustBeEnoughForShipment").''; - print ''; - print "
"; - print ''; - print ""; - print $form->selectyesno("STOCK_MUST_BE_ENOUGH_FOR_SHIPMENT",$conf->global->STOCK_MUST_BE_ENOUGH_FOR_SHIPMENT,1); - print ''; - print '
'; - print "\n"; - print "\n"; -} -print ''; - - $virtualdiffersfromphysical=0; if (! empty($conf->global->STOCK_CALCULATE_ON_SHIPMENT) || ! empty($conf->global->STOCK_CALCULATE_ON_SUPPLIER_DISPATCH_ORDER) diff --git a/htdocs/langs/en_US/admin.lang b/htdocs/langs/en_US/admin.lang index 8768983ce73..e39486e242a 100644 --- a/htdocs/langs/en_US/admin.lang +++ b/htdocs/langs/en_US/admin.lang @@ -1560,3 +1560,5 @@ SortOrder=Sort order Format=Format TypePaymentDesc=0:Customer payment type, 1:Supplier payment type, 2:Both customers and suppliers payment type IncludePath=Include path (defined into variable %s) +NoModueToManageStockDecrease=No module able to manage automatic stock decrease has been activated. Stock decrease will be done on manual input only. +NoModueToManageStockIncrease=No module able to manage automatic stock increase has been activated. Stock increase will be done on manual input only. From b888a04af94193fe0343d00156a3340edbaf03c7 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 28 Feb 2015 20:14:26 +0100 Subject: [PATCH 198/287] Reduce a lot of duplicate code. Move all tables of extrafields setup into a tpl file. --- .../adherents/admin/adherent_extrafields.php | 39 +--------- .../admin/adherent_type_extrafields.php | 37 +--------- htdocs/admin/agenda_extrafields.php | 36 +--------- htdocs/admin/bank_extrafields.php | 42 +---------- htdocs/admin/order_extrafields.php | 37 +--------- htdocs/admin/orderdet_extrafields.php | 41 +---------- htdocs/admin/supplierinvoice_extrafields.php | 37 +--------- .../admin/supplierinvoicedet_extrafields.php | 37 +--------- htdocs/admin/supplierorder_extrafields.php | 37 +--------- htdocs/admin/supplierorderdet_extrafields.php | 37 +--------- .../admin/categorie_extrafields.php | 37 +--------- htdocs/comm/admin/propal_extrafields.php | 42 +---------- htdocs/comm/admin/propaldet_extrafields.php | 37 +--------- .../admin/facture_cust_extrafields.php | 43 +---------- .../admin/facturedet_cust_extrafields.php | 41 +---------- htdocs/contrat/admin/contract_extrafields.php | 43 +---------- .../contrat/admin/contractdet_extrafields.php | 43 +---------- htdocs/core/tpl/admin_extrafields.tpl.php | 44 ------------ htdocs/core/tpl/admin_extrafields_add.tpl.php | 2 +- .../core/tpl/admin_extrafields_edit.tpl.php | 2 +- .../core/tpl/admin_extrafields_view.tpl.php | 72 +++++++++++++++++++ .../fichinter/admin/fichinter_extrafields.php | 46 +----------- .../admin/fichinterdet_extrafields.php | 43 +---------- htdocs/product/admin/product_extrafields.php | 46 ++---------- htdocs/projet/admin/project_extrafields.php | 41 +---------- .../projet/admin/project_task_extrafields.php | 40 +---------- htdocs/societe/admin/contact_extrafields.php | 38 +--------- htdocs/societe/admin/societe_extrafields.php | 40 +---------- htdocs/user/admin/group_extrafields.php | 38 +--------- htdocs/user/admin/user_extrafields.php | 38 +--------- 30 files changed, 119 insertions(+), 1037 deletions(-) delete mode 100644 htdocs/core/tpl/admin_extrafields.tpl.php create mode 100644 htdocs/core/tpl/admin_extrafields_view.tpl.php diff --git a/htdocs/adherents/admin/adherent_extrafields.php b/htdocs/adherents/admin/adherent_extrafields.php index 1c98c2c16ba..fc820100315 100644 --- a/htdocs/adherents/admin/adherent_extrafields.php +++ b/htdocs/adherents/admin/adherent_extrafields.php @@ -58,6 +58,8 @@ require DOL_DOCUMENT_ROOT.'/core/actions_extrafields.inc.php'; * View */ +$textobject = $langs->transnoentitiesnoconv("Members"); + $help_url='EN:Module_Foundations|FR:Module_Adhérents|ES:Módulo_Miembros'; llxHeader('',$langs->trans("MembersSetup"),$help_url); @@ -70,42 +72,7 @@ $head = member_admin_prepare_head(); dol_fiche_head($head, 'attributes', $langs->trans("Members"), 0, 'user'); - -print $langs->trans("DefineHereComplementaryAttributes", $langs->transnoentitiesnoconv("Members")).'
'."\n"; -print '
'; - -// Load attribute_label -$extrafields->fetch_name_optionals_label($elementtype); - -print ""; - -print ''; -print ''; -print ''; -print ''; -print ''; -print ''; -print ''; -print ''; -print "\n"; - -$var=True; -foreach($extrafields->attribute_type as $key => $value) -{ - $var=!$var; - print ""; - print "\n"; - print "\n"; - print "\n"; - print '\n"; - print '\n"; - print '\n"; - print '\n"; - print ""; -} - -print "
'.$langs->trans("Label").''.$langs->trans("AttributeCode").''.$langs->trans("Type").''.$langs->trans("Size").''.$langs->trans("Unique").''.$langs->trans("Required").' 
".$extrafields->attribute_label[$key]."".$key."".$type2label[$extrafields->attribute_type[$key]]."'.$extrafields->attribute_size[$key]."'.yn($extrafields->attribute_unique[$key])."'.yn($extrafields->attribute_required[$key])."'.img_edit().''; - print "  ".img_delete()."
"; +require DOL_DOCUMENT_ROOT.'/core/tpl/admin_extrafields_view.tpl.php'; dol_fiche_end(); diff --git a/htdocs/adherents/admin/adherent_type_extrafields.php b/htdocs/adherents/admin/adherent_type_extrafields.php index 627d96acf17..4164be44f64 100644 --- a/htdocs/adherents/admin/adherent_type_extrafields.php +++ b/htdocs/adherents/admin/adherent_type_extrafields.php @@ -74,42 +74,7 @@ $head = member_admin_prepare_head(); dol_fiche_head($head, 'attributes_type', $langs->trans("Members"), 0, 'user'); - -print $langs->trans("DefineHereComplementaryAttributes",$textobject).'
'."\n"; -print '
'; - -// Load attribute_label -$extrafields->fetch_name_optionals_label($elementtype); - -print ""; - -print ''; -print ''; -print ''; -print ''; -print ''; -print ''; -print ''; -print ''; -print "\n"; - -$var=True; -foreach($extrafields->attribute_type as $key => $value) -{ - $var=!$var; - print ""; - print "\n"; - print "\n"; - print "\n"; - print '\n"; - print '\n"; - print '\n"; - print '\n"; - print ""; -} - -print "
'.$langs->trans("Label").''.$langs->trans("AttributeCode").''.$langs->trans("Type").''.$langs->trans("Size").''.$langs->trans("Unique").''.$langs->trans("Required").' 
".$extrafields->attribute_label[$key]."".$key."".$type2label[$extrafields->attribute_type[$key]]."'.$extrafields->attribute_size[$key]."'.yn($extrafields->attribute_unique[$key])."'.yn($extrafields->attribute_required[$key])."'.img_edit().''; - print "  ".img_delete()."
"; +require DOL_DOCUMENT_ROOT.'/core/tpl/admin_extrafields_view.tpl.php'; dol_fiche_end(); diff --git a/htdocs/admin/agenda_extrafields.php b/htdocs/admin/agenda_extrafields.php index c5f7d808302..f03af469bca 100644 --- a/htdocs/admin/agenda_extrafields.php +++ b/htdocs/admin/agenda_extrafields.php @@ -76,41 +76,7 @@ $head=agenda_prepare_head(); dol_fiche_head($head, 'attributes', $langs->trans("Agenda"), 0, 'action'); -print $langs->trans("DefineHereComplementaryAttributes", $langs->transnoentitiesnoconv("Agenda")).'
'."\n"; -print '
'; - -// Load attribute_label -$extrafields->fetch_name_optionals_label($elementtype); - -print ""; - -print ''; -print ''; -print ''; -print ''; -print ''; -print ''; -print ''; -print ''; -print "\n"; - -$var=True; -foreach($extrafields->attribute_type as $key => $value) -{ - $var=!$var; - print ""; - print "\n"; - print "\n"; - print "\n"; - print '\n"; - print '\n"; - print '\n"; - print '\n"; - print ""; -} - -print "
'.$langs->trans("Label").''.$langs->trans("AttributeCode").''.$langs->trans("Type").''.$langs->trans("Size").''.$langs->trans("Unique").''.$langs->trans("Required").' 
".$extrafields->attribute_label[$key]."".$key."".$type2label[$extrafields->attribute_type[$key]]."'.$extrafields->attribute_size[$key]."'.yn($extrafields->attribute_unique[$key])."'.yn($extrafields->attribute_required[$key])."'.img_edit().''; - print "  ".img_delete()."
"; +require DOL_DOCUMENT_ROOT.'/core/tpl/admin_extrafields_view.tpl.php'; dol_fiche_end(); diff --git a/htdocs/admin/bank_extrafields.php b/htdocs/admin/bank_extrafields.php index c896ecc5c48..5bec4097d35 100644 --- a/htdocs/admin/bank_extrafields.php +++ b/htdocs/admin/bank_extrafields.php @@ -59,6 +59,8 @@ require DOL_DOCUMENT_ROOT.'/core/actions_extrafields.inc.php'; * View */ +$textobject = $langs->transnoentitiesnoconv("Bank"); + llxHeader('',$langs->trans("BankSetupModule"),$help_url); @@ -70,45 +72,7 @@ $head = bank_admin_prepare_head(null); dol_fiche_head($head, 'attributes', $langs->trans("BankSetupModule"), 0, 'account'); - -print $langs->trans("DefineHereComplementaryAttributes",$textobject).'
'."\n"; -print '
'; - -// Load attribute_label -$extrafields->fetch_name_optionals_label($elementtype); - -print ""; - -print ''; -print ''; -print ''; -print ''; -print ''; -print ''; -print ''; -print ''; -print ''; -print "\n"; - -$var=True; -foreach($extrafields->attribute_type as $key => $value) -{ - $var=!$var; - print ""; - print "\n"; - print "\n"; - print "\n"; - print "\n"; - print '\n"; - print '\n"; - print '\n"; - print '\n"; - print ""; - // $i++; -} - -print "
'.$langs->trans("Position").''.$langs->trans("Label").''.$langs->trans("AttributeCode").''.$langs->trans("Type").''.$langs->trans("Size").''.$langs->trans("Unique").''.$langs->trans("Required").' 
".$extrafields->attribute_pos[$key]."".$extrafields->attribute_label[$key]."".$key."".$type2label[$extrafields->attribute_type[$key]]."'.$extrafields->attribute_size[$key]."'.yn($extrafields->attribute_unique[$key])."'.yn($extrafields->attribute_required[$key])."'.img_edit().''; - print "  ".img_delete()."
"; +require DOL_DOCUMENT_ROOT.'/core/tpl/admin_extrafields_view.tpl.php'; dol_fiche_end(); diff --git a/htdocs/admin/order_extrafields.php b/htdocs/admin/order_extrafields.php index 81b7e74a479..cbaee8179dd 100644 --- a/htdocs/admin/order_extrafields.php +++ b/htdocs/admin/order_extrafields.php @@ -77,42 +77,7 @@ $head = order_admin_prepare_head(); dol_fiche_head($head, 'attributes', $langs->trans("Orders"), 0, 'order'); - -print $langs->trans("DefineHereComplementaryAttributes",$textobject).'
'."\n"; -print '
'; - -// Load attribute_label -$extrafields->fetch_name_optionals_label($elementtype); - -print ""; - -print ''; -print ''; -print ''; -print ''; -print ''; -print ''; -print ''; -print ''; -print "\n"; - -$var=True; -foreach($extrafields->attribute_type as $key => $value) -{ - $var=!$var; - print ""; - print "\n"; - print "\n"; - print "\n"; - print '\n"; - print '\n"; - print '\n"; - print '\n"; - print ""; -} - -print "
'.$langs->trans("Label").''.$langs->trans("AttributeCode").''.$langs->trans("Type").''.$langs->trans("Size").''.$langs->trans("Unique").''.$langs->trans("Required").' 
".$extrafields->attribute_label[$key]."".$key."".$type2label[$extrafields->attribute_type[$key]]."'.$extrafields->attribute_size[$key]."'.yn($extrafields->attribute_unique[$key])."'.yn($extrafields->attribute_required[$key])."'.img_edit().''; - print "  ".img_delete()."
"; +require DOL_DOCUMENT_ROOT.'/core/tpl/admin_extrafields_view.tpl.php'; dol_fiche_end(); diff --git a/htdocs/admin/orderdet_extrafields.php b/htdocs/admin/orderdet_extrafields.php index 515714a51e4..dfd81b4241e 100644 --- a/htdocs/admin/orderdet_extrafields.php +++ b/htdocs/admin/orderdet_extrafields.php @@ -66,7 +66,7 @@ require DOL_DOCUMENT_ROOT.'/core/actions_extrafields.inc.php'; * View */ -$textobject=$langs->transnoentitiesnoconv("Orders"); +$textobject=$langs->transnoentitiesnoconv("OrderLines"); llxHeader('',$langs->trans("OrdersSetup")); @@ -76,44 +76,9 @@ print "
\n"; $head = order_admin_prepare_head(); -dol_fiche_head($head, 'attributeslines', $langs->trans("Orders"), 0, 'order'); +dol_fiche_head($head, 'attributeslines', $langs->trans("OrderLines"), 0, 'order'); - -print $langs->trans("DefineHereComplementaryAttributes",$textobject).'
'."\n"; -print '
'; - -// Load attribute_label -$extrafields->fetch_name_optionals_label($elementtype); - -print ""; - -print ''; -print ''; -print ''; -print ''; -print ''; -print ''; -print ''; -print ''; -print "\n"; - -$var=True; -foreach($extrafields->attribute_type as $key => $value) -{ - $var=!$var; - print ""; - print "\n"; - print "\n"; - print "\n"; - print '\n"; - print '\n"; - print '\n"; - print '\n"; - print ""; -} - -print "
'.$langs->trans("Label").''.$langs->trans("AttributeCode").''.$langs->trans("Type").''.$langs->trans("Size").''.$langs->trans("Unique").''.$langs->trans("Required").' 
".$extrafields->attribute_label[$key]."".$key."".$type2label[$extrafields->attribute_type[$key]]."'.$extrafields->attribute_size[$key]."'.yn($extrafields->attribute_unique[$key])."'.yn($extrafields->attribute_required[$key])."'.img_edit().''; - print "  ".img_delete()."
"; +require DOL_DOCUMENT_ROOT.'/core/tpl/admin_extrafields_view.tpl.php'; dol_fiche_end(); diff --git a/htdocs/admin/supplierinvoice_extrafields.php b/htdocs/admin/supplierinvoice_extrafields.php index e1f71d8d147..bff385cfb45 100644 --- a/htdocs/admin/supplierinvoice_extrafields.php +++ b/htdocs/admin/supplierinvoice_extrafields.php @@ -81,42 +81,7 @@ $head = supplierorder_admin_prepare_head(); dol_fiche_head($head, 'supplierinvoice', $langs->trans("Suppliers"), 0, 'company'); - -print $langs->trans("DefineHereComplementaryAttributes",$textobject).'
'."\n"; -print '
'; - -// Load attribute_label -$extrafields->fetch_name_optionals_label($elementtype); - -print ""; - -print ''; -print ''; -print ''; -print ''; -print ''; -print ''; -print ''; -print ''; -print "\n"; - -$var=True; -foreach($extrafields->attribute_type as $key => $value) -{ - $var=!$var; - print ""; - print "\n"; - print "\n"; - print "\n"; - print '\n"; - print '\n"; - print '\n"; - print '\n"; - print ""; -} - -print "
'.$langs->trans("Label").''.$langs->trans("AttributeCode").''.$langs->trans("Type").''.$langs->trans("Size").''.$langs->trans("Unique").''.$langs->trans("Required").' 
".$extrafields->attribute_label[$key]."".$key."".$type2label[$extrafields->attribute_type[$key]]."'.$extrafields->attribute_size[$key]."'.yn($extrafields->attribute_unique[$key])."'.yn($extrafields->attribute_required[$key])."'.img_edit().''; - print "  ".img_delete()."
"; +require DOL_DOCUMENT_ROOT.'/core/tpl/admin_extrafields_view.tpl.php'; dol_fiche_end(); diff --git a/htdocs/admin/supplierinvoicedet_extrafields.php b/htdocs/admin/supplierinvoicedet_extrafields.php index 3596fc50d72..e05ed75bb0f 100644 --- a/htdocs/admin/supplierinvoicedet_extrafields.php +++ b/htdocs/admin/supplierinvoicedet_extrafields.php @@ -81,42 +81,7 @@ $head = supplierorder_admin_prepare_head(); dol_fiche_head($head, 'supplierinvoicedet', $langs->trans("Suppliers"), 0, 'company'); - -print $langs->trans("DefineHereComplementaryAttributes",$textobject).'
'."\n"; -print '
'; - -// Load attribute_label -$extrafields->fetch_name_optionals_label($elementtype); - -print ""; - -print ''; -print ''; -print ''; -print ''; -print ''; -print ''; -print ''; -print ''; -print "\n"; - -$var=True; -foreach($extrafields->attribute_type as $key => $value) -{ - $var=!$var; - print ""; - print "\n"; - print "\n"; - print "\n"; - print '\n"; - print '\n"; - print '\n"; - print '\n"; - print ""; -} - -print "
'.$langs->trans("Label").''.$langs->trans("AttributeCode").''.$langs->trans("Type").''.$langs->trans("Size").''.$langs->trans("Unique").''.$langs->trans("Required").' 
".$extrafields->attribute_label[$key]."".$key."".$type2label[$extrafields->attribute_type[$key]]."'.$extrafields->attribute_size[$key]."'.yn($extrafields->attribute_unique[$key])."'.yn($extrafields->attribute_required[$key])."'.img_edit().''; - print "  ".img_delete()."
"; +require DOL_DOCUMENT_ROOT.'/core/tpl/admin_extrafields_view.tpl.php'; dol_fiche_end(); diff --git a/htdocs/admin/supplierorder_extrafields.php b/htdocs/admin/supplierorder_extrafields.php index 96e20b92f17..c62d05a3e32 100644 --- a/htdocs/admin/supplierorder_extrafields.php +++ b/htdocs/admin/supplierorder_extrafields.php @@ -77,42 +77,7 @@ $head = supplierorder_admin_prepare_head(); dol_fiche_head($head, 'supplierorder', $langs->trans("Suppliers"), 0, 'company'); - -print $langs->trans("DefineHereComplementaryAttributes",$textobject).'
'."\n"; -print '
'; - -// Load attribute_label -$extrafields->fetch_name_optionals_label($elementtype); - -print ""; - -print ''; -print ''; -print ''; -print ''; -print ''; -print ''; -print ''; -print ''; -print "\n"; - -$var=True; -foreach($extrafields->attribute_type as $key => $value) -{ - $var=!$var; - print ""; - print "\n"; - print "\n"; - print "\n"; - print '\n"; - print '\n"; - print '\n"; - print '\n"; - print ""; -} - -print "
'.$langs->trans("Label").''.$langs->trans("AttributeCode").''.$langs->trans("Type").''.$langs->trans("Size").''.$langs->trans("Unique").''.$langs->trans("Required").' 
".$extrafields->attribute_label[$key]."".$key."".$type2label[$extrafields->attribute_type[$key]]."'.$extrafields->attribute_size[$key]."'.yn($extrafields->attribute_unique[$key])."'.yn($extrafields->attribute_required[$key])."'.img_edit().''; - print "  ".img_delete()."
"; +require DOL_DOCUMENT_ROOT.'/core/tpl/admin_extrafields_view.tpl.php'; dol_fiche_end(); diff --git a/htdocs/admin/supplierorderdet_extrafields.php b/htdocs/admin/supplierorderdet_extrafields.php index 20066aafab1..2b8364ea297 100644 --- a/htdocs/admin/supplierorderdet_extrafields.php +++ b/htdocs/admin/supplierorderdet_extrafields.php @@ -78,42 +78,7 @@ $head = supplierorder_admin_prepare_head(); dol_fiche_head($head, 'supplierorderdet', $langs->trans("Suppliers"), 0, 'company'); - -print $langs->trans("DefineHereComplementaryAttributes",$textobject).'
'."\n"; -print '
'; - -// Load attribute_label -$extrafields->fetch_name_optionals_label($elementtype); - -print ""; - -print ''; -print ''; -print ''; -print ''; -print ''; -print ''; -print ''; -print ''; -print "\n"; - -$var=True; -foreach($extrafields->attribute_type as $key => $value) -{ - $var=!$var; - print ""; - print "\n"; - print "\n"; - print "\n"; - print '\n"; - print '\n"; - print '\n"; - print '\n"; - print ""; -} - -print "
'.$langs->trans("Label").''.$langs->trans("AttributeCode").''.$langs->trans("Type").''.$langs->trans("Size").''.$langs->trans("Unique").''.$langs->trans("Required").' 
".$extrafields->attribute_label[$key]."".$key."".$type2label[$extrafields->attribute_type[$key]]."'.$extrafields->attribute_size[$key]."'.yn($extrafields->attribute_unique[$key])."'.yn($extrafields->attribute_required[$key])."'.img_edit().''; - print "  ".img_delete()."
"; +require DOL_DOCUMENT_ROOT.'/core/tpl/admin_extrafields_view.tpl.php'; dol_fiche_end(); diff --git a/htdocs/categories/admin/categorie_extrafields.php b/htdocs/categories/admin/categorie_extrafields.php index 712f60f25cd..c57fae8c311 100644 --- a/htdocs/categories/admin/categorie_extrafields.php +++ b/htdocs/categories/admin/categorie_extrafields.php @@ -69,42 +69,7 @@ $head = categoriesadmin_prepare_head(); dol_fiche_head($head, 'attributes_categories', $langs->trans("Categories"), 0, 'category'); -print $langs->trans("DefineHereComplementaryAttributes",$textobject).'
'."\n"; -print '
'; - -// Load attribute_label -$extrafields->fetch_name_optionals_label($elementtype); - -print ""; - -print ''; -print ''; -print ''; -print ''; -print ''; -print ''; -print ''; -print ''; -print "\n"; - -$var=True; -foreach($extrafields->attribute_type as $key => $value) -{ - $var=!$var; - print ""; - print "\n"; - print "\n"; - print "\n"; - print '\n"; - print '\n"; - print '\n"; - print '\n"; - print ""; - // $i++; -} - -print "
'.$langs->trans("Label").''.$langs->trans("AttributeCode").''.$langs->trans("Type").''.$langs->trans("Size").''.$langs->trans("Unique").''.$langs->trans("Required").' 
".$extrafields->attribute_label[$key]."".$key."".$type2label[$extrafields->attribute_type[$key]]."'.$extrafields->attribute_size[$key]."'.yn($extrafields->attribute_unique[$key])."'.yn($extrafields->attribute_required[$key])."'.img_edit().''; - print "  ".img_delete()."
"; +require DOL_DOCUMENT_ROOT.'/core/tpl/admin_extrafields_view.tpl.php'; dol_fiche_end(); diff --git a/htdocs/comm/admin/propal_extrafields.php b/htdocs/comm/admin/propal_extrafields.php index 2a1a2286db5..304fbc45a3e 100644 --- a/htdocs/comm/admin/propal_extrafields.php +++ b/htdocs/comm/admin/propal_extrafields.php @@ -61,10 +61,8 @@ require DOL_DOCUMENT_ROOT.'/core/actions_extrafields.inc.php'; $textobject=$langs->transnoentitiesnoconv("Proposals"); - llxHeader('',$langs->trans("PropalSetup")); - $linkback=''.$langs->trans("BackToModuleList").''; print_fiche_titre($langs->trans("PropalSetup"),$linkback,'setup'); @@ -73,45 +71,7 @@ $head = propal_admin_prepare_head(); dol_fiche_head($head, 'attributes', $langs->trans("Proposals"), 0, 'propal'); - -print $langs->trans("DefineHereComplementaryAttributes",$textobject).'
'."\n"; -print '
'; - -// Load attribute_label -$extrafields->fetch_name_optionals_label($elementtype); - -print ""; - -print ''; -print ''; -print ''; -print ''; -print ''; -print ''; -print ''; -print ''; -print ''; -print "\n"; - -$var=True; -foreach($extrafields->attribute_type as $key => $value) -{ - $var=!$var; - print ""; - print "\n"; - print "\n"; - print "\n"; - print "\n"; - print '\n"; - print '\n"; - print '\n"; - print '\n"; - print ""; - // $i++; -} - -print "
'.$langs->trans("Position").''.$langs->trans("Label").''.$langs->trans("AttributeCode").''.$langs->trans("Type").''.$langs->trans("Size").''.$langs->trans("Unique").''.$langs->trans("Required").' 
".$extrafields->attribute_pos[$key]."".$extrafields->attribute_label[$key]."".$key."".$type2label[$extrafields->attribute_type[$key]]."'.$extrafields->attribute_size[$key]."'.yn($extrafields->attribute_unique[$key])."'.yn($extrafields->attribute_required[$key])."'.img_edit().''; - print "  ".img_delete()."
"; +require DOL_DOCUMENT_ROOT.'/core/tpl/admin_extrafields_view.tpl.php'; dol_fiche_end(); diff --git a/htdocs/comm/admin/propaldet_extrafields.php b/htdocs/comm/admin/propaldet_extrafields.php index 40dbad4ef94..fed0eb6b98a 100644 --- a/htdocs/comm/admin/propaldet_extrafields.php +++ b/htdocs/comm/admin/propaldet_extrafields.php @@ -78,42 +78,7 @@ $head = propal_admin_prepare_head(); dol_fiche_head($head, 'attributeslines', $langs->trans("Proposals"), 0, 'propal'); - -print $langs->trans("DefineHereComplementaryAttributes",$textobject).'
'."\n"; -print '
'; - -// Load attribute_label -$extrafields->fetch_name_optionals_label($elementtype); - -print ""; - -print ''; -print ''; -print ''; -print ''; -print ''; -print ''; -print ''; -print ''; -print "\n"; - -$var=True; -foreach($extrafields->attribute_type as $key => $value) -{ - $var=!$var; - print ""; - print "\n"; - print "\n"; - print "\n"; - print '\n"; - print '\n"; - print '\n"; - print '\n"; - print ""; -} - -print "
'.$langs->trans("Label").''.$langs->trans("AttributeCode").''.$langs->trans("Type").''.$langs->trans("Size").''.$langs->trans("Unique").''.$langs->trans("Required").' 
".$extrafields->attribute_label[$key]."".$key."".$type2label[$extrafields->attribute_type[$key]]."'.$extrafields->attribute_size[$key]."'.yn($extrafields->attribute_unique[$key])."'.yn($extrafields->attribute_required[$key])."'.img_edit().''; - print "  ".img_delete()."
"; +require DOL_DOCUMENT_ROOT.'/core/tpl/admin_extrafields_view.tpl.php'; dol_fiche_end(); diff --git a/htdocs/compta/facture/admin/facture_cust_extrafields.php b/htdocs/compta/facture/admin/facture_cust_extrafields.php index 6d60180593a..bc1933f9959 100644 --- a/htdocs/compta/facture/admin/facture_cust_extrafields.php +++ b/htdocs/compta/facture/admin/facture_cust_extrafields.php @@ -62,10 +62,8 @@ require DOL_DOCUMENT_ROOT.'/core/actions_extrafields.inc.php'; $textobject=strtolower($langs->transnoentitiesnoconv("BillsCustomers")); - llxHeader('',$langs->trans("BillsSetup")); - $linkback=''.$langs->trans("BackToModuleList").''; print_fiche_titre($langs->trans("BillsSetup"),$linkback,'setup'); print '
'; @@ -74,44 +72,7 @@ $head = invoice_admin_prepare_head(); dol_fiche_head($head, 'attributes', $langs->trans("Invoices"), 0, 'invoice'); - -print $langs->trans("DefineHereComplementaryAttributes",$textobject).'

'."\n"; - -// Load attribute_label -$extrafields->fetch_name_optionals_label($elementtype); - -print ""; - -print ''; -print ''; -print ''; -print ''; -print ''; -print ''; -print ''; -print ''; -print ''; -print "\n"; - -$var=True; -foreach($extrafields->attribute_type as $key => $value) -{ - $var=!$var; - print ""; - print "\n"; - print "\n"; - print "\n"; - print "\n"; - print '\n"; - print '\n"; - print '\n"; - print '\n"; - print ""; - // $i++; -} - -print "
'.$langs->trans("Position").''.$langs->trans("Label").''.$langs->trans("AttributeCode").''.$langs->trans("Type").''.$langs->trans("Size").''.$langs->trans("Unique").''.$langs->trans("Required").' 
".$extrafields->attribute_pos[$key]."".$extrafields->attribute_label[$key]."".$key."".$type2label[$extrafields->attribute_type[$key]]."'.$extrafields->attribute_size[$key]."'.yn($extrafields->attribute_unique[$key])."'.yn($extrafields->attribute_required[$key])."'.img_edit().''; - print "  ".img_delete()."
"; +require DOL_DOCUMENT_ROOT.'/core/tpl/admin_extrafields_view.tpl.php'; dol_fiche_end(); @@ -147,7 +108,7 @@ if ($action == 'create') if ($action == 'edit' && ! empty($attrname)) { $langs->load("members"); - + print "
"; print_titre($langs->trans("FieldEdition", $attrname)); diff --git a/htdocs/compta/facture/admin/facturedet_cust_extrafields.php b/htdocs/compta/facture/admin/facturedet_cust_extrafields.php index fd4284a01dd..67efab746bf 100644 --- a/htdocs/compta/facture/admin/facturedet_cust_extrafields.php +++ b/htdocs/compta/facture/admin/facturedet_cust_extrafields.php @@ -63,10 +63,8 @@ require DOL_DOCUMENT_ROOT.'/core/actions_extrafields.inc.php'; $textobject=strtolower($langs->transnoentitiesnoconv("BillsCustomers")); - llxHeader('',$langs->trans("BillsSetup")); - $linkback=''.$langs->trans("BackToModuleList").''; print_fiche_titre($langs->trans("BillsSetup"),$linkback,'setup'); print '
'; @@ -75,44 +73,7 @@ $head = invoice_admin_prepare_head(); dol_fiche_head($head, 'attributeslines', $langs->trans("Invoices"), 0, 'invoice'); - -print $langs->trans("DefineHereComplementaryAttributes",$textobject).'

'."\n"; - -// Load attribute_label -$extrafields->fetch_name_optionals_label($elementtype); - -print ""; - -print ''; -print ''; -print ''; -print ''; -print ''; -print ''; -print ''; -print ''; -print ''; -print "\n"; - -$var=True; -foreach($extrafields->attribute_type as $key => $value) -{ - $var=!$var; - print ""; - print "\n"; - print "\n"; - print "\n"; - print "\n"; - print '\n"; - print '\n"; - print '\n"; - print '\n"; - print ""; - // $i++; -} - -print "
'.$langs->trans("Position").''.$langs->trans("Label").''.$langs->trans("AttributeCode").''.$langs->trans("Type").''.$langs->trans("Size").''.$langs->trans("Unique").''.$langs->trans("Required").' 
".$extrafields->attribute_pos[$key]."".$extrafields->attribute_label[$key]."".$key."".$type2label[$extrafields->attribute_type[$key]]."'.$extrafields->attribute_size[$key]."'.yn($extrafields->attribute_unique[$key])."'.yn($extrafields->attribute_required[$key])."'.img_edit().''; - print "  ".img_delete()."
"; +require DOL_DOCUMENT_ROOT.'/core/tpl/admin_extrafields_view.tpl.php'; dol_fiche_end(); diff --git a/htdocs/contrat/admin/contract_extrafields.php b/htdocs/contrat/admin/contract_extrafields.php index afb86224151..39e72a9a2f7 100644 --- a/htdocs/contrat/admin/contract_extrafields.php +++ b/htdocs/contrat/admin/contract_extrafields.php @@ -62,10 +62,10 @@ require DOL_DOCUMENT_ROOT.'/core/actions_extrafields.inc.php'; * View */ +$textobject = $langs->transnoentitiesnoconv('Contracts'); llxHeader(); - $linkback=''.$langs->trans("BackToModuleList").''; print_fiche_titre($langs->trans("ContractsSetup"),$linkback,'setup'); @@ -74,46 +74,7 @@ $head=contract_admin_prepare_head(); dol_fiche_head($head, 'attributes', $langs->trans("Contracts"), 0, 'contract'); -$textobject = $langs->transnoentitiesnoconv('Contracts'); - -print $langs->trans("DefineHereComplementaryAttributes",$textobject).'
'."\n"; -print '
'; - -// Load attribute_label -$extrafields->fetch_name_optionals_label($elementtype); - -print ""; - -print ''; -print ''; -print ''; -print ''; -print ''; -print ''; -print ''; -print ''; -print ''; -print "\n"; - -$var=True; -foreach($extrafields->attribute_type as $key => $value) -{ - $var=!$var; - print ""; - print "\n"; - print "\n"; - print "\n"; - print "\n"; - print '\n"; - print '\n"; - print '\n"; - print '\n"; - print ""; - // $i++; -} - -print "
'.$langs->trans("Position").''.$langs->trans("Label").''.$langs->trans("AttributeCode").''.$langs->trans("Type").''.$langs->trans("Size").''.$langs->trans("Unique").''.$langs->trans("Required").' 
".$extrafields->attribute_pos[$key]."".$extrafields->attribute_label[$key]."".$key."".$type2label[$extrafields->attribute_type[$key]]."'.$extrafields->attribute_size[$key]."'.yn($extrafields->attribute_unique[$key])."'.yn($extrafields->attribute_required[$key])."'.img_edit().''; - print "  ".img_delete()."
"; +require DOL_DOCUMENT_ROOT.'/core/tpl/admin_extrafields_view.tpl.php'; dol_fiche_end(); diff --git a/htdocs/contrat/admin/contractdet_extrafields.php b/htdocs/contrat/admin/contractdet_extrafields.php index 21f27cee6d9..839700e8416 100644 --- a/htdocs/contrat/admin/contractdet_extrafields.php +++ b/htdocs/contrat/admin/contractdet_extrafields.php @@ -62,10 +62,10 @@ require DOL_DOCUMENT_ROOT.'/core/actions_extrafields.inc.php'; * View */ +$textobject = $langs->transnoentitiesnoconv('Contracts'); llxHeader(); - $linkback=''.$langs->trans("BackToModuleList").''; print_fiche_titre($langs->trans("ContractsSetup"),$linkback,'setup'); @@ -74,46 +74,7 @@ $head=contract_admin_prepare_head(); dol_fiche_head($head, 'attributeslines', $langs->trans("Contracts"), 0, 'contract'); -$textobject = $langs->transnoentitiesnoconv('Contracts'); - -print $langs->trans("DefineHereComplementaryAttributes",$textobject).'
'."\n"; -print '
'; - -// Load attribute_label -$extrafields->fetch_name_optionals_label($elementtype); - -print ""; - -print ''; -print ''; -print ''; -print ''; -print ''; -print ''; -print ''; -print ''; -print ''; -print "\n"; - -$var=True; -foreach($extrafields->attribute_type as $key => $value) -{ - $var=!$var; - print ""; - print "\n"; - print "\n"; - print "\n"; - print "\n"; - print '\n"; - print '\n"; - print '\n"; - print '\n"; - print ""; - // $i++; -} - -print "
'.$langs->trans("Position").''.$langs->trans("Label").''.$langs->trans("AttributeCode").''.$langs->trans("Type").''.$langs->trans("Size").''.$langs->trans("Unique").''.$langs->trans("Required").' 
".$extrafields->attribute_pos[$key]."".$extrafields->attribute_label[$key]."".$key."".$type2label[$extrafields->attribute_type[$key]]."'.$extrafields->attribute_size[$key]."'.yn($extrafields->attribute_unique[$key])."'.yn($extrafields->attribute_required[$key])."'.img_edit().''; - print "  ".img_delete()."
"; +require DOL_DOCUMENT_ROOT.'/core/tpl/admin_extrafields_view.tpl.php'; dol_fiche_end(); diff --git a/htdocs/core/tpl/admin_extrafields.tpl.php b/htdocs/core/tpl/admin_extrafields.tpl.php deleted file mode 100644 index f8f28da5cc2..00000000000 --- a/htdocs/core/tpl/admin_extrafields.tpl.php +++ /dev/null @@ -1,44 +0,0 @@ - - * Copyright (C) 2012 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 3 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, see . - */ -?> - - - - diff --git a/htdocs/core/tpl/admin_extrafields_add.tpl.php b/htdocs/core/tpl/admin_extrafields_add.tpl.php index 8f14bff797f..1f61064183b 100644 --- a/htdocs/core/tpl/admin_extrafields_add.tpl.php +++ b/htdocs/core/tpl/admin_extrafields_add.tpl.php @@ -112,4 +112,4 @@ - + diff --git a/htdocs/core/tpl/admin_extrafields_edit.tpl.php b/htdocs/core/tpl/admin_extrafields_edit.tpl.php index 9cf186de39f..13a6486aa4f 100644 --- a/htdocs/core/tpl/admin_extrafields_edit.tpl.php +++ b/htdocs/core/tpl/admin_extrafields_edit.tpl.php @@ -121,4 +121,4 @@ if(($type == 'select') || ($type == 'sellist') || ($type == 'checkbox') || ($typ - + diff --git a/htdocs/core/tpl/admin_extrafields_view.tpl.php b/htdocs/core/tpl/admin_extrafields_view.tpl.php new file mode 100644 index 00000000000..a5890e36ea2 --- /dev/null +++ b/htdocs/core/tpl/admin_extrafields_view.tpl.php @@ -0,0 +1,72 @@ + + * Copyright (C) 2012 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 3 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, see . + */ + +/* To call this template, you must define + * $textobject + * $langs + * $extrafield + * $elementtype + */ +?> + + +trans("DefineHereComplementaryAttributes",$textobject).'
'."\n"; +print '
'; + +// Load attribute_label +$extrafields->fetch_name_optionals_label($elementtype); + +print ""; + +print ''; +print ''; +print ''; +print ''; +print ''; +print ''; +print ''; +print ''; +print ''; +print ''; +print "\n"; + +$var=True; +foreach($extrafields->attribute_type as $key => $value) +{ + $var=!$var; + print ""; + print "\n"; + print "\n"; + print "\n"; + print "\n"; + print '\n"; + print '\n"; + print '\n"; + print '\n"; + print '\n"; + print ""; + // $i++; +} + +print "
'.$langs->trans("Position").''.$langs->trans("Label").''.$langs->trans("AttributeCode").''.$langs->trans("Type").''.$langs->trans("Size").''.$langs->trans("Unique").''.$langs->trans("Required").''.$langs->trans("AlwaysEditable").' 
".$extrafields->attribute_pos[$key]."".$extrafields->attribute_label[$key]."".$key."".$type2label[$extrafields->attribute_type[$key]]."'.$extrafields->attribute_size[$key]."'.yn($extrafields->attribute_unique[$key])."'.yn($extrafields->attribute_required[$key])."'.yn($extrafields->attribute_alwayseditable[$key])."'.img_edit().''; + print "  ".img_delete()."
"; + +?> + diff --git a/htdocs/fichinter/admin/fichinter_extrafields.php b/htdocs/fichinter/admin/fichinter_extrafields.php index 8cb95a30f63..c5420948ab3 100644 --- a/htdocs/fichinter/admin/fichinter_extrafields.php +++ b/htdocs/fichinter/admin/fichinter_extrafields.php @@ -62,60 +62,18 @@ require DOL_DOCUMENT_ROOT.'/core/actions_extrafields.inc.php'; * View */ +$textobject=$langs->transnoentitiesnoconv("Interventions"); llxHeader(); -$textobject=$langs->transnoentitiesnoconv("Interventions"); - $linkback=''.$langs->trans("BackToModuleList").''; print_fiche_titre($langs->trans("InterventionsSetup"),$linkback,'setup'); - $head=fichinter_admin_prepare_head(); dol_fiche_head($head, 'attributes', $langs->trans("Interventions"), 0, 'intervention'); - -print $langs->trans("DefineHereComplementaryAttributes",$textobject).'
'."\n"; -print '
'; - -// Load attribute_label -$extrafields->fetch_name_optionals_label($elementtype); - -print ""; - -print ''; -print ''; -print ''; -print ''; -print ''; -print ''; -print ''; -print ''; -print ''; -print ''; -print "\n"; - -$var=True; -foreach($extrafields->attribute_type as $key => $value) -{ - $var=!$var; - print ""; - print "\n"; - print "\n"; - print "\n"; - print "\n"; - print '\n"; - print '\n"; - print '\n"; - print '\n"; // TODO This must be generalised into all page to admin extrafield. Mutualize code here is easy and will save a lot of code - print '\n"; - print ""; - // $i++; -} - -print "
'.$langs->trans("Position").''.$langs->trans("Label").''.$langs->trans("AttributeCode").''.$langs->trans("Type").''.$langs->trans("Size").''.$langs->trans("Unique").''.$langs->trans("Required").''.$langs->trans("AlwaysEditable").' 
".$extrafields->attribute_pos[$key]."".$extrafields->attribute_label[$key]."".$key."".$type2label[$extrafields->attribute_type[$key]]."'.$extrafields->attribute_size[$key]."'.yn($extrafields->attribute_unique[$key])."'.yn($extrafields->attribute_required[$key])."'.yn($extrafields->attribute_alwayseditable[$key])."'.img_edit().''; - print "  ".img_delete()."
"; +require DOL_DOCUMENT_ROOT.'/core/tpl/admin_extrafields_view.tpl.php'; dol_fiche_end(); diff --git a/htdocs/fichinter/admin/fichinterdet_extrafields.php b/htdocs/fichinter/admin/fichinterdet_extrafields.php index 7f8b5193631..aaaa497f959 100644 --- a/htdocs/fichinter/admin/fichinterdet_extrafields.php +++ b/htdocs/fichinter/admin/fichinterdet_extrafields.php @@ -62,11 +62,10 @@ require DOL_DOCUMENT_ROOT.'/core/actions_extrafields.inc.php'; * View */ +$textobject=$langs->transnoentitiesnoconv("Interventions"); llxHeader(); -$textobject=$langs->transnoentitiesnoconv("Interventions"); - $linkback=''.$langs->trans("BackToModuleList").''; print_fiche_titre($langs->trans("InterventionsSetup"),$linkback,'setup'); @@ -75,45 +74,7 @@ $head=fichinter_admin_prepare_head(); dol_fiche_head($head, 'attributesdet', $langs->trans("Interventions"), 0, 'intervention'); - -print $langs->trans("DefineHereComplementaryAttributes",$textobject).'
'."\n"; -print '
'; - -// Load attribute_label -$extrafields->fetch_name_optionals_label($elementtype); - -print ""; - -print ''; -print ''; -print ''; -print ''; -print ''; -print ''; -print ''; -print ''; -print ''; -print "\n"; - -$var=True; -foreach($extrafields->attribute_type as $key => $value) -{ - $var=!$var; - print ""; - print "\n"; - print "\n"; - print "\n"; - print "\n"; - print '\n"; - print '\n"; - print '\n"; - print '\n"; - print ""; - // $i++; -} - -print "
'.$langs->trans("Position").''.$langs->trans("Label").''.$langs->trans("AttributeCode").''.$langs->trans("Type").''.$langs->trans("Size").''.$langs->trans("Unique").''.$langs->trans("Required").' 
".$extrafields->attribute_pos[$key]."".$extrafields->attribute_label[$key]."".$key."".$type2label[$extrafields->attribute_type[$key]]."'.$extrafields->attribute_size[$key]."'.yn($extrafields->attribute_unique[$key])."'.yn($extrafields->attribute_required[$key])."'.img_edit().''; - print "  ".img_delete()."
"; +require DOL_DOCUMENT_ROOT.'/core/tpl/admin_extrafields_view.tpl.php'; dol_fiche_end(); diff --git a/htdocs/product/admin/product_extrafields.php b/htdocs/product/admin/product_extrafields.php index ed4ac4d2921..1fc46069241 100644 --- a/htdocs/product/admin/product_extrafields.php +++ b/htdocs/product/admin/product_extrafields.php @@ -61,16 +61,16 @@ require DOL_DOCUMENT_ROOT.'/core/actions_extrafields.inc.php'; */ $title = $langs->trans('ProductServiceSetup'); -$tab = $langs->trans("ProductsAndServices"); +$textobject = $langs->trans("ProductsAndServices"); if (empty($conf->produit->enabled)) { $title = $langs->trans('ServiceSetup'); - $tab = $langs->trans('Services'); + $textobject = $langs->trans('Services'); } else if (empty($conf->service->enabled)) { $title = $langs->trans('ProductSetup'); - $tab = $langs->trans('Products'); + $textobject = $langs->trans('Products'); } $help_url='EN:Module Third Parties setup|FR:Paramétrage_du_module_Tiers'; @@ -83,45 +83,9 @@ print_fiche_titre($title,$linkback,'setup'); $head = product_admin_prepare_head(); -dol_fiche_head($head, 'attributes', $tab, 0, 'product'); +dol_fiche_head($head, 'attributes', $textobject, 0, 'product'); - -print $langs->trans('DefineHereComplementaryAttributes', $tab).'
'."\n"; -print '
'; - -// Load attribute_label -$extrafields->fetch_name_optionals_label($elementtype); - -print ""; - -print ''; -print ''; -print ''; -print ''; -print ''; -print ''; -print ''; -print ''; -print "\n"; - -$var=True; -foreach($extrafields->attribute_type as $key => $value) -{ - $var=!$var; - print ""; - print "\n"; - print "\n"; - print "\n"; - print '\n"; - print '\n"; - print '\n"; - print '\n"; - print ""; - // $i++; -} - -print "
'.$langs->trans("Label").''.$langs->trans("AttributeCode").''.$langs->trans("Type").''.$langs->trans("Size").''.$langs->trans("Unique").''.$langs->trans("Required").' 
".$extrafields->attribute_label[$key]."".$key."".$type2label[$extrafields->attribute_type[$key]]."'.$extrafields->attribute_size[$key]."'.yn($extrafields->attribute_unique[$key])."'.yn($extrafields->attribute_required[$key])."'.img_edit().''; - print "  ".img_delete()."
"; +require DOL_DOCUMENT_ROOT.'/core/tpl/admin_extrafields_view.tpl.php'; dol_fiche_end(); diff --git a/htdocs/projet/admin/project_extrafields.php b/htdocs/projet/admin/project_extrafields.php index f4dde012d96..8c8b8af0971 100644 --- a/htdocs/projet/admin/project_extrafields.php +++ b/htdocs/projet/admin/project_extrafields.php @@ -59,8 +59,9 @@ require DOL_DOCUMENT_ROOT.'/core/actions_extrafields.inc.php'; * View */ -llxHeader("",$langs->trans("ProjectsSetup")); +$textobject=$langs->transnoentitiesnoconv("Project"); +llxHeader("",$langs->trans("ProjectsSetup")); $linkback=''.$langs->trans("BackToModuleList").''; print_fiche_titre($langs->trans("ProjectsSetup"),$linkback,'setup'); @@ -70,43 +71,7 @@ $head = project_admin_prepare_head(); dol_fiche_head($head, 'attributes', $langs->trans("Projects"), 0, 'project'); -$textobject=$langs->transnoentitiesnoconv("Project"); - -print $langs->trans("DefineHereComplementaryAttributes",$textobject).'
'."\n"; -print '
'; - -// Load attribute_label -$extrafields->fetch_name_optionals_label($elementtype); - -print ""; - -print ''; -print ''; -print ''; -print ''; -print ''; -print ''; -print ''; -print ''; -print "\n"; - -$var=True; -foreach($extrafields->attribute_type as $key => $value) -{ - $var=!$var; - print ""; - print "\n"; - print "\n"; - print "\n"; - print '\n"; - print '\n"; - print '\n"; - print '\n"; - print ""; -} - -print "
'.$langs->trans("Label").''.$langs->trans("AttributeCode").''.$langs->trans("Type").''.$langs->trans("Size").''.$langs->trans("Unique").''.$langs->trans("Required").' 
".$extrafields->attribute_label[$key]."".$key."".$type2label[$extrafields->attribute_type[$key]]."'.$extrafields->attribute_size[$key]."'.yn($extrafields->attribute_unique[$key])."'.yn($extrafields->attribute_required[$key])."'.img_edit().''; - print "  ".img_delete()."
"; +require DOL_DOCUMENT_ROOT.'/core/tpl/admin_extrafields_view.tpl.php'; dol_fiche_end(); diff --git a/htdocs/projet/admin/project_task_extrafields.php b/htdocs/projet/admin/project_task_extrafields.php index 902b86df3b7..33101bcee6b 100644 --- a/htdocs/projet/admin/project_task_extrafields.php +++ b/htdocs/projet/admin/project_task_extrafields.php @@ -59,8 +59,9 @@ require DOL_DOCUMENT_ROOT.'/core/actions_extrafields.inc.php'; * View */ -llxHeader("",$langs->trans("ProjectsSetup")); +$textobject=$langs->transnoentitiesnoconv("Project"); +llxHeader("",$langs->trans("ProjectsSetup")); $linkback=''.$langs->trans("BackToModuleList").''; print_fiche_titre($langs->trans("ProjectsSetup"),$linkback,'setup'); @@ -68,43 +69,8 @@ print_fiche_titre($langs->trans("ProjectsSetup"),$linkback,'setup'); $head = project_admin_prepare_head(); dol_fiche_head($head, 'attributes_task', $langs->trans("Projects"), 0, 'project'); -$textobject=$langs->transnoentitiesnoconv("Project"); -print $langs->trans("DefineHereComplementaryAttributes",$textobject).'
'."\n"; -print '
'; - -// Load attribute_label -$extrafields->fetch_name_optionals_label($elementtype); - -print ""; - -print ''; -print ''; -print ''; -print ''; -print ''; -print ''; -print ''; -print ''; -print "\n"; - -$var=True; -foreach($extrafields->attribute_type as $key => $value) -{ - $var=!$var; - print ""; - print "\n"; - print "\n"; - print "\n"; - print '\n"; - print '\n"; - print '\n"; - print '\n"; - print ""; -} - -print "
'.$langs->trans("Label").''.$langs->trans("AttributeCode").''.$langs->trans("Type").''.$langs->trans("Size").''.$langs->trans("Unique").''.$langs->trans("Required").' 
".$extrafields->attribute_label[$key]."".$key."".$type2label[$extrafields->attribute_type[$key]]."'.$extrafields->attribute_size[$key]."'.yn($extrafields->attribute_unique[$key])."'.yn($extrafields->attribute_required[$key])."'.img_edit().''; - print "  ".img_delete()."
"; +require DOL_DOCUMENT_ROOT.'/core/tpl/admin_extrafields_view.tpl.php'; dol_fiche_end(); diff --git a/htdocs/societe/admin/contact_extrafields.php b/htdocs/societe/admin/contact_extrafields.php index a0b72c80aea..f82cb01ac51 100644 --- a/htdocs/societe/admin/contact_extrafields.php +++ b/htdocs/societe/admin/contact_extrafields.php @@ -72,43 +72,7 @@ $head = societe_admin_prepare_head(); dol_fiche_head($head, 'attributes_contacts', $langs->trans("ThirdParties"), 0, 'company'); - -print $langs->trans("DefineHereComplementaryAttributes",$textobject).'
'."\n"; -print '
'; - -// Load attribute_label -$extrafields->fetch_name_optionals_label($elementtype); - -print ""; - -print ''; -print ''; -print ''; -print ''; -print ''; -print ''; -print ''; -print ''; -print "\n"; - -$var=True; -foreach($extrafields->attribute_type as $key => $value) -{ - $var=!$var; - print ""; - print "\n"; - print "\n"; - print "\n"; - print '\n"; - print '\n"; - print '\n"; - print '\n"; - print ""; - // $i++; -} - -print "
'.$langs->trans("Label").''.$langs->trans("AttributeCode").''.$langs->trans("Type").''.$langs->trans("Size").''.$langs->trans("Unique").''.$langs->trans("Required").' 
".$extrafields->attribute_label[$key]."".$key."".$type2label[$extrafields->attribute_type[$key]]."'.$extrafields->attribute_size[$key]."'.yn($extrafields->attribute_unique[$key])."'.yn($extrafields->attribute_required[$key])."'.img_edit().''; - print "  ".img_delete()."
"; +require DOL_DOCUMENT_ROOT.'/core/tpl/admin_extrafields_view.tpl.php'; dol_fiche_end(); diff --git a/htdocs/societe/admin/societe_extrafields.php b/htdocs/societe/admin/societe_extrafields.php index b6485e0d489..928cac01f7c 100644 --- a/htdocs/societe/admin/societe_extrafields.php +++ b/htdocs/societe/admin/societe_extrafields.php @@ -73,45 +73,7 @@ $head = societe_admin_prepare_head(null); dol_fiche_head($head, 'attributes', $langs->trans("ThirdParties"), 0, 'company'); - -print $langs->trans("DefineHereComplementaryAttributes",$textobject).'
'."\n"; -print '
'; - -// Load attribute_label -$extrafields->fetch_name_optionals_label($elementtype); - -print ""; - -print ''; -print ''; -print ''; -print ''; -print ''; -print ''; -print ''; -print ''; -print ''; -print "\n"; - -$var=True; -foreach($extrafields->attribute_type as $key => $value) -{ - $var=!$var; - print ""; - print "\n"; - print "\n"; - print "\n"; - print "\n"; - print '\n"; - print '\n"; - print '\n"; - print '\n"; - print ""; - // $i++; -} - -print "
'.$langs->trans("Position").''.$langs->trans("Label").''.$langs->trans("AttributeCode").''.$langs->trans("Type").''.$langs->trans("Size").''.$langs->trans("Unique").''.$langs->trans("Required").' 
".$extrafields->attribute_pos[$key]."".$extrafields->attribute_label[$key]."".$key."".$type2label[$extrafields->attribute_type[$key]]."'.$extrafields->attribute_size[$key]."'.yn($extrafields->attribute_unique[$key])."'.yn($extrafields->attribute_required[$key])."'.img_edit().''; - print "  ".img_delete()."
"; +require DOL_DOCUMENT_ROOT.'/core/tpl/admin_extrafields_view.tpl.php'; dol_fiche_end(); diff --git a/htdocs/user/admin/group_extrafields.php b/htdocs/user/admin/group_extrafields.php index dbb9e863af4..1282c585018 100644 --- a/htdocs/user/admin/group_extrafields.php +++ b/htdocs/user/admin/group_extrafields.php @@ -73,43 +73,7 @@ $head = user_admin_prepare_head(); dol_fiche_head($head, 'attributes_group', $langs->trans("Group"), 0, 'user'); - -print $langs->trans("DefineHereComplementaryAttributes",$textobject).'
'."\n"; -print '
'; - -// Load attribute_label -$extrafields->fetch_name_optionals_label($elementtype); - -print ""; - -print ''; -print ''; -print ''; -print ''; -print ''; -print ''; -print ''; -print ''; -print "\n"; - -$var=True; -foreach($extrafields->attribute_type as $key => $value) -{ - $var=!$var; - print ""; - print "\n"; - print "\n"; - print "\n"; - print '\n"; - print '\n"; - print '\n"; - print '\n"; - print ""; - // $i++; -} - -print "
'.$langs->trans("Label").''.$langs->trans("AttributeCode").''.$langs->trans("Type").''.$langs->trans("Size").''.$langs->trans("Unique").''.$langs->trans("Required").' 
".$extrafields->attribute_label[$key]."".$key."".$type2label[$extrafields->attribute_type[$key]]."'.$extrafields->attribute_size[$key]."'.yn($extrafields->attribute_unique[$key])."'.yn($extrafields->attribute_required[$key])."'.img_edit().''; - print "  ".img_delete()."
"; +require DOL_DOCUMENT_ROOT.'/core/tpl/admin_extrafields_view.tpl.php'; dol_fiche_end(); diff --git a/htdocs/user/admin/user_extrafields.php b/htdocs/user/admin/user_extrafields.php index 7caa42b08ea..7ff143f2235 100644 --- a/htdocs/user/admin/user_extrafields.php +++ b/htdocs/user/admin/user_extrafields.php @@ -72,43 +72,7 @@ $head = user_admin_prepare_head(); dol_fiche_head($head, 'attributes', $langs->trans("User"), 0, 'user'); - -print $langs->trans("DefineHereComplementaryAttributes",$textobject).'
'."\n"; -print '
'; - -// Load attribute_label -$extrafields->fetch_name_optionals_label($elementtype); - -print ""; - -print ''; -print ''; -print ''; -print ''; -print ''; -print ''; -print ''; -print ''; -print "\n"; - -$var=True; -foreach($extrafields->attribute_type as $key => $value) -{ - $var=!$var; - print ""; - print "\n"; - print "\n"; - print "\n"; - print '\n"; - print '\n"; - print '\n"; - print '\n"; - print ""; - // $i++; -} - -print "
'.$langs->trans("Label").''.$langs->trans("AttributeCode").''.$langs->trans("Type").''.$langs->trans("Size").''.$langs->trans("Unique").''.$langs->trans("Required").' 
".$extrafields->attribute_label[$key]."".$key."".$type2label[$extrafields->attribute_type[$key]]."'.$extrafields->attribute_size[$key]."'.yn($extrafields->attribute_unique[$key])."'.yn($extrafields->attribute_required[$key])."'.img_edit().''; - print "  ".img_delete()."
"; +require DOL_DOCUMENT_ROOT.'/core/tpl/admin_extrafields_view.tpl.php'; dol_fiche_end(); From f2fb040a9c94b4fc493f58e5d93f99996414d32f Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 1 Mar 2015 13:48:00 +0100 Subject: [PATCH 199/287] Fix align --- htdocs/opensurvey/wizard/choix_date.php | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/htdocs/opensurvey/wizard/choix_date.php b/htdocs/opensurvey/wizard/choix_date.php index 0d52b360ddb..cc08434cd50 100644 --- a/htdocs/opensurvey/wizard/choix_date.php +++ b/htdocs/opensurvey/wizard/choix_date.php @@ -338,8 +338,9 @@ print $langs->trans("OpenSurveyStep2")."\n"; print ''."\n"; //debut du tableau qui affiche le calendrier -print '
'."\n"; -print ''."\n"; +print '
'."\n"; +print '
'."\n"; +print '
'."\n"; // The div class=center has no effect on table, so we must keep the align=center for table print ''; print ''."\n"; print '
'.$motmois.' '.$_SESSION["annee"].'
'; print ''; @@ -347,7 +348,10 @@ print '
'; print '
'."\n"; -print ''."\n"; +print ''."\n"; + +print '
'."\n"; +print '
'."\n"; // The div class=center has no effect on table, so we must keep the align=center for table print ''."\n"; //affichage des jours de la semaine en haut du tableau @@ -499,8 +503,11 @@ if (issetAndNoEmpty('totalchoixjour', $_SESSION) || $erreur) { //affichage des jours print '
'."\n"; + print '
'; print ''. $langs->trans("SelectedDays") .':'."
\n"; print $langs->trans("SelectDayDesc")."
\n"; + print '

'; + print '
'."\n"; print ''."\n"; print ''."\n"; From f6314dd3ad0614329c3aad4a1461a8b97602a0ce Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 1 Mar 2015 13:48:45 +0100 Subject: [PATCH 200/287] Fix bad position of html tags --- htdocs/opensurvey/card.php | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/htdocs/opensurvey/card.php b/htdocs/opensurvey/card.php index 5d32db24d5c..70e1b49ad48 100644 --- a/htdocs/opensurvey/card.php +++ b/htdocs/opensurvey/card.php @@ -1,5 +1,5 @@ +/* Copyright (C) 2013-2015 Laurent Destailleur * Copyright (C) 2014 Marcos García * * This program is free software; you can redistribute it and/or modify @@ -157,12 +157,14 @@ if ($action == 'edit') { * View */ -if ($object->fk_user_creat) { +$form=new Form($db); + +if ($object->fk_user_creat) +{ $userstatic = new User($db); $userstatic->fetch($object->fk_user_creat); } -$form=new Form($db); $arrayofjs=array(); $arrayofcss=array('/opensurvey/css/style.css'); @@ -186,8 +188,8 @@ print ''; $head = opensurvey_prepare_head($object); -print dol_get_fiche_head($head,'general',$langs->trans("Survey"),0,dol_buildpath('/opensurvey/img/object_opensurvey.png',1),1); +dol_fiche_head($head,'general',$langs->trans("Survey"),0,dol_buildpath('/opensurvey/img/object_opensurvey.png',1),1); print '
'; @@ -313,11 +315,12 @@ print $urllink; print '
'; -if ($action == 'edit') print '
'; +dol_fiche_end(); + +if ($action == 'edit') print '
'; print ''."\n"; -dol_fiche_end(); /* From a421564b8453b5b5fa6e80b247943bf179aa53b6 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 1 Mar 2015 13:52:58 +0100 Subject: [PATCH 201/287] Fix phpcs --- .../prelevement/class/bonprelevement.class.php | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/htdocs/compta/prelevement/class/bonprelevement.class.php b/htdocs/compta/prelevement/class/bonprelevement.class.php index b90b0dc6c25..25236ee3ebb 100644 --- a/htdocs/compta/prelevement/class/bonprelevement.class.php +++ b/htdocs/compta/prelevement/class/bonprelevement.class.php @@ -891,13 +891,13 @@ class BonPrelevement extends CommonObject if (!$error) { $ref = substr($year,-2).$month; - + $sql = "SELECT substring(ref from char_length(ref) - 1)"; $sql.= " FROM ".MAIN_DB_PREFIX."prelevement_bons"; $sql.= " WHERE ref LIKE '%".$ref."%'"; $sql.= " AND entity = ".$conf->entity; $sql.= " ORDER BY ref DESC LIMIT 1"; - + dol_syslog(get_class($this)."::Create sql=".$sql, LOG_DEBUG); $resql = $this->db->query($sql); @@ -914,7 +914,7 @@ class BonPrelevement extends CommonObject $ref = "T".$ref.str_pad(dol_substr("00".intval($row[0])+1),2,"0",STR_PAD_LEFT); $filebonprev = $ref; - + // Create withdraw receipt in database $sql = "INSERT INTO ".MAIN_DB_PREFIX."prelevement_bons ("; $sql.= " ref, entity, datec"; @@ -1326,7 +1326,7 @@ class BonPrelevement extends CommonObject $dateTime_ECMA = dol_print_date($date_actu, '%Y-%m-%dT%H:%M:%S'); $fileDebiteurSection = ''; $fileEmetteurSection = ''; - $i = 0; + $i = 0; $j = 0; $this->total = 0; @@ -1337,7 +1337,7 @@ class BonPrelevement extends CommonObject $sql = "SELECT f.facnumber as fac FROM ".MAIN_DB_PREFIX."prelevement_lignes as pl, ".MAIN_DB_PREFIX."facture as f, ".MAIN_DB_PREFIX."prelevement_facture as pf, ".MAIN_DB_PREFIX."societe as soc, ".MAIN_DB_PREFIX."c_pays as p, ".MAIN_DB_PREFIX."societe_rib as rib WHERE pl.fk_prelevement_bons = ".$this->id." AND pl.rowid = pf.fk_prelevement_lignes AND pf.fk_facture = f.rowid AND soc.fk_pays = p.rowid AND soc.rowid = f.fk_soc AND rib.fk_soc = f.fk_soc AND rib.default_rib = 1"; $resql=$this->db->query($sql); if ($resql) - { + { $num = $this->db->num_rows($resql); while ($j < $num) { @@ -1372,7 +1372,7 @@ class BonPrelevement extends CommonObject while ($i < $num) { $obj = $this->db->fetch_object($resql); - $fileDebiteurSection .= $this->EnregDestinataireSEPA($obj->code, $obj->nom, $obj->address, $obj->zip, $obj->town, $obj->country_code, $obj->cb, $obj->cg, $obj->cc, $obj->somme, $ListOfFactures , $obj->idfac, $obj->iban, $obj->bic, $obj->datec, $obj->drum); + $fileDebiteurSection .= $this->EnregDestinataireSEPA($obj->code, $obj->nom, $obj->address, $obj->zip, $obj->town, $obj->country_code, $obj->cb, $obj->cg, $obj->cc, $obj->somme, $ListOfFactures, $obj->idfac, $obj->iban, $obj->bic, $obj->datec, $obj->drum); $this->total = $this->total + $obj->somme; $i++; } From be033c1947798b59d1de39ec915b9ee45f704c04 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 1 Mar 2015 13:54:24 +0100 Subject: [PATCH 202/287] Fix bad position of html tags Conflicts: htdocs/opensurvey/card.php --- htdocs/opensurvey/card.php | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/htdocs/opensurvey/card.php b/htdocs/opensurvey/card.php index 396fdf050ec..70e1b49ad48 100644 --- a/htdocs/opensurvey/card.php +++ b/htdocs/opensurvey/card.php @@ -1,5 +1,5 @@ +/* Copyright (C) 2013-2015 Laurent Destailleur * Copyright (C) 2014 Marcos García * * This program is free software; you can redistribute it and/or modify @@ -157,12 +157,14 @@ if ($action == 'edit') { * View */ -if ($object->fk_user_creat) { +$form=new Form($db); + +if ($object->fk_user_creat) +{ $userstatic = new User($db); $userstatic->fetch($object->fk_user_creat); } -$form=new Form($db); $arrayofjs=array(); $arrayofcss=array('/opensurvey/css/style.css'); @@ -186,8 +188,8 @@ print ''; $head = opensurvey_prepare_head($object); -print dol_get_fiche_head($head,'general',$langs->trans("Survey"),0,dol_buildpath('/opensurvey/img/object_opensurvey.png',1),1); +dol_fiche_head($head,'general',$langs->trans("Survey"),0,dol_buildpath('/opensurvey/img/object_opensurvey.png',1),1); print ''; @@ -313,11 +315,12 @@ print $urllink; print '
'; -if ($action == 'edit') print '

'; +dol_fiche_end(); + +if ($action == 'edit') print '
'; print ''."\n"; -dol_fiche_end(); /* From 5f29942257d3bcf96db31e14002738ebadcbf083 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 1 Mar 2015 14:03:14 +0100 Subject: [PATCH 203/287] Fix link missing icon --- htdocs/projet/index.php | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/htdocs/projet/index.php b/htdocs/projet/index.php index 36f53b02680..8baa287731e 100644 --- a/htdocs/projet/index.php +++ b/htdocs/projet/index.php @@ -25,6 +25,7 @@ require '../main.inc.php'; require_once DOL_DOCUMENT_ROOT.'/projet/class/project.class.php'; +require_once DOL_DOCUMENT_ROOT.'/projet/class/task.class.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/project.lib.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php'; @@ -50,6 +51,7 @@ $sortorder = GETPOST("sortorder",'alpha'); $socstatic=new Societe($db); $projectstatic=new Project($db); $userstatic=new User($db); +$tasktmp=new Task($db); $projectsListId = $projectstatic->getProjectsAuthorizedForUser($user,($mine?$mine:(empty($user->rights->projet->all->lire)?0:2)),1); //var_dump($projectsListId); @@ -224,7 +226,9 @@ if ( $resql ) print ''; if (! empty($obj->taskid)) { - print ''.$obj->label.''; + $tasktmp->id = $obj->taskid; + $tasktmp->ref = $obj->label; + print $tasktmp->getNomUrl(1); } else print $langs->trans("NoTasks"); print ''; @@ -256,13 +260,13 @@ if ( $resql ) } if ($num > $max) - { - print ''.$langs->trans("WarningTooManyDataPleaseUseMoreFilters").''; + { + print ''.$langs->trans("WarningTooManyDataPleaseUseMoreFilters").''; } - + print ""; - + $db->free($resql); } else From 560f1a43cd8b2106c869eb42891602c9590bc006 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 1 Mar 2015 16:04:34 +0100 Subject: [PATCH 204/287] Fix: Several bugs int replenishment feature. --- htdocs/commande/list.php | 13 +-- htdocs/fourn/commande/dispatch.php | 4 +- htdocs/install/mysql/migration/repair.sql | 1 + htdocs/langs/en_US/stocks.lang | 2 +- htdocs/product/class/product.class.php | 15 ++-- .../product/stock/lib/replenishment.lib.php | 80 ++++++++++++------- htdocs/product/stock/replenish.php | 74 +++++++---------- htdocs/product/stock/replenishorders.php | 32 ++++---- 8 files changed, 120 insertions(+), 101 deletions(-) diff --git a/htdocs/commande/list.php b/htdocs/commande/list.php index c2fb7330628..9d143d87eb2 100644 --- a/htdocs/commande/list.php +++ b/htdocs/commande/list.php @@ -366,19 +366,22 @@ if ($resql) // stock order and stock order_supplier $stock_order=0; $stock_order_supplier=0; - if (! empty($conf->global->STOCK_CALCULATE_ON_SHIPMENT)) { - if (! empty($conf->commande->enabled)) { + if (! empty($conf->global->STOCK_CALCULATE_ON_SHIPMENT)) + { + if (! empty($conf->commande->enabled)) + { if (empty($productstat_cache[$generic_commande->lines[$lig]->fk_product]['stats_order_customer'])) { - $generic_product->load_stats_commande(0,'1,2',true); + $generic_product->load_stats_commande(0,'1,2'); $productstat_cache[$generic_commande->lines[$lig]->fk_product]['stats_order_customer'] = $generic_product->stats_commande['qty']; } else { $generic_product->stats_commande['qty'] = $productstat_cache[$generic_commande->lines[$lig]->fk_product]['stats_order_customer']; } $stock_order=$generic_product->stats_commande['qty']; } - if (! empty($conf->fournisseur->enabled)) { + if (! empty($conf->fournisseur->enabled)) + { if (empty($productstat_cache[$generic_commande->lines[$lig]->fk_product]['stats_order_supplier'])) { - $generic_product->load_stats_commande_fournisseur(0,'3',true); + $generic_product->load_stats_commande_fournisseur(0,'3'); $productstat_cache[$generic_commande->lines[$lig]->fk_product]['stats_order_supplier'] = $generic_product->stats_commande_fournisseur['qty']; } else { $generic_product->stats_commande_fournisseur['qty'] = $productstat_cache[$generic_commande->lines[$lig]->fk_product]['stats_order_supplier']; diff --git a/htdocs/fourn/commande/dispatch.php b/htdocs/fourn/commande/dispatch.php index 7f4237224b5..a68f11f0f69 100644 --- a/htdocs/fourn/commande/dispatch.php +++ b/htdocs/fourn/commande/dispatch.php @@ -457,11 +457,11 @@ if ($id > 0 || ! empty($ref)) print ''; if (count($listwarehouses)>1) { - print $form->selectarray("entrepot".$suffix, $listwarehouses, '', 1, 0, 0, '', 0, 0, $disabled); + print $form->selectarray("entrepot".$suffix, $listwarehouses, GETPOST("entrepot".$suffix), 1, 0, 0, '', 0, 0, $disabled); } elseif (count($listwarehouses)==1) { - print $form->selectarray("entrepot".$suffix, $listwarehouses, '', 0, 0, 0, '', 0, 0, $disabled); + print $form->selectarray("entrepot".$suffix, $listwarehouses, GETPOST("entrepot".$suffix), 0, 0, 0, '', 0, 0, $disabled); } else { diff --git a/htdocs/install/mysql/migration/repair.sql b/htdocs/install/mysql/migration/repair.sql index fe0f8fb2a13..98fba06950d 100755 --- a/htdocs/install/mysql/migration/repair.sql +++ b/htdocs/install/mysql/migration/repair.sql @@ -224,5 +224,6 @@ update llx_facturedet set product_type = 1 where product_type = 2; --update llx_commandedet as d set d.product_type = 1 where d.fk_product = 22 and d.product_type = 0; --update llx_facturedet as d set d.product_type = 1 where d.fk_product = 22 and d.product_type = 0; +delete from llx_commande_fournisseur_dispatch where fk_commandefourndet = 0 or fk_commandefourndet IS NULL; diff --git a/htdocs/langs/en_US/stocks.lang b/htdocs/langs/en_US/stocks.lang index 7025176c9f1..9019240490b 100644 --- a/htdocs/langs/en_US/stocks.lang +++ b/htdocs/langs/en_US/stocks.lang @@ -111,7 +111,7 @@ WarehouseForStockDecrease=The warehouse %s will be used for stock decreas WarehouseForStockIncrease=The warehouse %s will be used for stock increase ForThisWarehouse=For this warehouse ReplenishmentStatusDesc=This is list of all product with a stock lower than desired stock (or lower than alert value if checkbox "alert only" is checked), and suggest you to create supplier orders to fill the difference. -ReplenishmentOrdersDesc=This is list of all opened supplier orders +ReplenishmentOrdersDesc=This is list of all opened supplier orders including predefined products. Only opened orders with predefined products, so that may affect stocks, are visible here. Replenishments=Replenishments NbOfProductBeforePeriod=Quantity of product %s in stock before selected period (< %s) NbOfProductAfterPeriod=Quantity of product %s in stock after selected period (> %s) diff --git a/htdocs/product/class/product.class.php b/htdocs/product/class/product.class.php index 43da5af3cea..e5a8afc274b 100755 --- a/htdocs/product/class/product.class.php +++ b/htdocs/product/class/product.class.php @@ -3186,7 +3186,9 @@ class Product extends CommonObject } } $this->db->free($result); - $this->load_virtual_stock(); + + $this->load_virtual_stock(); // This also load stats_commande_fournisseur, ... + return 1; } else @@ -3210,18 +3212,21 @@ class Product extends CommonObject $stock_sending_client=0; $stock_reception_fournisseur=0; - if (! empty($conf->commande->enabled)) { + if (! empty($conf->commande->enabled)) + { $result=$this->load_stats_commande(0,'1,2'); if ($result < 0) dol_print_error($db,$this->error); $stock_commande_client=$this->stats_commande['qty']; } - if (! empty($conf->expedition->enabled)) { + if (! empty($conf->expedition->enabled)) + { $result=$this->load_stats_sending(0,'1,2'); if ($result < 0) dol_print_error($db,$this->error); $stock_sending_client=$this->stats_expedition['qty']; } - if (! empty($conf->fournisseur->enabled)) { - $result=$this->load_stats_commande_fournisseur(0,'3,4'); + if (! empty($conf->fournisseur->enabled)) + { + $result=$this->load_stats_commande_fournisseur(0,'1,2,3,4'); if ($result < 0) dol_print_error($db,$this->error); $stock_commande_fournisseur=$this->stats_commande_fournisseur['qty']; diff --git a/htdocs/product/stock/lib/replenishment.lib.php b/htdocs/product/stock/lib/replenishment.lib.php index 50a0d85e25c..1ef993c479d 100644 --- a/htdocs/product/stock/lib/replenishment.lib.php +++ b/htdocs/product/stock/lib/replenishment.lib.php @@ -25,56 +25,80 @@ require_once DOL_DOCUMENT_ROOT . '/fourn/class/fournisseur.commande.class.php'; /** - * dispatched + * Check if there is still some dispatching of stock to do. * - * @param int $order_id Id of order - * @return boolean + * @param int $order_id Id of order to check + * @return boolean True = There is some dispatching to do, False = All dispatching is done (may be we receive more) or is not required */ -function dispatched($order_id) +function dolDispatchToDo($order_id) { global $db; - $sql = 'SELECT fk_product, SUM(qty) FROM ' . MAIN_DB_PREFIX . 'commande_fournisseur_dispatch'; - $sql .= ' WHERE fk_commande = ' . $order_id . ' GROUP BY fk_product'; - $sql .= ' ORDER by fk_product'; - $resql = $db->query($sql); + $dispatched = array(); $ordered = array(); - if($resql && $db->num_rows($resql)) - { - while($res = $db->fetch_object($resql)) - $dispatched[] = $res; - } - $sql = 'SELECT fk_product, SUM(qty) FROM ' . MAIN_DB_PREFIX . 'commande_fournisseurdet'; - $sql .= ' WHERE fk_commande = ' . $order_id . ' GROUP BY fk_product'; - $sql .= ' ORDER by fk_product'; + + # Count nb of quantity dispatched per product + $sql = 'SELECT fk_product, SUM(qty) FROM ' . MAIN_DB_PREFIX . 'commande_fournisseur_dispatch'; + $sql.= ' WHERE fk_commande = ' . $order_id; + $sql.= ' GROUP BY fk_product'; + $sql.= ' ORDER by fk_product'; $resql = $db->query($sql); - if($resql && $db->num_rows($resql)) { - while($res = $db->fetch_object($resql)) - $ordered[] = $res; + if ($resql && $db->num_rows($resql)) + { + while ($obj = $db->fetch_object($resql)) + $dispatched[$obj->fk_product] = $obj; } - return $dispatched == $ordered; + + # Count nb of quantity to dispatch per product + $sql = 'SELECT fk_product, SUM(qty) FROM ' . MAIN_DB_PREFIX . 'commande_fournisseurdet'; + $sql.= ' WHERE fk_commande = ' . $order_id; + $sql.= ' AND fk_product > 0'; + if (empty($conf->global->STOCK_SUPPORTS_SERVICES)) $sql.= ' AND product_type = 0'; + $sql.= ' GROUP BY fk_product'; + $sql.= ' ORDER by fk_product'; + $resql = $db->query($sql); + if ($resql && $db->num_rows($resql)) + { + while ($obj = $db->fetch_object($resql)) + $ordered[$obj->fk_product] = $obj; + } + + $todispatch=0; + foreach ($ordered as $key => $val) + { + if ($ordered[$key] > $dispatched[$key]) $todispatch++; + } + + return ($todispatch ? true : false); + //return true; } /** * dispatchedOrders * - * @return Ambigous + * @return string Array of id of orders wit all dispathing already done or not required */ function dispatchedOrders() { global $db; + $sql = 'SELECT rowid FROM ' . MAIN_DB_PREFIX . 'commande_fournisseur'; $resql = $db->query($sql); - $res = array(); - if ($resql && $db->num_rows($resql) > 0) { - while ($obj = $db->fetch_object($resql)) { - if (dispatched($obj->rowid)) { - $res[] = $obj->rowid; + $resarray = array(); + if ($resql && $db->num_rows($resql) > 0) + { + while ($obj = $db->fetch_object($resql)) + { + if (! dolDispatchToDo($obj->rowid)) + { + $resarray[] = $obj->rowid; } } } - if ($res) { - $res = '(' . implode(',', $res) . ')'; + + if (count($resarray)) + { + $res = '(' . implode(',', $resarray) . ')'; } else { //hack to make sure ordered SQL request won't syntax error $res = '(0)'; diff --git a/htdocs/product/stock/replenish.php b/htdocs/product/stock/replenish.php index 35835709ab8..efb008df4ff 100644 --- a/htdocs/product/stock/replenish.php +++ b/htdocs/product/stock/replenish.php @@ -336,6 +336,17 @@ $head[1][0] = DOL_URL_ROOT.'/product/stock/replenishorders.php'; $head[1][1] = $langs->trans("ReplenishmentOrders"); $head[1][2] = 'replenishorders'; + + +print '
'. + ''. + ''. + ''. + ''. + ''. + ''. + ''; + dol_fiche_head($head, 'replenish', $langs->trans('Replenishment'), 0, 'stock'); print $langs->trans("ReplenishmentStatusDesc").'
'."\n"; @@ -386,16 +397,7 @@ if ($sref || $snom || $sall || $salert || GETPOST('search', 'alpha')) { ); } -print ''. - ''. - ''. - ''. - ''. - ''. - ''. - ''. - - ''; +print '
'; $param = (isset($type)? '&type=' . $type : ''); $param .= '&fourn_id=' . $fourn_id . '&snom='. $snom . '&salert=' . $salert; @@ -467,7 +469,6 @@ while ($i < ($limit ? min($num, $limit) : $num)) if (!empty($objtp->label)) $objp->label = $objtp->label; } } - $form = new Form($db); $var =! $var; if ($usevirtualstock) @@ -480,7 +481,13 @@ while ($i < ($limit ? min($num, $limit) : $num)) $stock = $prod->stock_reel; } - $ordered = $prod->stats_commande_fournisseur['qty']-$prod->stats_reception['qty']; + // Force call prod->load_stats_xxx to choose status to count (otherwise it is loaded by load_stock function) + $result=$prod->load_stats_commande_fournisseur(0,'1,2,3,4'); + $result=$prod->load_stats_reception(0,'4'); + + //print $prod->stats_commande_fournisseur['qty'].'
'."\n"; + //print $prod->stats_reception['qty']; + $ordered = $prod->stats_commande_fournisseur['qty'] - $prod->stats_reception['qty']; $warning=''; if ($objp->alertstock && ($stock < $objp->alertstock)) @@ -555,12 +562,6 @@ while ($i < ($limit ? min($num, $limit) : $num)) print '
'; -$value=$langs->trans("CreateOrders"); -print '
'; - - -print '
'; - if ($num > $conf->liste_limit) { if ($sref || $snom || $sall || $salert || GETPOST('search', 'alpha')) @@ -569,36 +570,16 @@ if ($num > $conf->liste_limit) $filters .= '&sall=' . $sall; $filters .= '&salert=' . $salert; $filters .= '&mode=' . $mode; - print_barre_liste( - '', - $page, - 'replenish.php', - $filters, - $sortfield, - $sortorder, - '', - $num, - 0, - '' - ); - } else { + print_barre_liste('', $page, 'replenish.php', $filters, $sortfield, $sortorder, '', $num, 0, ''); + } + else + { $filters = '&sref=' . $sref . '&snom=' . $snom; $filters .= '&fourn_id=' . $fourn_id; $filters .= (isset($type)? '&type=' . $type : ''); $filters .= '&salert=' . $salert; $filters .= '&mode=' . $mode; - print_barre_liste( - '', - $page, - 'replenish.php', - $filters, - $sortfield, - $sortorder, - '', - $num, - 0, - '' - ); + print_barre_liste('', $page, 'replenish.php', $filters, $sortfield, $sortorder, '', $num, 0, ''); } } @@ -607,6 +588,13 @@ $db->free($resql); dol_fiche_end(); +$value=$langs->trans("CreateOrders"); +print '
'; + + +print ''; + + // TODO Replace this with jquery print ' '."\n"; + print "\n".''."\n"; - - print "\n".''; print ' ' . $langs->trans("LocalAgenda") . ''; foreach ($showextcals as $val) { - $htmlname = dol_string_nospecial($val['name']); + $htmlname = md5($val['name']); print ''; print ' ' . $val ['name']; From 5335a6affae5fd2d5421a26ba8e3b79bb7c63311 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 4 Mar 2015 16:28:29 +0100 Subject: [PATCH 238/287] NEW: Add close date and user for projects. --- htdocs/install/mysql/migration/3.7.0-3.8.0.sql | 5 +++++ htdocs/install/mysql/tables/llx_projet.sql | 2 ++ htdocs/projet/class/project.class.php | 14 +++++++++++--- test/phpunit/ProjectTest.php | 8 ++++++-- 4 files changed, 24 insertions(+), 5 deletions(-) diff --git a/htdocs/install/mysql/migration/3.7.0-3.8.0.sql b/htdocs/install/mysql/migration/3.7.0-3.8.0.sql index 84990967856..fd9006fa303 100755 --- a/htdocs/install/mysql/migration/3.7.0-3.8.0.sql +++ b/htdocs/install/mysql/migration/3.7.0-3.8.0.sql @@ -227,3 +227,8 @@ ALTER TABLE llx_commande_fournisseurdet ADD COLUMN special_code integer DEFAULT ALTER TABLE llx_commande_fournisseurdet ADD COLUMN rang integer DEFAULT 0; ALTER TABLE llx_commande_fournisseurdet ADD COLUMN fk_parent_line integer NULL after fk_commande; +ALTER TABLE llx_projet ADD COLUMN date_close datetime DEFAULT NULL; +ALTER TABLE llx_projet ADD COLUMN fk_user_close integer DEFAULT NULL; + + + \ No newline at end of file diff --git a/htdocs/install/mysql/tables/llx_projet.sql b/htdocs/install/mysql/tables/llx_projet.sql index 0bfde5c026b..d9192c191ba 100644 --- a/htdocs/install/mysql/tables/llx_projet.sql +++ b/htdocs/install/mysql/tables/llx_projet.sql @@ -32,6 +32,8 @@ create table llx_projet fk_user_creat integer NOT NULL, -- createur du projet public integer, -- project is public or not fk_statut smallint DEFAULT 0 NOT NULL, + date_close datetime DEFAULT NULL, + fk_user_close integer DEFAULT NULL, note_private text, note_public text, --budget_days real, -- budget in days is sum of field planned_workload of tasks diff --git a/htdocs/projet/class/project.class.php b/htdocs/projet/class/project.class.php index 1d5daf2110a..eb15f80ff6d 100644 --- a/htdocs/projet/class/project.class.php +++ b/htdocs/projet/class/project.class.php @@ -49,8 +49,10 @@ class Project extends CommonObject var $title; var $date_start; var $date_end; + var $date_close; var $socid; var $user_author_id; //!< Id of project creator. Not defined if shared project. + var $user_close_id; var $public; //!< Tell if this is a public or private project var $note_private; var $note_public; @@ -212,6 +214,8 @@ class Project extends CommonObject $sql.= ", datec=" . ($this->date_c != '' ? "'".$this->db->idate($this->date_c)."'" : 'null'); $sql.= ", dateo=" . ($this->date_start != '' ? "'".$this->db->idate($this->date_start)."'" : 'null'); $sql.= ", datee=" . ($this->date_end != '' ? "'".$this->db->idate($this->date_end)."'" : 'null'); + $sql.= ", date_close=" . ($this->date_close != '' ? "'".$this->db->idate($this->date_close)."'" : 'null'); + $sql.= ", fk_user_close=" . ($this->fk_user_close > 0 ? $this->fk_user_close : "null"); $sql.= ", budget_amount = " . ($this->budget_amount > 0 ? $this->budget_amount : "null"); $sql.= " WHERE rowid = " . $this->id; @@ -299,7 +303,7 @@ class Project extends CommonObject if (empty($id) && empty($ref)) return -1; $sql = "SELECT rowid, ref, title, description, public, datec, budget_amount,"; - $sql.= " tms, dateo, datee, fk_soc, fk_user_creat, fk_statut, note_private, note_public,model_pdf"; + $sql.= " tms, dateo, datee, date_close, fk_soc, fk_user_creat, fk_user_close, fk_statut, note_private, note_public,model_pdf"; $sql.= " FROM " . MAIN_DB_PREFIX . "projet"; if (! empty($id)) { @@ -330,10 +334,12 @@ class Project extends CommonObject $this->datem = $this->db->jdate($obj->tms); // TODO deprecated $this->date_start = $this->db->jdate($obj->dateo); $this->date_end = $this->db->jdate($obj->datee); + $this->date_close = $this->db->jdate($obj->date_close); $this->note_private = $obj->note_private; $this->note_public = $obj->note_public; $this->socid = $obj->fk_soc; $this->user_author_id = $obj->fk_user_creat; + $this->user_close_id = $obj->fk_user_close; $this->public = $obj->public; $this->statut = $obj->fk_statut; $this->budget_amount = $obj->budget_amount; @@ -682,13 +688,15 @@ class Project extends CommonObject /** * Close a project * - * @param User $user User that validate + * @param User $user User that close project * @return int <0 if KO, >0 if OK */ function setClose($user) { global $langs, $conf; + $now = dol_now(); + $error=0; if ($this->statut != 2) @@ -696,7 +704,7 @@ class Project extends CommonObject $this->db->begin(); $sql = "UPDATE " . MAIN_DB_PREFIX . "projet"; - $sql.= " SET fk_statut = 2"; + $sql.= " SET fk_statut = 2, fk_user_close = ".$user->id.", date_close = '".$this->db->idate($now)."'"; $sql.= " WHERE rowid = " . $this->id; $sql.= " AND entity = " . $conf->entity; $sql.= " AND fk_statut = 1"; diff --git a/test/phpunit/ProjectTest.php b/test/phpunit/ProjectTest.php index e27cd1e0223..c2f5d5b8161 100644 --- a/test/phpunit/ProjectTest.php +++ b/test/phpunit/ProjectTest.php @@ -189,7 +189,7 @@ class ProjectTest extends PHPUnit_Framework_TestCase } /** - * testProjectOther + * testProjectClose * * @param Project $localobject Project * @return int @@ -205,6 +205,10 @@ class ProjectTest extends PHPUnit_Framework_TestCase $langs=$this->savlangs; $db=$this->savdb; + $result=$localobject->setClose($user); + + print __METHOD__." id=".$localobject->id." result=".$result."\n"; + $this->assertLessThan($result, 0); return $localobject->id; } @@ -214,7 +218,7 @@ class ProjectTest extends PHPUnit_Framework_TestCase * @param int $id Id of project * @return void * - * @depends testProjectOther + * @depends testProjectClose * The depends says test is run only if previous is ok */ public function testProjectDelete($id) From d1c44d549840c9f4fb0a6d02cc98790f04d08998 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 4 Mar 2015 16:30:38 +0100 Subject: [PATCH 239/287] Update doc --- CONTRIBUTING.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index e2282654fc9..ef6dd3a834a 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -47,8 +47,8 @@ Long description (Can span accross multiple lines). Where KEYWORD is one of: -- "FIXED:" for bug fixes (May be followed by the bug number i.e: #456) -- "NEW:" for new features (May be followed by the task number i.e: #123) +- "FIXED:" for bug fixes. In upper case to appear into ChangeLog. (May be followed by the bug number i.e: #456) +- "NEW:" for new features. In upper case to appear into ChangeLog. (May be followed by the task number i.e: #123) - void, don't put a keyword if the commit is not introducing feature or closing a bug. ### Resources From 1a02f6aa806b811129edb58f2e5d10cad0f5590b Mon Sep 17 00:00:00 2001 From: fmarcet Date: Wed, 4 Mar 2015 18:18:55 +0100 Subject: [PATCH 240/287] Fix: Masks works with thirdparty type --- htdocs/contrat/card.php | 2 +- htdocs/core/modules/commande/mod_commande_saphir.php | 2 +- htdocs/core/modules/contract/mod_contract_magre.php | 2 +- htdocs/core/modules/fichinter/mod_arctic.php | 2 +- htdocs/core/modules/livraison/mod_livraison_saphir.php | 2 +- htdocs/core/modules/propale/mod_propale_saphir.php | 2 +- .../modules/supplier_invoice/mod_facture_fournisseur_tulip.php | 2 +- .../supplier_order/mod_commande_fournisseur_orchidee.php | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/htdocs/contrat/card.php b/htdocs/contrat/card.php index 6d10442caf7..edb20d91d35 100644 --- a/htdocs/contrat/card.php +++ b/htdocs/contrat/card.php @@ -1097,7 +1097,7 @@ else $ref = substr($object->ref, 1, 4); if ($ref == 'PROV' && !empty($modCodeContract->code_auto)) { - $numref = $object->getNextNumRef($soc); + $numref = $object->getNextNumRef($object->thirdparty); } else { diff --git a/htdocs/core/modules/commande/mod_commande_saphir.php b/htdocs/core/modules/commande/mod_commande_saphir.php index 87ba0d57c98..1996717e506 100644 --- a/htdocs/core/modules/commande/mod_commande_saphir.php +++ b/htdocs/core/modules/commande/mod_commande_saphir.php @@ -121,7 +121,7 @@ class mod_commande_saphir extends ModeleNumRefCommandes return 0; } - $numFinal=get_next_value($db,$mask,'commande','ref','',$objsoc->code_client,$object->date); + $numFinal=get_next_value($db,$mask,'commande','ref','',$objsoc,$object->date); return $numFinal; } diff --git a/htdocs/core/modules/contract/mod_contract_magre.php b/htdocs/core/modules/contract/mod_contract_magre.php index 289b474de5e..54da8fc55c4 100644 --- a/htdocs/core/modules/contract/mod_contract_magre.php +++ b/htdocs/core/modules/contract/mod_contract_magre.php @@ -112,7 +112,7 @@ class mod_contract_magre extends ModelNumRefContracts return 0; } - $numFinal=get_next_value($db,$mask,'contrat','ref','',$objsoc->code_client,$contract->date_contrat); + $numFinal=get_next_value($db,$mask,'contrat','ref','',$objsoc,$contract->date_contrat); return $numFinal; } diff --git a/htdocs/core/modules/fichinter/mod_arctic.php b/htdocs/core/modules/fichinter/mod_arctic.php index ab06d1417e6..278e20ae7de 100644 --- a/htdocs/core/modules/fichinter/mod_arctic.php +++ b/htdocs/core/modules/fichinter/mod_arctic.php @@ -120,7 +120,7 @@ class mod_arctic extends ModeleNumRefFicheinter return 0; } - $numFinal=get_next_value($db,$mask,'fichinter','ref','',$objsoc->code_client,$object->datec); + $numFinal=get_next_value($db,$mask,'fichinter','ref','',$objsoc,$object->datec); return $numFinal; } diff --git a/htdocs/core/modules/livraison/mod_livraison_saphir.php b/htdocs/core/modules/livraison/mod_livraison_saphir.php index 5f8a6b93686..1192656bf8d 100644 --- a/htdocs/core/modules/livraison/mod_livraison_saphir.php +++ b/htdocs/core/modules/livraison/mod_livraison_saphir.php @@ -120,7 +120,7 @@ class mod_livraison_saphir extends ModeleNumRefDeliveryOrder return 0; } - $numFinal=get_next_value($db,$mask,'livraison','ref','',$objsoc->code_client,$object->date_livraison); + $numFinal=get_next_value($db,$mask,'livraison','ref','',$objsoc,$object->date_livraison); return $numFinal; } diff --git a/htdocs/core/modules/propale/mod_propale_saphir.php b/htdocs/core/modules/propale/mod_propale_saphir.php index 503d8754684..25ccecb253c 100644 --- a/htdocs/core/modules/propale/mod_propale_saphir.php +++ b/htdocs/core/modules/propale/mod_propale_saphir.php @@ -123,7 +123,7 @@ class mod_propale_saphir extends ModeleNumRefPropales $date=$propal->datep; $customercode=$objsoc->code_client; - $numFinal=get_next_value($db,$mask,'propal','ref','',$customercode,$date); + $numFinal=get_next_value($db,$mask,'propal','ref','',$objsoc,$date); return $numFinal; } diff --git a/htdocs/core/modules/supplier_invoice/mod_facture_fournisseur_tulip.php b/htdocs/core/modules/supplier_invoice/mod_facture_fournisseur_tulip.php index 15bef66bf8f..ba31d979864 100644 --- a/htdocs/core/modules/supplier_invoice/mod_facture_fournisseur_tulip.php +++ b/htdocs/core/modules/supplier_invoice/mod_facture_fournisseur_tulip.php @@ -126,7 +126,7 @@ class mod_facture_fournisseur_tulip extends ModeleNumRefSuppliersInvoices } //Supplier invoices take invoice date instead of creation date for the mask - $numFinal=get_next_value($db,$mask,'facture_fourn','ref','',$objsoc->code_fournisseur,$object->date); + $numFinal=get_next_value($db,$mask,'facture_fourn','ref','',$objsoc,$object->date); return $numFinal; } diff --git a/htdocs/core/modules/supplier_order/mod_commande_fournisseur_orchidee.php b/htdocs/core/modules/supplier_order/mod_commande_fournisseur_orchidee.php index 7f74ce095c0..37b8adab22e 100644 --- a/htdocs/core/modules/supplier_order/mod_commande_fournisseur_orchidee.php +++ b/htdocs/core/modules/supplier_order/mod_commande_fournisseur_orchidee.php @@ -121,7 +121,7 @@ class mod_commande_fournisseur_orchidee extends ModeleNumRefSuppliersOrders return 0; } - $numFinal=get_next_value($db,$mask,'commande_fournisseur','ref','',$objsoc->code_fournisseur,$object->date_commande); + $numFinal=get_next_value($db,$mask,'commande_fournisseur','ref','',$objsoc,$object->date_commande); return $numFinal; } From cf3190a4ef6bdca7286d6f465bf3575396860d39 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 4 Mar 2015 18:56:57 +0100 Subject: [PATCH 241/287] Bad error management --- htdocs/projet/card.php | 40 +++++++++------------------ htdocs/projet/class/project.class.php | 2 +- 2 files changed, 14 insertions(+), 28 deletions(-) diff --git a/htdocs/projet/card.php b/htdocs/projet/card.php index 541d9271ade..cd19f25a97c 100644 --- a/htdocs/projet/card.php +++ b/htdocs/projet/card.php @@ -38,6 +38,7 @@ $id=GETPOST('id','int'); $ref=GETPOST('ref','alpha'); $action=GETPOST('action','alpha'); $backtopage=GETPOST('backtopage','alpha'); +$cancel=GETPOST('cancel','alpha'); if ($id == '' && $ref == '' && ($action != "create" && $action != "add" && $action != "update" && ! $_POST["cancel"])) accessforbidden(); @@ -51,13 +52,10 @@ $object = new Project($db); $extrafields = new ExtraFields($db); if ($id > 0 || ! empty($ref)) { - $ret = $object->fetch($id,$ref); + $ret = $object->fetch($id,$ref); // If we create project, ref may be defined into POST but record does not yet exists into database if ($ret > 0) { $object->fetch_thirdparty(); $id=$object->id; - } else { - setEventMessage($object->error, 'errors'); - $action=''; } } @@ -83,9 +81,8 @@ if ($reshook < 0) setEventMessages($hookmanager->error, $hookmanager->errors, 'e if (empty($reshook)) { - // Cancel - if (GETPOST("cancel") && ! empty($backtopage)) + if ($cancel) { if (GETPOST("comefromclone")==1) { @@ -101,26 +98,15 @@ if (empty($reshook)) setEventMessage($langs->trans("CantRemoveProject"), 'errors'); } } - header("Location: ".$backtopage); - exit; + if ($backtopage) + { + header("Location: ".$backtopage); + exit; + } + + $action = ''; } - - //if cancel and come from clone then delete the cloned project - if (GETPOST("cancel") && (GETPOST("comefromclone")==1)) - { - $result=$object->delete($user); - if ($result > 0) - { - header("Location: index.php"); - exit; - } - else - { - dol_syslog($object->error,LOG_DEBUG); - setEventMessage($langs->trans("CantRemoveProject"), 'errors'); - } - } - + if ($action == 'add' && $user->rights->projet->creer) { $error=0; @@ -134,7 +120,7 @@ if (empty($reshook)) setEventMessage($langs->trans("ErrorFieldRequired",$langs->transnoentities("Label")), 'errors'); $error++; } - + if (! $error) { $error=0; @@ -156,7 +142,7 @@ if (empty($reshook)) if ($ret < 0) $error++; $result = $object->create($user); - if ($result > 0) + if (! $error && $result > 0) { // Add myself as project leader $result = $object->add_contact($user->id, 'PROJECTLEADER', 'internal'); diff --git a/htdocs/projet/class/project.class.php b/htdocs/projet/class/project.class.php index 1d5daf2110a..7d5cece4707 100644 --- a/htdocs/projet/class/project.class.php +++ b/htdocs/projet/class/project.class.php @@ -299,7 +299,7 @@ class Project extends CommonObject if (empty($id) && empty($ref)) return -1; $sql = "SELECT rowid, ref, title, description, public, datec, budget_amount,"; - $sql.= " tms, dateo, datee, fk_soc, fk_user_creat, fk_statut, note_private, note_public,model_pdf"; + $sql.= " tms, dateo, datee, fk_soc, fk_user_creat, fk_statut, note_private, note_public, model_pdf"; $sql.= " FROM " . MAIN_DB_PREFIX . "projet"; if (! empty($id)) { From 20d56244403b13574679d49486c2b63f976da3cc Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 4 Mar 2015 20:34:41 +0100 Subject: [PATCH 242/287] Closed #2414 --- htdocs/webservices/server_contact.php | 96 ++++++++++++--------------- 1 file changed, 42 insertions(+), 54 deletions(-) diff --git a/htdocs/webservices/server_contact.php b/htdocs/webservices/server_contact.php index ec652e80074..066c9f38b6c 100644 --- a/htdocs/webservices/server_contact.php +++ b/htdocs/webservices/server_contact.php @@ -114,8 +114,7 @@ $contact_fields = array( 'user_id' => array('name'=>'user_id','type'=>'xsd:string'), 'user_login' => array('name'=>'user_login','type'=>'xsd:string'), 'civility_id' => array('name'=>'civility_id','type'=>'xsd:string'), - 'poste' => array('name'=>'poste','type'=>'xsd:string'), - 'statut' => array('name'=>'statut','type'=>'xsd:string') + 'poste' => array('name'=>'poste','type'=>'xsd:string') //... ); //Retreive all extrafield for contact @@ -286,7 +285,7 @@ function getContact($authentication,$id,$ref_ext) 'country_code' => $contact->country_code, 'country' => $contact->country, 'socid' => $contact->socid, - 'status' => $contact->status, + 'status' => $contact->statut, 'phone_pro' => $contact->phone_pro, 'fax' => $contact->fax, 'phone_perso' => $contact->phone_perso, @@ -304,8 +303,7 @@ function getContact($authentication,$id,$ref_ext) 'user_id' => $contact->user_id, 'user_login' => $contact->user_login, 'civility_id' => $contact->civility_id, - 'poste' => $contact->poste, - 'statut' => $contact->statut + 'poste' => $contact->poste ); //Retreive all extrafield for thirdsparty @@ -353,7 +351,7 @@ function getContact($authentication,$id,$ref_ext) * Create Contact * * @param array $authentication Array of authentication information - * @param Contact $contact $contact + * @param Contact $contact $contact * @return array Array result */ function createContact($authentication,$contact) @@ -398,7 +396,7 @@ function createContact($authentication,$contact) $newobject->country_code=$contact['country_code']; $newobject->country=$contact['country']; $newobject->socid=$contact['socid']; - $newobject->status=$contact['status']; + $newobject->statut=$contact['status']; $newobject->phone_pro=$contact['phone_pro']; $newobject->fax=$contact['fax']; $newobject->phone_perso=$contact['phone_perso']; @@ -416,7 +414,6 @@ function createContact($authentication,$contact) $newobject->user_id=$contact['user_id']; $newobject->user_login=$contact['user_login']; $newobject->poste=$contact['poste']; - $newobject->statut=$contact['statut']; //Retreive all extrafield for thirdsparty // fetch optionals attributes and labels @@ -493,7 +490,7 @@ function getContactsForThirdParty($authentication,$idthirdparty) { $linesinvoice=array(); - $sql = "SELECT c.rowid, c.fk_soc, c.civility as civility_id, c.lastname, c.firstname, c.statut,"; + $sql = "SELECT c.rowid, c.fk_soc, c.civility as civility_id, c.lastname, c.firstname, c.statut as status,"; $sql.= " c.address, c.zip, c.town,"; $sql.= " c.fk_pays as country_id,"; $sql.= " c.fk_departement,"; @@ -511,7 +508,6 @@ function getContactsForThirdParty($authentication,$idthirdparty) $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."societe as s ON c.fk_soc = s.rowid"; $sql.= " WHERE c.fk_soc=$idthirdparty"; - $resql=$db->query($sql); if ($resql) { @@ -525,58 +521,50 @@ function getContactsForThirdParty($authentication,$idthirdparty) $contact=new Contact($db); $contact->fetch($obj->rowid); - // Now define invoice $linescontact[]=array( - 'id' => $contact->id, - 'ref' => $contact->ref, - 'civility_id' => $contact->civility_id?$contact->civility_id:'', - 'lastname' => $contact->lastname?$contact->lastname:'', - 'firstname' => $contact->firstname?$contact->firstname:'', - 'address' => $contact->address?$contact->address:'', - 'zip' => $contact->zip?$contact->zip:'', - 'town' => $contact->town?$contact->town:'', + 'id' => $contact->id, + 'ref' => $contact->ref, + 'civility_id' => $contact->civility_id?$contact->civility_id:'', + 'lastname' => $contact->lastname?$contact->lastname:'', + 'firstname' => $contact->firstname?$contact->firstname:'', + 'address' => $contact->address?$contact->address:'', + 'zip' => $contact->zip?$contact->zip:'', + 'town' => $contact->town?$contact->town:'', - 'state_id' => $contact->state_id?$contact->state_id:'', - 'state_code' => $contact->state_code?$contact->state_code:'', - 'state' => $contact->state?$contact->state:'', - - 'country_id' => $contact->country_id?$contact->country_id:'', - 'country_code' => $contact->country_code?$contact->country_code:'', - 'country' => $contact->country?$contact->country:'', - - 'socid' => $contact->socid?$contact->socid:'', - 'socname' => $contact->socname?$contact->socname:'', - 'poste' => $contact->poste?$contact->poste:'', - - - - 'phone_pro' => $contact->phone_pro?$contact->phone_pro:'', - 'fax' => $contact->fax?$contact->fax:'', - 'phone_perso' => $contact->phone_perso?$contact->phone_perso:'', - 'phone_mobile' => $contact->phone_mobile?$contact->phone_mobile:'', - - 'email' => $contact->email?$contact->email:'', - 'jabberid' => $contact->jabberid?$contact->jabberid:'', - 'priv' => $contact->priv?$contact->priv:'', - 'mail' => $contact->mail?$contact->mail:'', - - 'birthday' => $contact->birthday?$contact->birthday:'', - 'default_lang' => $contact->default_lang?$contact->default_lang:'', - 'note' => $contact->note?$contact->note:'', - 'no_email' => $contact->no_email?$contact->no_email:'', - 'ref_facturation' => $contact->ref_facturation?$contact->ref_facturation:'', - 'ref_contrat' => $contact->ref_contrat?$contact->ref_contrat:'', - 'ref_commande' => $contact->ref_commande?$contact->ref_commande:'', - 'ref_propal' => $contact->ref_propal?$contact->ref_propal:'', - 'user_id' => $contact->user_id?$contact->user_id:'', - 'user_login' => $contact->user_login?$contact->user_login:'', - 'statut' => $contact->statut?$contact->statut:'' + 'state_id' => $contact->state_id?$contact->state_id:'', + 'state_code' => $contact->state_code?$contact->state_code:'', + 'state' => $contact->state?$contact->state:'', + 'country_id' => $contact->country_id?$contact->country_id:'', + 'country_code' => $contact->country_code?$contact->country_code:'', + 'country' => $contact->country?$contact->country:'', + 'socid' => $contact->socid?$contact->socid:'', + 'socname' => $contact->socname?$contact->socname:'', + 'poste' => $contact->poste?$contact->poste:'', + 'phone_pro' => $contact->phone_pro?$contact->phone_pro:'', + 'fax' => $contact->fax?$contact->fax:'', + 'phone_perso' => $contact->phone_perso?$contact->phone_perso:'', + 'phone_mobile' => $contact->phone_mobile?$contact->phone_mobile:'', + 'email' => $contact->email?$contact->email:'', + 'jabberid' => $contact->jabberid?$contact->jabberid:'', + 'priv' => $contact->priv?$contact->priv:'', + 'mail' => $contact->mail?$contact->mail:'', + 'birthday' => $contact->birthday?$contact->birthday:'', + 'default_lang' => $contact->default_lang?$contact->default_lang:'', + 'note' => $contact->note?$contact->note:'', + 'no_email' => $contact->no_email?$contact->no_email:'', + 'ref_facturation' => $contact->ref_facturation?$contact->ref_facturation:'', + 'ref_contrat' => $contact->ref_contrat?$contact->ref_contrat:'', + 'ref_commande' => $contact->ref_commande?$contact->ref_commande:'', + 'ref_propal' => $contact->ref_propal?$contact->ref_propal:'', + 'user_id' => $contact->user_id?$contact->user_id:'', + 'user_login' => $contact->user_login?$contact->user_login:'', + 'status' => $contact->statut?$contact->statut:'' ); $i++; From f570cd6b429c6f4724067f907e76e0e23e1604d3 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 4 Mar 2015 20:35:08 +0100 Subject: [PATCH 243/287] Forgot to commit tables --- .../mysql/tables/llx_askpricesupplier.sql | 55 +++++++++++++++++++ .../llx_askpricesupplier_extrafields.sql | 23 ++++++++ .../mysql/tables/llx_askpricesupplierdet.sql | 48 ++++++++++++++++ .../llx_askpricesupplierdet_extrafields.sql | 24 ++++++++ 4 files changed, 150 insertions(+) create mode 100644 htdocs/install/mysql/tables/llx_askpricesupplier.sql create mode 100644 htdocs/install/mysql/tables/llx_askpricesupplier_extrafields.sql create mode 100644 htdocs/install/mysql/tables/llx_askpricesupplierdet.sql create mode 100644 htdocs/install/mysql/tables/llx_askpricesupplierdet_extrafields.sql diff --git a/htdocs/install/mysql/tables/llx_askpricesupplier.sql b/htdocs/install/mysql/tables/llx_askpricesupplier.sql new file mode 100644 index 00000000000..ff62595bd0b --- /dev/null +++ b/htdocs/install/mysql/tables/llx_askpricesupplier.sql @@ -0,0 +1,55 @@ +-- ======================================================================== +-- Copyright (C) 2015 Laurent Destailleur +-- +-- 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 3 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, see . +-- ======================================================================== + +CREATE TABLE llx_askpricesupplier ( + rowid integer NOT NULL AUTO_INCREMENT PRIMARY KEY, + ref varchar(30) NOT NULL, + entity integer NOT NULL DEFAULT '1', + ref_ext varchar(255) DEFAULT NULL, + ref_int varchar(255) DEFAULT NULL, + fk_soc integer DEFAULT NULL, + fk_projet integer DEFAULT NULL, + tms timestamp, + datec datetime DEFAULT NULL, + date_valid datetime DEFAULT NULL, + date_cloture datetime DEFAULT NULL, + fk_user_author integer DEFAULT NULL, + fk_user_modif integer DEFAULT NULL, + fk_user_valid integer DEFAULT NULL, + fk_user_cloture integer DEFAULT NULL, + fk_statut smallint NOT NULL DEFAULT '0', + price double DEFAULT '0', + remise_percent double DEFAULT '0', + remise_absolue double DEFAULT '0', + remise double DEFAULT '0', + total_ht double(24,8) DEFAULT 0, + tva double(24,8) DEFAULT 0, + localtax1 double(24,8) DEFAULT 0, + localtax2 double(24,8) DEFAULT 0, + total double(24,8) DEFAULT 0, + fk_account integer DEFAULT NULL, + fk_currency varchar(3) DEFAULT NULL, + fk_cond_reglement integer DEFAULT NULL, + fk_mode_reglement integer DEFAULT NULL, + note_private text, + note_public text, + model_pdf varchar(255) DEFAULT NULL, + date_livraison date DEFAULT NULL, + fk_shipping_method integer DEFAULT NULL, + import_key varchar(14) DEFAULT NULL, + extraparams varchar(255) DEFAULT NULL +) ENGINE=innodb; diff --git a/htdocs/install/mysql/tables/llx_askpricesupplier_extrafields.sql b/htdocs/install/mysql/tables/llx_askpricesupplier_extrafields.sql new file mode 100644 index 00000000000..4552b4d0079 --- /dev/null +++ b/htdocs/install/mysql/tables/llx_askpricesupplier_extrafields.sql @@ -0,0 +1,23 @@ +-- ======================================================================== +-- Copyright (C) 2015 Laurent Destailleur +-- +-- 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 3 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, see . +-- ======================================================================== + +CREATE TABLE llx_askpricesupplier_extrafields ( + rowid integer AUTO_INCREMENT PRIMARY KEY, + tms timestamp, + fk_object integer NOT NULL, + import_key varchar(14) DEFAULT NULL +) ENGINE=innodb; diff --git a/htdocs/install/mysql/tables/llx_askpricesupplierdet.sql b/htdocs/install/mysql/tables/llx_askpricesupplierdet.sql new file mode 100644 index 00000000000..5755fdcb83f --- /dev/null +++ b/htdocs/install/mysql/tables/llx_askpricesupplierdet.sql @@ -0,0 +1,48 @@ +-- ======================================================================== +-- Copyright (C) 2015 Laurent Destailleur +-- +-- 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 3 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, see . +-- ======================================================================== + +CREATE TABLE llx_askpricesupplierdet ( + rowid integer NOT NULL AUTO_INCREMENT PRIMARY KEY, + fk_askpricesupplier integer NOT NULL, + fk_parent_line integer DEFAULT NULL, + fk_product integer DEFAULT NULL, + label varchar(255) DEFAULT NULL, + description text, + fk_remise_except integer DEFAULT NULL, + tva_tx double(6,3) DEFAULT 0, + localtax1_tx double(6,3) DEFAULT 0, + localtax1_type varchar(10) DEFAULT NULL, + localtax2_tx double(6,3) DEFAULT 0, + localtax2_type varchar(10) DEFAULT NULL, + qty double DEFAULT NULL, + remise_percent double DEFAULT '0', + remise double DEFAULT '0', + price double DEFAULT NULL, + subprice double(24,8) DEFAULT 0, + total_ht double(24,8) DEFAULT 0, + total_tva double(24,8) DEFAULT 0, + total_localtax1 double(24,8) DEFAULT 0, + total_localtax2 double(24,8) DEFAULT 0, + total_ttc double(24,8) DEFAULT 0, + product_type integer DEFAULT 0, + info_bits integer DEFAULT 0, + buy_price_ht double(24,8) DEFAULT 0, + fk_product_fournisseur_price integer DEFAULT NULL, + special_code integer DEFAULT 0, + rang integer DEFAULT 0, + ref_fourn varchar(30) DEFAULT NULL +) ENGINE=innodb; \ No newline at end of file diff --git a/htdocs/install/mysql/tables/llx_askpricesupplierdet_extrafields.sql b/htdocs/install/mysql/tables/llx_askpricesupplierdet_extrafields.sql new file mode 100644 index 00000000000..6ecbcf83d2c --- /dev/null +++ b/htdocs/install/mysql/tables/llx_askpricesupplierdet_extrafields.sql @@ -0,0 +1,24 @@ +-- ======================================================================== +-- Copyright (C) 2015 Laurent Destailleur +-- +-- 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 3 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, see . +-- ======================================================================== + +CREATE TABLE llx_askpricesupplierdet_extrafields ( + rowid integer AUTO_INCREMENT PRIMAR KEY, + tms timestamp, + fk_object integer NOT NULL, + import_key varchar(14) DEFAULT NULL +) ENGINE=innodb; + From 56e77382f3a1b4087f69c5713bca94a1df2baa1a Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 4 Mar 2015 20:43:54 +0100 Subject: [PATCH 244/287] Merge --- dev/fixdosfiles.sh | 1 + htdocs/includes/tcpdi/fpdf_tpl.php | 920 ++++++++++++++--------------- 2 files changed, 461 insertions(+), 460 deletions(-) diff --git a/dev/fixdosfiles.sh b/dev/fixdosfiles.sh index 30d47e7b0c4..5efd4b58543 100755 --- a/dev/fixdosfiles.sh +++ b/dev/fixdosfiles.sh @@ -10,6 +10,7 @@ # Syntax if [ "x$1" != "xlist" -a "x$1" != "xfix" ] then + echo "This script clean files with CR+LF into files with LF only. All source files are included, also files into includes." echo "Usage: fixdosfiles.sh [list|fix]" fi diff --git a/htdocs/includes/tcpdi/fpdf_tpl.php b/htdocs/includes/tcpdi/fpdf_tpl.php index 86e38b71641..8482ba336ed 100644 --- a/htdocs/includes/tcpdi/fpdf_tpl.php +++ b/htdocs/includes/tcpdi/fpdf_tpl.php @@ -1,460 +1,460 @@ -Error('This method is only usable with FPDF. Use TCPDF methods startTemplate() instead.'); - return; - } - - if ($this->page <= 0) - $this->error("You have to add a page to fpdf first!"); - - if ($x == null) - $x = 0; - if ($y == null) - $y = 0; - if ($w == null) - $w = $this->w; - if ($h == null) - $h = $this->h; - - // Save settings - $this->tpl++; - $tpl =& $this->tpls[$this->tpl]; - $tpl = array( - 'o_x' => $this->x, - 'o_y' => $this->y, - 'o_AutoPageBreak' => $this->AutoPageBreak, - 'o_bMargin' => $this->bMargin, - 'o_tMargin' => $this->tMargin, - 'o_lMargin' => $this->lMargin, - 'o_rMargin' => $this->rMargin, - 'o_h' => $this->h, - 'o_w' => $this->w, - 'o_FontFamily' => $this->FontFamily, - 'o_FontStyle' => $this->FontStyle, - 'o_FontSizePt' => $this->FontSizePt, - 'o_FontSize' => $this->FontSize, - 'buffer' => '', - 'x' => $x, - 'y' => $y, - 'w' => $w, - 'h' => $h - ); - - $this->SetAutoPageBreak(false); - - // Define own high and width to calculate possitions correct - $this->h = $h; - $this->w = $w; - - $this->_intpl = true; - $this->SetXY($x + $this->lMargin, $y + $this->tMargin); - $this->SetRightMargin($this->w - $w + $this->rMargin); - - if ($this->CurrentFont) { - $fontkey = $this->FontFamily . $this->FontStyle; - $this->_res['tpl'][$this->tpl]['fonts'][$fontkey] =& $this->fonts[$fontkey]; - - $this->_out(sprintf('BT /F%d %.2f Tf ET', $this->CurrentFont['i'], $this->FontSizePt)); - } - - return $this->tpl; - } - - /** - * End Template - * - * This method ends a template and reset initiated variables on beginTemplate. - * - * @return mixed If a template is opened, the ID is returned. If not a false is returned. - */ - function endTemplate() { - if (is_subclass_of($this, 'TCPDF')) { - $args = func_get_args(); - return call_user_func_array(array($this, 'TCPDF::endTemplate'), $args); - } - - if ($this->_intpl) { - $this->_intpl = false; - $tpl =& $this->tpls[$this->tpl]; - $this->SetXY($tpl['o_x'], $tpl['o_y']); - $this->tMargin = $tpl['o_tMargin']; - $this->lMargin = $tpl['o_lMargin']; - $this->rMargin = $tpl['o_rMargin']; - $this->h = $tpl['o_h']; - $this->w = $tpl['o_w']; - $this->SetAutoPageBreak($tpl['o_AutoPageBreak'], $tpl['o_bMargin']); - - $this->FontFamily = $tpl['o_FontFamily']; - $this->FontStyle = $tpl['o_FontStyle']; - $this->FontSizePt = $tpl['o_FontSizePt']; - $this->FontSize = $tpl['o_FontSize']; - - $fontkey = $this->FontFamily . $this->FontStyle; - if ($fontkey) - $this->CurrentFont =& $this->fonts[$fontkey]; - - return $this->tpl; - } else { - return false; - } - } - - /** - * Use a Template in current Page or other Template - * - * You can use a template in a page or in another template. - * You can give the used template a new size like you use the Image()-method. - * All parameters are optional. The width or height is calculated automaticaly - * if one is given. If no parameter is given the origin size as defined in - * beginTemplate() is used. - * The calculated or used width and height are returned as an array. - * - * @param int $tplidx A valid template-Id - * @param int $_x The x-position - * @param int $_y The y-position - * @param int $_w The new width of the template - * @param int $_h The new height of the template - * @retrun array The height and width of the template - */ - function useTemplate($tplidx, $_x = null, $_y = null, $_w = 0, $_h = 0) { - if ($this->page <= 0) - $this->error('You have to add a page first!'); - - if (!isset($this->tpls[$tplidx])) - $this->error('Template does not exist!'); - - if ($this->_intpl) { - $this->_res['tpl'][$this->tpl]['tpls'][$tplidx] =& $this->tpls[$tplidx]; - } - - $tpl =& $this->tpls[$tplidx]; - $w = $tpl['w']; - $h = $tpl['h']; - - if ($_x == null) - $_x = 0; - if ($_y == null) - $_y = 0; - - $_x += $tpl['x']; - $_y += $tpl['y']; - - $wh = $this->getTemplateSize($tplidx, $_w, $_h); - $_w = $wh['w']; - $_h = $wh['h']; - - $tData = array( - 'x' => $this->x, - 'y' => $this->y, - 'w' => $_w, - 'h' => $_h, - 'scaleX' => ($_w / $w), - 'scaleY' => ($_h / $h), - 'tx' => $_x, - 'ty' => ($this->h - $_y - $_h), - 'lty' => ($this->h - $_y - $_h) - ($this->h - $h) * ($_h / $h) - ); - - $this->_out(sprintf('q %.4F 0 0 %.4F %.4F %.4F cm', $tData['scaleX'], $tData['scaleY'], $tData['tx'] * $this->k, $tData['ty'] * $this->k)); // Translate - $this->_out(sprintf('%s%d Do Q', $this->tplprefix, $tplidx)); - - $this->lastUsedTemplateData = $tData; - - return array('w' => $_w, 'h' => $_h); - } - - /** - * Get The calculated Size of a Template - * - * If one size is given, this method calculates the other one. - * - * @param int $tplidx A valid template-Id - * @param int $_w The width of the template - * @param int $_h The height of the template - * @return array The height and width of the template - */ - function getTemplateSize($tplidx, $_w = 0, $_h = 0) { - if (!isset($this->tpls[$tplidx])) - return false; - - $tpl =& $this->tpls[$tplidx]; - $w = $tpl['w']; - $h = $tpl['h']; - - if ($_w == 0 and $_h == 0) { - $_w = $w; - $_h = $h; - } - - if($_w == 0) - $_w = $_h * $w / $h; - if($_h == 0) - $_h = $_w * $h / $w; - - return array("w" => $_w, "h" => $_h); - } - - /** - * See FPDF/TCPDF-Documentation ;-) - */ - public function SetFont($family, $style = '', $size = 0) { - if (is_subclass_of($this, 'TCPDF')) { - $args = func_get_args(); - return call_user_func_array(array($this, 'TCPDF::SetFont'), $args); - } - - parent::SetFont($family, $style, $size); - - $fontkey = $this->FontFamily . $this->FontStyle; - - if ($this->_intpl) { - $this->_res['tpl'][$this->tpl]['fonts'][$fontkey] =& $this->fonts[$fontkey]; - } else { - $this->_res['page'][$this->page]['fonts'][$fontkey] =& $this->fonts[$fontkey]; - } - } - - /** - * See FPDF/TCPDF-Documentation ;-) - */ - function Image( - $file, $x = '', $y = '', $w = 0, $h = 0, $type = '', $link = '', $align = '', $resize = false, - $dpi = 300, $palign = '', $ismask = false, $imgmask = false, $border = 0, $fitbox = false, - $hidden = false, $fitonpage = false, $alt = false, $altimgs = array() - ) { - if (is_subclass_of($this, 'TCPDF')) { - $args = func_get_args(); - return call_user_func_array(array($this, 'TCPDF::Image'), $args); - } - - $ret = parent::Image($file, $x, $y, $w, $h, $type, $link); - if ($this->_intpl) { - $this->_res['tpl'][$this->tpl]['images'][$file] =& $this->images[$file]; - } else { - $this->_res['page'][$this->page]['images'][$file] =& $this->images[$file]; - } - - return $ret; - } - - /** - * See FPDF-Documentation ;-) - * - * AddPage is not available when you're "in" a template. - */ - function AddPage($orientation = '', $format = '', $keepmargins = false, $tocpage = false) { - if (is_subclass_of($this, 'TCPDF')) { - $args = func_get_args(); - return call_user_func_array(array($this, 'TCPDF::AddPage'), $args); - } - - if ($this->_intpl) - $this->Error('Adding pages in templates isn\'t possible!'); - - parent::AddPage($orientation, $format); - } - - /** - * Preserve adding Links in Templates ...won't work - */ - function Link($x, $y, $w, $h, $link, $spaces = 0) { - if (is_subclass_of($this, 'TCPDF')) { - $args = func_get_args(); - return call_user_func_array(array($this, 'TCPDF::Link'), $args); - } - - if ($this->_intpl) - $this->Error('Using links in templates aren\'t possible!'); - - parent::Link($x, $y, $w, $h, $link); - } - - function AddLink() { - if (is_subclass_of($this, 'TCPDF')) { - $args = func_get_args(); - return call_user_func_array(array($this, 'TCPDF::AddLink'), $args); - } - - if ($this->_intpl) - $this->Error('Adding links in templates aren\'t possible!'); - return parent::AddLink(); - } - - function SetLink($link, $y = 0, $page = -1) { - if (is_subclass_of($this, 'TCPDF')) { - $args = func_get_args(); - return call_user_func_array(array($this, 'TCPDF::SetLink'), $args); - } - - if ($this->_intpl) - $this->Error('Setting links in templates aren\'t possible!'); - parent::SetLink($link, $y, $page); - } - - /** - * Private Method that writes the form xobjects - */ - function _putformxobjects() { - $filter=($this->compress) ? '/Filter /FlateDecode ' : ''; - reset($this->tpls); - foreach($this->tpls AS $tplidx => $tpl) { - - $p=($this->compress) ? gzcompress($tpl['buffer']) : $tpl['buffer']; - $this->_newobj(); - $this->tpls[$tplidx]['n'] = $this->n; - $this->_out('<<'.$filter.'/Type /XObject'); - $this->_out('/Subtype /Form'); - $this->_out('/FormType 1'); - $this->_out(sprintf('/BBox [%.2F %.2F %.2F %.2F]', - // llx - $tpl['x'] * $this->k, - // lly - -$tpl['y'] * $this->k, - // urx - ($tpl['w'] + $tpl['x']) * $this->k, - // ury - ($tpl['h'] - $tpl['y']) * $this->k - )); - - if ($tpl['x'] != 0 || $tpl['y'] != 0) { - $this->_out(sprintf('/Matrix [1 0 0 1 %.5F %.5F]', - -$tpl['x'] * $this->k * 2, $tpl['y'] * $this->k * 2 - )); - } - - $this->_out('/Resources '); - - $this->_out('<_res['tpl'][$tplidx]['fonts']) && count($this->_res['tpl'][$tplidx]['fonts'])) { - $this->_out('/Font <<'); - foreach($this->_res['tpl'][$tplidx]['fonts'] as $font) - $this->_out('/F' . $font['i'] . ' ' . $font['n'] . ' 0 R'); - $this->_out('>>'); - } - if(isset($this->_res['tpl'][$tplidx]['images']) && count($this->_res['tpl'][$tplidx]['images']) || - isset($this->_res['tpl'][$tplidx]['tpls']) && count($this->_res['tpl'][$tplidx]['tpls'])) - { - $this->_out('/XObject <<'); - if (isset($this->_res['tpl'][$tplidx]['images']) && count($this->_res['tpl'][$tplidx]['images'])) { - foreach($this->_res['tpl'][$tplidx]['images'] as $image) - $this->_out('/I' . $image['i'] . ' ' . $image['n'] . ' 0 R'); - } - if (isset($this->_res['tpl'][$tplidx]['tpls']) && count($this->_res['tpl'][$tplidx]['tpls'])) { - foreach($this->_res['tpl'][$tplidx]['tpls'] as $i => $tpl) - $this->_out($this->tplprefix . $i . ' ' . $tpl['n'] . ' 0 R'); - } - $this->_out('>>'); - } - $this->_out('>>'); - - $this->_out('/Length ' . strlen($p) . ' >>'); - $this->_putstream($p); - $this->_out('endobj'); - } - } - - /** - * Overwritten to add _putformxobjects() after _putimages() - * - */ - function _putimages() { - parent::_putimages(); - $this->_putformxobjects(); - } - - function _putxobjectdict() { - parent::_putxobjectdict(); - - if (count($this->tpls)) { - foreach($this->tpls as $tplidx => $tpl) { - $this->_out(sprintf('%s%d %d 0 R', $this->tplprefix, $tplidx, $tpl['n'])); - } - } - } - - /** - * Private Method - */ - function _out($s) { - if ($this->state == 2 && $this->_intpl) { - $this->tpls[$this->tpl]['buffer'] .= $s . "\n"; - } else { - parent::_out($s); - } - } -} +Error('This method is only usable with FPDF. Use TCPDF methods startTemplate() instead.'); + return; + } + + if ($this->page <= 0) + $this->error("You have to add a page to fpdf first!"); + + if ($x == null) + $x = 0; + if ($y == null) + $y = 0; + if ($w == null) + $w = $this->w; + if ($h == null) + $h = $this->h; + + // Save settings + $this->tpl++; + $tpl =& $this->tpls[$this->tpl]; + $tpl = array( + 'o_x' => $this->x, + 'o_y' => $this->y, + 'o_AutoPageBreak' => $this->AutoPageBreak, + 'o_bMargin' => $this->bMargin, + 'o_tMargin' => $this->tMargin, + 'o_lMargin' => $this->lMargin, + 'o_rMargin' => $this->rMargin, + 'o_h' => $this->h, + 'o_w' => $this->w, + 'o_FontFamily' => $this->FontFamily, + 'o_FontStyle' => $this->FontStyle, + 'o_FontSizePt' => $this->FontSizePt, + 'o_FontSize' => $this->FontSize, + 'buffer' => '', + 'x' => $x, + 'y' => $y, + 'w' => $w, + 'h' => $h + ); + + $this->SetAutoPageBreak(false); + + // Define own high and width to calculate possitions correct + $this->h = $h; + $this->w = $w; + + $this->_intpl = true; + $this->SetXY($x + $this->lMargin, $y + $this->tMargin); + $this->SetRightMargin($this->w - $w + $this->rMargin); + + if ($this->CurrentFont) { + $fontkey = $this->FontFamily . $this->FontStyle; + $this->_res['tpl'][$this->tpl]['fonts'][$fontkey] =& $this->fonts[$fontkey]; + + $this->_out(sprintf('BT /F%d %.2f Tf ET', $this->CurrentFont['i'], $this->FontSizePt)); + } + + return $this->tpl; + } + + /** + * End Template + * + * This method ends a template and reset initiated variables on beginTemplate. + * + * @return mixed If a template is opened, the ID is returned. If not a false is returned. + */ + function endTemplate() { + if (is_subclass_of($this, 'TCPDF')) { + $args = func_get_args(); + return call_user_func_array(array($this, 'TCPDF::endTemplate'), $args); + } + + if ($this->_intpl) { + $this->_intpl = false; + $tpl =& $this->tpls[$this->tpl]; + $this->SetXY($tpl['o_x'], $tpl['o_y']); + $this->tMargin = $tpl['o_tMargin']; + $this->lMargin = $tpl['o_lMargin']; + $this->rMargin = $tpl['o_rMargin']; + $this->h = $tpl['o_h']; + $this->w = $tpl['o_w']; + $this->SetAutoPageBreak($tpl['o_AutoPageBreak'], $tpl['o_bMargin']); + + $this->FontFamily = $tpl['o_FontFamily']; + $this->FontStyle = $tpl['o_FontStyle']; + $this->FontSizePt = $tpl['o_FontSizePt']; + $this->FontSize = $tpl['o_FontSize']; + + $fontkey = $this->FontFamily . $this->FontStyle; + if ($fontkey) + $this->CurrentFont =& $this->fonts[$fontkey]; + + return $this->tpl; + } else { + return false; + } + } + + /** + * Use a Template in current Page or other Template + * + * You can use a template in a page or in another template. + * You can give the used template a new size like you use the Image()-method. + * All parameters are optional. The width or height is calculated automaticaly + * if one is given. If no parameter is given the origin size as defined in + * beginTemplate() is used. + * The calculated or used width and height are returned as an array. + * + * @param int $tplidx A valid template-Id + * @param int $_x The x-position + * @param int $_y The y-position + * @param int $_w The new width of the template + * @param int $_h The new height of the template + * @retrun array The height and width of the template + */ + function useTemplate($tplidx, $_x = null, $_y = null, $_w = 0, $_h = 0) { + if ($this->page <= 0) + $this->error('You have to add a page first!'); + + if (!isset($this->tpls[$tplidx])) + $this->error('Template does not exist!'); + + if ($this->_intpl) { + $this->_res['tpl'][$this->tpl]['tpls'][$tplidx] =& $this->tpls[$tplidx]; + } + + $tpl =& $this->tpls[$tplidx]; + $w = $tpl['w']; + $h = $tpl['h']; + + if ($_x == null) + $_x = 0; + if ($_y == null) + $_y = 0; + + $_x += $tpl['x']; + $_y += $tpl['y']; + + $wh = $this->getTemplateSize($tplidx, $_w, $_h); + $_w = $wh['w']; + $_h = $wh['h']; + + $tData = array( + 'x' => $this->x, + 'y' => $this->y, + 'w' => $_w, + 'h' => $_h, + 'scaleX' => ($_w / $w), + 'scaleY' => ($_h / $h), + 'tx' => $_x, + 'ty' => ($this->h - $_y - $_h), + 'lty' => ($this->h - $_y - $_h) - ($this->h - $h) * ($_h / $h) + ); + + $this->_out(sprintf('q %.4F 0 0 %.4F %.4F %.4F cm', $tData['scaleX'], $tData['scaleY'], $tData['tx'] * $this->k, $tData['ty'] * $this->k)); // Translate + $this->_out(sprintf('%s%d Do Q', $this->tplprefix, $tplidx)); + + $this->lastUsedTemplateData = $tData; + + return array('w' => $_w, 'h' => $_h); + } + + /** + * Get The calculated Size of a Template + * + * If one size is given, this method calculates the other one. + * + * @param int $tplidx A valid template-Id + * @param int $_w The width of the template + * @param int $_h The height of the template + * @return array The height and width of the template + */ + function getTemplateSize($tplidx, $_w = 0, $_h = 0) { + if (!isset($this->tpls[$tplidx])) + return false; + + $tpl =& $this->tpls[$tplidx]; + $w = $tpl['w']; + $h = $tpl['h']; + + if ($_w == 0 and $_h == 0) { + $_w = $w; + $_h = $h; + } + + if($_w == 0) + $_w = $_h * $w / $h; + if($_h == 0) + $_h = $_w * $h / $w; + + return array("w" => $_w, "h" => $_h); + } + + /** + * See FPDF/TCPDF-Documentation ;-) + */ + public function SetFont($family, $style = '', $size = 0) { + if (is_subclass_of($this, 'TCPDF')) { + $args = func_get_args(); + return call_user_func_array(array($this, 'TCPDF::SetFont'), $args); + } + + parent::SetFont($family, $style, $size); + + $fontkey = $this->FontFamily . $this->FontStyle; + + if ($this->_intpl) { + $this->_res['tpl'][$this->tpl]['fonts'][$fontkey] =& $this->fonts[$fontkey]; + } else { + $this->_res['page'][$this->page]['fonts'][$fontkey] =& $this->fonts[$fontkey]; + } + } + + /** + * See FPDF/TCPDF-Documentation ;-) + */ + function Image( + $file, $x = '', $y = '', $w = 0, $h = 0, $type = '', $link = '', $align = '', $resize = false, + $dpi = 300, $palign = '', $ismask = false, $imgmask = false, $border = 0, $fitbox = false, + $hidden = false, $fitonpage = false, $alt = false, $altimgs = array() + ) { + if (is_subclass_of($this, 'TCPDF')) { + $args = func_get_args(); + return call_user_func_array(array($this, 'TCPDF::Image'), $args); + } + + $ret = parent::Image($file, $x, $y, $w, $h, $type, $link); + if ($this->_intpl) { + $this->_res['tpl'][$this->tpl]['images'][$file] =& $this->images[$file]; + } else { + $this->_res['page'][$this->page]['images'][$file] =& $this->images[$file]; + } + + return $ret; + } + + /** + * See FPDF-Documentation ;-) + * + * AddPage is not available when you're "in" a template. + */ + function AddPage($orientation = '', $format = '', $keepmargins = false, $tocpage = false) { + if (is_subclass_of($this, 'TCPDF')) { + $args = func_get_args(); + return call_user_func_array(array($this, 'TCPDF::AddPage'), $args); + } + + if ($this->_intpl) + $this->Error('Adding pages in templates isn\'t possible!'); + + parent::AddPage($orientation, $format); + } + + /** + * Preserve adding Links in Templates ...won't work + */ + function Link($x, $y, $w, $h, $link, $spaces = 0) { + if (is_subclass_of($this, 'TCPDF')) { + $args = func_get_args(); + return call_user_func_array(array($this, 'TCPDF::Link'), $args); + } + + if ($this->_intpl) + $this->Error('Using links in templates aren\'t possible!'); + + parent::Link($x, $y, $w, $h, $link); + } + + function AddLink() { + if (is_subclass_of($this, 'TCPDF')) { + $args = func_get_args(); + return call_user_func_array(array($this, 'TCPDF::AddLink'), $args); + } + + if ($this->_intpl) + $this->Error('Adding links in templates aren\'t possible!'); + return parent::AddLink(); + } + + function SetLink($link, $y = 0, $page = -1) { + if (is_subclass_of($this, 'TCPDF')) { + $args = func_get_args(); + return call_user_func_array(array($this, 'TCPDF::SetLink'), $args); + } + + if ($this->_intpl) + $this->Error('Setting links in templates aren\'t possible!'); + parent::SetLink($link, $y, $page); + } + + /** + * Private Method that writes the form xobjects + */ + function _putformxobjects() { + $filter=($this->compress) ? '/Filter /FlateDecode ' : ''; + reset($this->tpls); + foreach($this->tpls AS $tplidx => $tpl) { + + $p=($this->compress) ? gzcompress($tpl['buffer']) : $tpl['buffer']; + $this->_newobj(); + $this->tpls[$tplidx]['n'] = $this->n; + $this->_out('<<'.$filter.'/Type /XObject'); + $this->_out('/Subtype /Form'); + $this->_out('/FormType 1'); + $this->_out(sprintf('/BBox [%.2F %.2F %.2F %.2F]', + // llx + $tpl['x'] * $this->k, + // lly + -$tpl['y'] * $this->k, + // urx + ($tpl['w'] + $tpl['x']) * $this->k, + // ury + ($tpl['h'] - $tpl['y']) * $this->k + )); + + if ($tpl['x'] != 0 || $tpl['y'] != 0) { + $this->_out(sprintf('/Matrix [1 0 0 1 %.5F %.5F]', + -$tpl['x'] * $this->k * 2, $tpl['y'] * $this->k * 2 + )); + } + + $this->_out('/Resources '); + + $this->_out('<_res['tpl'][$tplidx]['fonts']) && count($this->_res['tpl'][$tplidx]['fonts'])) { + $this->_out('/Font <<'); + foreach($this->_res['tpl'][$tplidx]['fonts'] as $font) + $this->_out('/F' . $font['i'] . ' ' . $font['n'] . ' 0 R'); + $this->_out('>>'); + } + if(isset($this->_res['tpl'][$tplidx]['images']) && count($this->_res['tpl'][$tplidx]['images']) || + isset($this->_res['tpl'][$tplidx]['tpls']) && count($this->_res['tpl'][$tplidx]['tpls'])) + { + $this->_out('/XObject <<'); + if (isset($this->_res['tpl'][$tplidx]['images']) && count($this->_res['tpl'][$tplidx]['images'])) { + foreach($this->_res['tpl'][$tplidx]['images'] as $image) + $this->_out('/I' . $image['i'] . ' ' . $image['n'] . ' 0 R'); + } + if (isset($this->_res['tpl'][$tplidx]['tpls']) && count($this->_res['tpl'][$tplidx]['tpls'])) { + foreach($this->_res['tpl'][$tplidx]['tpls'] as $i => $tpl) + $this->_out($this->tplprefix . $i . ' ' . $tpl['n'] . ' 0 R'); + } + $this->_out('>>'); + } + $this->_out('>>'); + + $this->_out('/Length ' . strlen($p) . ' >>'); + $this->_putstream($p); + $this->_out('endobj'); + } + } + + /** + * Overwritten to add _putformxobjects() after _putimages() + * + */ + function _putimages() { + parent::_putimages(); + $this->_putformxobjects(); + } + + function _putxobjectdict() { + parent::_putxobjectdict(); + + if (count($this->tpls)) { + foreach($this->tpls as $tplidx => $tpl) { + $this->_out(sprintf('%s%d %d 0 R', $this->tplprefix, $tplidx, $tpl['n'])); + } + } + } + + /** + * Private Method + */ + function _out($s) { + if ($this->state == 2 && $this->_intpl) { + $this->tpls[$this->tpl]['buffer'] .= $s . "\n"; + } else { + parent::_out($s); + } + } +} From 7a9de0fecab5ee881873d343c4b79bb5067f3eaf Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 4 Mar 2015 20:45:33 +0100 Subject: [PATCH 245/287] CRLF --- htdocs/includes/tcpdi/fpdf_tpl.php | 920 ++++++++++++++--------------- 1 file changed, 460 insertions(+), 460 deletions(-) diff --git a/htdocs/includes/tcpdi/fpdf_tpl.php b/htdocs/includes/tcpdi/fpdf_tpl.php index 86e38b71641..8482ba336ed 100644 --- a/htdocs/includes/tcpdi/fpdf_tpl.php +++ b/htdocs/includes/tcpdi/fpdf_tpl.php @@ -1,460 +1,460 @@ -Error('This method is only usable with FPDF. Use TCPDF methods startTemplate() instead.'); - return; - } - - if ($this->page <= 0) - $this->error("You have to add a page to fpdf first!"); - - if ($x == null) - $x = 0; - if ($y == null) - $y = 0; - if ($w == null) - $w = $this->w; - if ($h == null) - $h = $this->h; - - // Save settings - $this->tpl++; - $tpl =& $this->tpls[$this->tpl]; - $tpl = array( - 'o_x' => $this->x, - 'o_y' => $this->y, - 'o_AutoPageBreak' => $this->AutoPageBreak, - 'o_bMargin' => $this->bMargin, - 'o_tMargin' => $this->tMargin, - 'o_lMargin' => $this->lMargin, - 'o_rMargin' => $this->rMargin, - 'o_h' => $this->h, - 'o_w' => $this->w, - 'o_FontFamily' => $this->FontFamily, - 'o_FontStyle' => $this->FontStyle, - 'o_FontSizePt' => $this->FontSizePt, - 'o_FontSize' => $this->FontSize, - 'buffer' => '', - 'x' => $x, - 'y' => $y, - 'w' => $w, - 'h' => $h - ); - - $this->SetAutoPageBreak(false); - - // Define own high and width to calculate possitions correct - $this->h = $h; - $this->w = $w; - - $this->_intpl = true; - $this->SetXY($x + $this->lMargin, $y + $this->tMargin); - $this->SetRightMargin($this->w - $w + $this->rMargin); - - if ($this->CurrentFont) { - $fontkey = $this->FontFamily . $this->FontStyle; - $this->_res['tpl'][$this->tpl]['fonts'][$fontkey] =& $this->fonts[$fontkey]; - - $this->_out(sprintf('BT /F%d %.2f Tf ET', $this->CurrentFont['i'], $this->FontSizePt)); - } - - return $this->tpl; - } - - /** - * End Template - * - * This method ends a template and reset initiated variables on beginTemplate. - * - * @return mixed If a template is opened, the ID is returned. If not a false is returned. - */ - function endTemplate() { - if (is_subclass_of($this, 'TCPDF')) { - $args = func_get_args(); - return call_user_func_array(array($this, 'TCPDF::endTemplate'), $args); - } - - if ($this->_intpl) { - $this->_intpl = false; - $tpl =& $this->tpls[$this->tpl]; - $this->SetXY($tpl['o_x'], $tpl['o_y']); - $this->tMargin = $tpl['o_tMargin']; - $this->lMargin = $tpl['o_lMargin']; - $this->rMargin = $tpl['o_rMargin']; - $this->h = $tpl['o_h']; - $this->w = $tpl['o_w']; - $this->SetAutoPageBreak($tpl['o_AutoPageBreak'], $tpl['o_bMargin']); - - $this->FontFamily = $tpl['o_FontFamily']; - $this->FontStyle = $tpl['o_FontStyle']; - $this->FontSizePt = $tpl['o_FontSizePt']; - $this->FontSize = $tpl['o_FontSize']; - - $fontkey = $this->FontFamily . $this->FontStyle; - if ($fontkey) - $this->CurrentFont =& $this->fonts[$fontkey]; - - return $this->tpl; - } else { - return false; - } - } - - /** - * Use a Template in current Page or other Template - * - * You can use a template in a page or in another template. - * You can give the used template a new size like you use the Image()-method. - * All parameters are optional. The width or height is calculated automaticaly - * if one is given. If no parameter is given the origin size as defined in - * beginTemplate() is used. - * The calculated or used width and height are returned as an array. - * - * @param int $tplidx A valid template-Id - * @param int $_x The x-position - * @param int $_y The y-position - * @param int $_w The new width of the template - * @param int $_h The new height of the template - * @retrun array The height and width of the template - */ - function useTemplate($tplidx, $_x = null, $_y = null, $_w = 0, $_h = 0) { - if ($this->page <= 0) - $this->error('You have to add a page first!'); - - if (!isset($this->tpls[$tplidx])) - $this->error('Template does not exist!'); - - if ($this->_intpl) { - $this->_res['tpl'][$this->tpl]['tpls'][$tplidx] =& $this->tpls[$tplidx]; - } - - $tpl =& $this->tpls[$tplidx]; - $w = $tpl['w']; - $h = $tpl['h']; - - if ($_x == null) - $_x = 0; - if ($_y == null) - $_y = 0; - - $_x += $tpl['x']; - $_y += $tpl['y']; - - $wh = $this->getTemplateSize($tplidx, $_w, $_h); - $_w = $wh['w']; - $_h = $wh['h']; - - $tData = array( - 'x' => $this->x, - 'y' => $this->y, - 'w' => $_w, - 'h' => $_h, - 'scaleX' => ($_w / $w), - 'scaleY' => ($_h / $h), - 'tx' => $_x, - 'ty' => ($this->h - $_y - $_h), - 'lty' => ($this->h - $_y - $_h) - ($this->h - $h) * ($_h / $h) - ); - - $this->_out(sprintf('q %.4F 0 0 %.4F %.4F %.4F cm', $tData['scaleX'], $tData['scaleY'], $tData['tx'] * $this->k, $tData['ty'] * $this->k)); // Translate - $this->_out(sprintf('%s%d Do Q', $this->tplprefix, $tplidx)); - - $this->lastUsedTemplateData = $tData; - - return array('w' => $_w, 'h' => $_h); - } - - /** - * Get The calculated Size of a Template - * - * If one size is given, this method calculates the other one. - * - * @param int $tplidx A valid template-Id - * @param int $_w The width of the template - * @param int $_h The height of the template - * @return array The height and width of the template - */ - function getTemplateSize($tplidx, $_w = 0, $_h = 0) { - if (!isset($this->tpls[$tplidx])) - return false; - - $tpl =& $this->tpls[$tplidx]; - $w = $tpl['w']; - $h = $tpl['h']; - - if ($_w == 0 and $_h == 0) { - $_w = $w; - $_h = $h; - } - - if($_w == 0) - $_w = $_h * $w / $h; - if($_h == 0) - $_h = $_w * $h / $w; - - return array("w" => $_w, "h" => $_h); - } - - /** - * See FPDF/TCPDF-Documentation ;-) - */ - public function SetFont($family, $style = '', $size = 0) { - if (is_subclass_of($this, 'TCPDF')) { - $args = func_get_args(); - return call_user_func_array(array($this, 'TCPDF::SetFont'), $args); - } - - parent::SetFont($family, $style, $size); - - $fontkey = $this->FontFamily . $this->FontStyle; - - if ($this->_intpl) { - $this->_res['tpl'][$this->tpl]['fonts'][$fontkey] =& $this->fonts[$fontkey]; - } else { - $this->_res['page'][$this->page]['fonts'][$fontkey] =& $this->fonts[$fontkey]; - } - } - - /** - * See FPDF/TCPDF-Documentation ;-) - */ - function Image( - $file, $x = '', $y = '', $w = 0, $h = 0, $type = '', $link = '', $align = '', $resize = false, - $dpi = 300, $palign = '', $ismask = false, $imgmask = false, $border = 0, $fitbox = false, - $hidden = false, $fitonpage = false, $alt = false, $altimgs = array() - ) { - if (is_subclass_of($this, 'TCPDF')) { - $args = func_get_args(); - return call_user_func_array(array($this, 'TCPDF::Image'), $args); - } - - $ret = parent::Image($file, $x, $y, $w, $h, $type, $link); - if ($this->_intpl) { - $this->_res['tpl'][$this->tpl]['images'][$file] =& $this->images[$file]; - } else { - $this->_res['page'][$this->page]['images'][$file] =& $this->images[$file]; - } - - return $ret; - } - - /** - * See FPDF-Documentation ;-) - * - * AddPage is not available when you're "in" a template. - */ - function AddPage($orientation = '', $format = '', $keepmargins = false, $tocpage = false) { - if (is_subclass_of($this, 'TCPDF')) { - $args = func_get_args(); - return call_user_func_array(array($this, 'TCPDF::AddPage'), $args); - } - - if ($this->_intpl) - $this->Error('Adding pages in templates isn\'t possible!'); - - parent::AddPage($orientation, $format); - } - - /** - * Preserve adding Links in Templates ...won't work - */ - function Link($x, $y, $w, $h, $link, $spaces = 0) { - if (is_subclass_of($this, 'TCPDF')) { - $args = func_get_args(); - return call_user_func_array(array($this, 'TCPDF::Link'), $args); - } - - if ($this->_intpl) - $this->Error('Using links in templates aren\'t possible!'); - - parent::Link($x, $y, $w, $h, $link); - } - - function AddLink() { - if (is_subclass_of($this, 'TCPDF')) { - $args = func_get_args(); - return call_user_func_array(array($this, 'TCPDF::AddLink'), $args); - } - - if ($this->_intpl) - $this->Error('Adding links in templates aren\'t possible!'); - return parent::AddLink(); - } - - function SetLink($link, $y = 0, $page = -1) { - if (is_subclass_of($this, 'TCPDF')) { - $args = func_get_args(); - return call_user_func_array(array($this, 'TCPDF::SetLink'), $args); - } - - if ($this->_intpl) - $this->Error('Setting links in templates aren\'t possible!'); - parent::SetLink($link, $y, $page); - } - - /** - * Private Method that writes the form xobjects - */ - function _putformxobjects() { - $filter=($this->compress) ? '/Filter /FlateDecode ' : ''; - reset($this->tpls); - foreach($this->tpls AS $tplidx => $tpl) { - - $p=($this->compress) ? gzcompress($tpl['buffer']) : $tpl['buffer']; - $this->_newobj(); - $this->tpls[$tplidx]['n'] = $this->n; - $this->_out('<<'.$filter.'/Type /XObject'); - $this->_out('/Subtype /Form'); - $this->_out('/FormType 1'); - $this->_out(sprintf('/BBox [%.2F %.2F %.2F %.2F]', - // llx - $tpl['x'] * $this->k, - // lly - -$tpl['y'] * $this->k, - // urx - ($tpl['w'] + $tpl['x']) * $this->k, - // ury - ($tpl['h'] - $tpl['y']) * $this->k - )); - - if ($tpl['x'] != 0 || $tpl['y'] != 0) { - $this->_out(sprintf('/Matrix [1 0 0 1 %.5F %.5F]', - -$tpl['x'] * $this->k * 2, $tpl['y'] * $this->k * 2 - )); - } - - $this->_out('/Resources '); - - $this->_out('<_res['tpl'][$tplidx]['fonts']) && count($this->_res['tpl'][$tplidx]['fonts'])) { - $this->_out('/Font <<'); - foreach($this->_res['tpl'][$tplidx]['fonts'] as $font) - $this->_out('/F' . $font['i'] . ' ' . $font['n'] . ' 0 R'); - $this->_out('>>'); - } - if(isset($this->_res['tpl'][$tplidx]['images']) && count($this->_res['tpl'][$tplidx]['images']) || - isset($this->_res['tpl'][$tplidx]['tpls']) && count($this->_res['tpl'][$tplidx]['tpls'])) - { - $this->_out('/XObject <<'); - if (isset($this->_res['tpl'][$tplidx]['images']) && count($this->_res['tpl'][$tplidx]['images'])) { - foreach($this->_res['tpl'][$tplidx]['images'] as $image) - $this->_out('/I' . $image['i'] . ' ' . $image['n'] . ' 0 R'); - } - if (isset($this->_res['tpl'][$tplidx]['tpls']) && count($this->_res['tpl'][$tplidx]['tpls'])) { - foreach($this->_res['tpl'][$tplidx]['tpls'] as $i => $tpl) - $this->_out($this->tplprefix . $i . ' ' . $tpl['n'] . ' 0 R'); - } - $this->_out('>>'); - } - $this->_out('>>'); - - $this->_out('/Length ' . strlen($p) . ' >>'); - $this->_putstream($p); - $this->_out('endobj'); - } - } - - /** - * Overwritten to add _putformxobjects() after _putimages() - * - */ - function _putimages() { - parent::_putimages(); - $this->_putformxobjects(); - } - - function _putxobjectdict() { - parent::_putxobjectdict(); - - if (count($this->tpls)) { - foreach($this->tpls as $tplidx => $tpl) { - $this->_out(sprintf('%s%d %d 0 R', $this->tplprefix, $tplidx, $tpl['n'])); - } - } - } - - /** - * Private Method - */ - function _out($s) { - if ($this->state == 2 && $this->_intpl) { - $this->tpls[$this->tpl]['buffer'] .= $s . "\n"; - } else { - parent::_out($s); - } - } -} +Error('This method is only usable with FPDF. Use TCPDF methods startTemplate() instead.'); + return; + } + + if ($this->page <= 0) + $this->error("You have to add a page to fpdf first!"); + + if ($x == null) + $x = 0; + if ($y == null) + $y = 0; + if ($w == null) + $w = $this->w; + if ($h == null) + $h = $this->h; + + // Save settings + $this->tpl++; + $tpl =& $this->tpls[$this->tpl]; + $tpl = array( + 'o_x' => $this->x, + 'o_y' => $this->y, + 'o_AutoPageBreak' => $this->AutoPageBreak, + 'o_bMargin' => $this->bMargin, + 'o_tMargin' => $this->tMargin, + 'o_lMargin' => $this->lMargin, + 'o_rMargin' => $this->rMargin, + 'o_h' => $this->h, + 'o_w' => $this->w, + 'o_FontFamily' => $this->FontFamily, + 'o_FontStyle' => $this->FontStyle, + 'o_FontSizePt' => $this->FontSizePt, + 'o_FontSize' => $this->FontSize, + 'buffer' => '', + 'x' => $x, + 'y' => $y, + 'w' => $w, + 'h' => $h + ); + + $this->SetAutoPageBreak(false); + + // Define own high and width to calculate possitions correct + $this->h = $h; + $this->w = $w; + + $this->_intpl = true; + $this->SetXY($x + $this->lMargin, $y + $this->tMargin); + $this->SetRightMargin($this->w - $w + $this->rMargin); + + if ($this->CurrentFont) { + $fontkey = $this->FontFamily . $this->FontStyle; + $this->_res['tpl'][$this->tpl]['fonts'][$fontkey] =& $this->fonts[$fontkey]; + + $this->_out(sprintf('BT /F%d %.2f Tf ET', $this->CurrentFont['i'], $this->FontSizePt)); + } + + return $this->tpl; + } + + /** + * End Template + * + * This method ends a template and reset initiated variables on beginTemplate. + * + * @return mixed If a template is opened, the ID is returned. If not a false is returned. + */ + function endTemplate() { + if (is_subclass_of($this, 'TCPDF')) { + $args = func_get_args(); + return call_user_func_array(array($this, 'TCPDF::endTemplate'), $args); + } + + if ($this->_intpl) { + $this->_intpl = false; + $tpl =& $this->tpls[$this->tpl]; + $this->SetXY($tpl['o_x'], $tpl['o_y']); + $this->tMargin = $tpl['o_tMargin']; + $this->lMargin = $tpl['o_lMargin']; + $this->rMargin = $tpl['o_rMargin']; + $this->h = $tpl['o_h']; + $this->w = $tpl['o_w']; + $this->SetAutoPageBreak($tpl['o_AutoPageBreak'], $tpl['o_bMargin']); + + $this->FontFamily = $tpl['o_FontFamily']; + $this->FontStyle = $tpl['o_FontStyle']; + $this->FontSizePt = $tpl['o_FontSizePt']; + $this->FontSize = $tpl['o_FontSize']; + + $fontkey = $this->FontFamily . $this->FontStyle; + if ($fontkey) + $this->CurrentFont =& $this->fonts[$fontkey]; + + return $this->tpl; + } else { + return false; + } + } + + /** + * Use a Template in current Page or other Template + * + * You can use a template in a page or in another template. + * You can give the used template a new size like you use the Image()-method. + * All parameters are optional. The width or height is calculated automaticaly + * if one is given. If no parameter is given the origin size as defined in + * beginTemplate() is used. + * The calculated or used width and height are returned as an array. + * + * @param int $tplidx A valid template-Id + * @param int $_x The x-position + * @param int $_y The y-position + * @param int $_w The new width of the template + * @param int $_h The new height of the template + * @retrun array The height and width of the template + */ + function useTemplate($tplidx, $_x = null, $_y = null, $_w = 0, $_h = 0) { + if ($this->page <= 0) + $this->error('You have to add a page first!'); + + if (!isset($this->tpls[$tplidx])) + $this->error('Template does not exist!'); + + if ($this->_intpl) { + $this->_res['tpl'][$this->tpl]['tpls'][$tplidx] =& $this->tpls[$tplidx]; + } + + $tpl =& $this->tpls[$tplidx]; + $w = $tpl['w']; + $h = $tpl['h']; + + if ($_x == null) + $_x = 0; + if ($_y == null) + $_y = 0; + + $_x += $tpl['x']; + $_y += $tpl['y']; + + $wh = $this->getTemplateSize($tplidx, $_w, $_h); + $_w = $wh['w']; + $_h = $wh['h']; + + $tData = array( + 'x' => $this->x, + 'y' => $this->y, + 'w' => $_w, + 'h' => $_h, + 'scaleX' => ($_w / $w), + 'scaleY' => ($_h / $h), + 'tx' => $_x, + 'ty' => ($this->h - $_y - $_h), + 'lty' => ($this->h - $_y - $_h) - ($this->h - $h) * ($_h / $h) + ); + + $this->_out(sprintf('q %.4F 0 0 %.4F %.4F %.4F cm', $tData['scaleX'], $tData['scaleY'], $tData['tx'] * $this->k, $tData['ty'] * $this->k)); // Translate + $this->_out(sprintf('%s%d Do Q', $this->tplprefix, $tplidx)); + + $this->lastUsedTemplateData = $tData; + + return array('w' => $_w, 'h' => $_h); + } + + /** + * Get The calculated Size of a Template + * + * If one size is given, this method calculates the other one. + * + * @param int $tplidx A valid template-Id + * @param int $_w The width of the template + * @param int $_h The height of the template + * @return array The height and width of the template + */ + function getTemplateSize($tplidx, $_w = 0, $_h = 0) { + if (!isset($this->tpls[$tplidx])) + return false; + + $tpl =& $this->tpls[$tplidx]; + $w = $tpl['w']; + $h = $tpl['h']; + + if ($_w == 0 and $_h == 0) { + $_w = $w; + $_h = $h; + } + + if($_w == 0) + $_w = $_h * $w / $h; + if($_h == 0) + $_h = $_w * $h / $w; + + return array("w" => $_w, "h" => $_h); + } + + /** + * See FPDF/TCPDF-Documentation ;-) + */ + public function SetFont($family, $style = '', $size = 0) { + if (is_subclass_of($this, 'TCPDF')) { + $args = func_get_args(); + return call_user_func_array(array($this, 'TCPDF::SetFont'), $args); + } + + parent::SetFont($family, $style, $size); + + $fontkey = $this->FontFamily . $this->FontStyle; + + if ($this->_intpl) { + $this->_res['tpl'][$this->tpl]['fonts'][$fontkey] =& $this->fonts[$fontkey]; + } else { + $this->_res['page'][$this->page]['fonts'][$fontkey] =& $this->fonts[$fontkey]; + } + } + + /** + * See FPDF/TCPDF-Documentation ;-) + */ + function Image( + $file, $x = '', $y = '', $w = 0, $h = 0, $type = '', $link = '', $align = '', $resize = false, + $dpi = 300, $palign = '', $ismask = false, $imgmask = false, $border = 0, $fitbox = false, + $hidden = false, $fitonpage = false, $alt = false, $altimgs = array() + ) { + if (is_subclass_of($this, 'TCPDF')) { + $args = func_get_args(); + return call_user_func_array(array($this, 'TCPDF::Image'), $args); + } + + $ret = parent::Image($file, $x, $y, $w, $h, $type, $link); + if ($this->_intpl) { + $this->_res['tpl'][$this->tpl]['images'][$file] =& $this->images[$file]; + } else { + $this->_res['page'][$this->page]['images'][$file] =& $this->images[$file]; + } + + return $ret; + } + + /** + * See FPDF-Documentation ;-) + * + * AddPage is not available when you're "in" a template. + */ + function AddPage($orientation = '', $format = '', $keepmargins = false, $tocpage = false) { + if (is_subclass_of($this, 'TCPDF')) { + $args = func_get_args(); + return call_user_func_array(array($this, 'TCPDF::AddPage'), $args); + } + + if ($this->_intpl) + $this->Error('Adding pages in templates isn\'t possible!'); + + parent::AddPage($orientation, $format); + } + + /** + * Preserve adding Links in Templates ...won't work + */ + function Link($x, $y, $w, $h, $link, $spaces = 0) { + if (is_subclass_of($this, 'TCPDF')) { + $args = func_get_args(); + return call_user_func_array(array($this, 'TCPDF::Link'), $args); + } + + if ($this->_intpl) + $this->Error('Using links in templates aren\'t possible!'); + + parent::Link($x, $y, $w, $h, $link); + } + + function AddLink() { + if (is_subclass_of($this, 'TCPDF')) { + $args = func_get_args(); + return call_user_func_array(array($this, 'TCPDF::AddLink'), $args); + } + + if ($this->_intpl) + $this->Error('Adding links in templates aren\'t possible!'); + return parent::AddLink(); + } + + function SetLink($link, $y = 0, $page = -1) { + if (is_subclass_of($this, 'TCPDF')) { + $args = func_get_args(); + return call_user_func_array(array($this, 'TCPDF::SetLink'), $args); + } + + if ($this->_intpl) + $this->Error('Setting links in templates aren\'t possible!'); + parent::SetLink($link, $y, $page); + } + + /** + * Private Method that writes the form xobjects + */ + function _putformxobjects() { + $filter=($this->compress) ? '/Filter /FlateDecode ' : ''; + reset($this->tpls); + foreach($this->tpls AS $tplidx => $tpl) { + + $p=($this->compress) ? gzcompress($tpl['buffer']) : $tpl['buffer']; + $this->_newobj(); + $this->tpls[$tplidx]['n'] = $this->n; + $this->_out('<<'.$filter.'/Type /XObject'); + $this->_out('/Subtype /Form'); + $this->_out('/FormType 1'); + $this->_out(sprintf('/BBox [%.2F %.2F %.2F %.2F]', + // llx + $tpl['x'] * $this->k, + // lly + -$tpl['y'] * $this->k, + // urx + ($tpl['w'] + $tpl['x']) * $this->k, + // ury + ($tpl['h'] - $tpl['y']) * $this->k + )); + + if ($tpl['x'] != 0 || $tpl['y'] != 0) { + $this->_out(sprintf('/Matrix [1 0 0 1 %.5F %.5F]', + -$tpl['x'] * $this->k * 2, $tpl['y'] * $this->k * 2 + )); + } + + $this->_out('/Resources '); + + $this->_out('<_res['tpl'][$tplidx]['fonts']) && count($this->_res['tpl'][$tplidx]['fonts'])) { + $this->_out('/Font <<'); + foreach($this->_res['tpl'][$tplidx]['fonts'] as $font) + $this->_out('/F' . $font['i'] . ' ' . $font['n'] . ' 0 R'); + $this->_out('>>'); + } + if(isset($this->_res['tpl'][$tplidx]['images']) && count($this->_res['tpl'][$tplidx]['images']) || + isset($this->_res['tpl'][$tplidx]['tpls']) && count($this->_res['tpl'][$tplidx]['tpls'])) + { + $this->_out('/XObject <<'); + if (isset($this->_res['tpl'][$tplidx]['images']) && count($this->_res['tpl'][$tplidx]['images'])) { + foreach($this->_res['tpl'][$tplidx]['images'] as $image) + $this->_out('/I' . $image['i'] . ' ' . $image['n'] . ' 0 R'); + } + if (isset($this->_res['tpl'][$tplidx]['tpls']) && count($this->_res['tpl'][$tplidx]['tpls'])) { + foreach($this->_res['tpl'][$tplidx]['tpls'] as $i => $tpl) + $this->_out($this->tplprefix . $i . ' ' . $tpl['n'] . ' 0 R'); + } + $this->_out('>>'); + } + $this->_out('>>'); + + $this->_out('/Length ' . strlen($p) . ' >>'); + $this->_putstream($p); + $this->_out('endobj'); + } + } + + /** + * Overwritten to add _putformxobjects() after _putimages() + * + */ + function _putimages() { + parent::_putimages(); + $this->_putformxobjects(); + } + + function _putxobjectdict() { + parent::_putxobjectdict(); + + if (count($this->tpls)) { + foreach($this->tpls as $tplidx => $tpl) { + $this->_out(sprintf('%s%d %d 0 R', $this->tplprefix, $tplidx, $tpl['n'])); + } + } + } + + /** + * Private Method + */ + function _out($s) { + if ($this->state == 2 && $this->_intpl) { + $this->tpls[$this->tpl]['buffer'] .= $s . "\n"; + } else { + parent::_out($s); + } + } +} From 8e29dcdb79866858a9970d3d9bbd33c270ead8bf Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 4 Mar 2015 21:59:03 +0100 Subject: [PATCH 246/287] Some fix after merging bank account number form --- htdocs/compta/bank/card.php | 60 +++++++++++----------- htdocs/compta/bank/class/account.class.php | 28 +++++----- 2 files changed, 44 insertions(+), 44 deletions(-) diff --git a/htdocs/compta/bank/card.php b/htdocs/compta/bank/card.php index 0b4307f8a98..c84e7f47482 100644 --- a/htdocs/compta/bank/card.php +++ b/htdocs/compta/bank/card.php @@ -34,6 +34,7 @@ require_once DOL_DOCUMENT_ROOT . '/compta/bank/class/account.class.php'; require_once DOL_DOCUMENT_ROOT . '/core/class/extrafields.class.php'; $langs->load("banks"); +$langs->load("bills"); $langs->load("categories"); $langs->load("companies"); $langs->load("compta"); @@ -70,7 +71,7 @@ if ($_POST["action"] == 'add') $account->clos = $_POST["clos"]; $account->rappro = (isset($_POST["norappro"]) && $_POST["norappro"])?0:1; $account->url = $_POST["url"]; - + $account->bank = trim($_POST["bank"]); $account->code_banque = trim($_POST["code_banque"]); $account->code_guichet = trim($_POST["code_guichet"]); @@ -94,8 +95,8 @@ if ($_POST["action"] == 'add') $account->state_id = $_POST["account_state_id"]; $account->country_id = $_POST["account_country_id"]; - $account->min_allowed = $_POST["account_min_allowed"]; - $account->min_desired = $_POST["account_min_desired"]; + $account->min_allowed = GETPOST("account_min_allowed",'int'); + $account->min_desired = GETPOST("account_min_desired",'int'); $account->comment = trim($_POST["account_comment"]); if ($conf->global->MAIN_BANK_ACCOUNTANCY_CODE_ALWAYS_REQUIRED && empty($account->account_number)) @@ -169,8 +170,8 @@ if ($_POST["action"] == 'update' && ! $_POST["cancel"]) $account->state_id = $_POST["account_state_id"]; $account->country_id = $_POST["account_country_id"]; - $account->min_allowed = $_POST["account_min_allowed"]; - $account->min_desired = $_POST["account_min_desired"]; + $account->min_allowed = GETPOST("account_min_allowed",'int'); + $account->min_desired = GETPOST("account_min_desired",'int'); $account->comment = trim($_POST["account_comment"]); if ($conf->global->MAIN_BANK_ACCOUNTANCY_CODE_ALWAYS_REQUIRED && empty($account->account_number)) @@ -251,9 +252,6 @@ if ($action == 'create') document.formsoc.action.value="create"; document.formsoc.submit(); }); - })'."\n"; - - print 'jQuery(document).ready(function () { jQuery("#selectaccount_country_id").change(function() { document.formsoc.action.value="create"; document.formsoc.submit(); @@ -275,7 +273,7 @@ if ($action == 'create') // Label print ''.$langs->trans("LabelBankCashAccount").''; - print ''; + print ''; // Type print ''.$langs->trans("AccountType").''; @@ -299,15 +297,17 @@ if ($action == 'create') print $form->selectarray("clos",array(0=>$account->status[0],1=>$account->status[1]),(isset($_POST["clos"])?$_POST["clos"]:$account->clos)); print ''; - // Country - print ''.$langs->trans("BankAccountCountry").''; - print ''; + // Country $selectedcode=''; if (isset($_POST["account_country_id"])) { $selectedcode=$_POST["account_country_id"]?$_POST["account_country_id"]:$account->country_code; } else if (empty($selectedcode)) $selectedcode=$mysoc->country_code; + $account->country_code = getCountry($selectedcode, 2); // Force country code on account to have following field on bank fields matching country rules + + print ''.$langs->trans("BankAccountCountry").''; + print ''; print $form->select_country($selectedcode,'account_country_id'); if ($user->admin) print info_admin($langs->trans("YouCanChangeValuesForThisListFromDictionarySetup"),1); print ''; @@ -333,10 +333,10 @@ if ($action == 'create') print ''; // Editor wysiwyg require_once DOL_DOCUMENT_ROOT.'/core/class/doleditor.class.php'; - $doleditor=new DolEditor('account_comment',$account->comment,'',200,'dolibarr_notes','',false,true,$conf->global->FCKEDITOR_ENABLE_SOCIETE,10,70); + $doleditor=new DolEditor('account_comment',(GETPOST("account_comment")?GETPOST("account_comment"):$account->comment),'',90,'dolibarr_notes','',false,true,$conf->global->FCKEDITOR_ENABLE_SOCIETE,4,70); $doleditor->Create(); print ''; - + // Other attributes $parameters=array('colspan' => 3); $reshook=$hookmanager->executeHooks('formObjectOptions',$parameters,$account,$action); // Note that $action and $object may have been modified by hook @@ -353,7 +353,7 @@ if ($action == 'create') // Sold print ''.$langs->trans("InitialBankBalance").''; - print 'solde)).'">'; + print 'solde)).'">'; print ''.$langs->trans("Date").''; print ''; @@ -445,10 +445,10 @@ if ($action == 'create') if ($account->getCountryCode() == 'IN') $bickey="SWIFT"; // IBAN - print ''.$langs->trans($ibankey).''; + print ''.$langs->trans($ibankey).''; print ''; - print ''.$langs->trans($bickey).''; + print ''.$langs->trans($bickey).''; print ''; print ''.$langs->trans("BankAccountDomiciliation").''; @@ -468,25 +468,25 @@ if ($action == 'create') print ''; print '
'; } - + print ''; // Accountancy code if (! empty($conf->global->MAIN_BANK_ACCOUNTANCY_CODE_ALWAYS_REQUIRED)) { print ''; - print ''; + print ''; } else { print ''; - print ''; + print ''; } // Accountancy journal if (! empty($conf->accounting->enabled)) { print ''; - print ''; + print ''; } print '
'.$langs->trans("AccountancyCode").'
account_number).'">
'.$langs->trans("AccountancyCode").'
account_number).'">
'.$langs->trans("AccountancyJournal").'
accountancy_journal).'">
'; @@ -599,7 +599,7 @@ else print "\n"; print ''.$langs->trans("Comment").''; - print ''.$account->comment.''; + print ''.dol_htmlentitiesbr($account->comment).''; // Other attributes $parameters=array('colspan' => 3); @@ -612,11 +612,11 @@ else print ''; print '
'; - + if ($account->type == 0 || $account->type == 1) { print ''; - + print ''; print ''; @@ -783,7 +783,7 @@ else document.formsoc.submit(); }); })'."\n"; - + print 'jQuery(document).ready(function () { jQuery("#selectaccount_country_id").change(function() { document.formsoc.action.value="edit"; @@ -834,11 +834,13 @@ else // Country $account->country_id=$account->country_id?$account->country_id:$mysoc->country_id; - print ''; - print ''; + print ''; @@ -881,7 +883,7 @@ else print ''; @@ -898,7 +900,7 @@ else if ($_POST["type"] == 0 || $_POST["type"] == 1) { print '
'.$langs->trans("BankName").''.$account->bank.'
'.$langs->trans("Country").''; $selectedcode=$account->country_code; if (isset($_POST["account_country_id"])) $selectedcode=$_POST["account_country_id"]; else if (empty($selectedcode)) $selectedcode=$mysoc->country_code; + $account->country_code = getCountry($selectedcode, 2); // Force country code on account to have following field on bank fields matching country rules + + print '
'.$langs->trans("Country").''; print $form->select_country($selectedcode,'account_country_id'); if ($user->admin) print info_admin($langs->trans("YouCanChangeValuesForThisListFromDictionarySetup"),1); print '
'; // Editor wysiwyg require_once DOL_DOCUMENT_ROOT.'/core/class/doleditor.class.php'; - $doleditor=new DolEditor('account_comment',(isset($_POST["account_comment"])?$_POST["account_comment"]:$account->comment),'',200,'dolibarr_notes','',false,true,$conf->global->FCKEDITOR_ENABLE_SOCIETE,10,70); + $doleditor=new DolEditor('account_comment',(GETPOST("account_comment")?GETPOST("account_comment"):$account->comment),'',90,'dolibarr_notes','',false,true,$conf->global->FCKEDITOR_ENABLE_SOCIETE,4,70); $doleditor->Create(); print '
'; - + // If bank account print ''; print ''; diff --git a/htdocs/compta/bank/class/account.class.php b/htdocs/compta/bank/class/account.class.php index 98ef24e177d..cfbda320fb7 100644 --- a/htdocs/compta/bank/class/account.class.php +++ b/htdocs/compta/bank/class/account.class.php @@ -468,7 +468,7 @@ class Account extends CommonObject $this->error=$this->db->lasterror(); return -3; } - + // Actions on extra fields (by external module or standard code) $hookmanager->initHooks(array('bankdao')); $parameters=array('id'=>$this->id); @@ -513,8 +513,6 @@ class Account extends CommonObject global $langs,$conf, $hookmanager; // Clean parameters - if (! $this->min_allowed) $this->min_allowed=0; - if (! $this->min_desired) $this->min_desired=0; $this->state_id = ($this->state_id?$this->state_id:$this->state_id); $this->country_id = ($this->country_id?$this->country_id:$this->country_id); @@ -544,7 +542,7 @@ class Account extends CommonObject $sql.= ",url = ".($this->url?"'".$this->url."'":"null"); $sql.= ",account_number = '".$this->account_number."'"; $sql.= ",accountancy_journal = '".$this->accountancy_journal."'"; - + $sql.= ",bank = '".$this->db->escape($this->bank)."'"; $sql.= ",code_banque='".$this->code_banque."'"; $sql.= ",code_guichet='".$this->code_guichet."'"; @@ -558,8 +556,8 @@ class Account extends CommonObject $sql.= ",currency_code = '".$this->currency_code."'"; - $sql.= ",min_allowed = '".price2num($this->min_allowed)."'"; - $sql.= ",min_desired = '".price2num($this->min_desired)."'"; + $sql.= ",min_allowed = ".($this->min_allowed != '' ? price2num($this->min_allowed) : "null"); + $sql.= ",min_desired = ".($this->min_desired != '' ? price2num($this->min_desired) : "null"); $sql.= ",comment = '".$this->db->escape($this->comment)."'"; $sql.= ",state_id = ".($this->state_id>0?"'".$this->state_id."'":"null"); @@ -572,7 +570,7 @@ class Account extends CommonObject $result = $this->db->query($sql); if ($result) { - + // Actions on extra fields (by external module or standard code) $hookmanager->initHooks(array('bankdao')); $parameters=array('id'=>$this->id); @@ -589,8 +587,8 @@ class Account extends CommonObject } } else if ($reshook < 0) return -1; - - + + return 1; } else @@ -736,15 +734,15 @@ class Account extends CommonObject $this->min_allowed = $obj->min_allowed; $this->min_desired = $obj->min_desired; $this->comment = $obj->comment; - + // Retreive all extrafield for thirdparty // fetch optionals attributes and labels require_once(DOL_DOCUMENT_ROOT.'/core/class/extrafields.class.php'); $extrafields=new ExtraFields($this->db); $extralabels=$extrafields->fetch_name_optionals_label($this->table_element,true); $this->fetch_optionals($this->id,$extralabels); - - + + return 1; } else @@ -776,7 +774,7 @@ class Account extends CommonObject dol_syslog(get_class($this)."::delete", LOG_DEBUG); $result = $this->db->query($sql); if ($result) { - + // Remove extrafields if ((empty($conf->global->MAIN_EXTRAFIELDS_DISABLED))) // For avoid conflicts if trigger used { @@ -787,7 +785,7 @@ class Account extends CommonObject dol_syslog(get_class($this)."::delete error -4 ".$this->error, LOG_ERR); } } - + return 1; } else { @@ -1076,7 +1074,7 @@ class Account extends CommonObject * * @return int 0=No bank code need + Account number is enough * 1=Need 2 fields for bank code: Bank, Desk (France, Spain, ...) + Account number and key - * 2=Neek 1 field for bank code: Bank only (Sort code for Great Britain, BSB for Australia) + Account number + * 2=Need 1 field for bank code: Bank only (Sort code for Great Britain, BSB for Australia) + Account number */ function useDetailedBBAN() { From 5c36db06f60483772b7568b0c0182225d7728dce Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 4 Mar 2015 23:04:37 +0100 Subject: [PATCH 247/287] Add missing files --- htdocs/install/mysql/data/llx_c_incoterms.sql | 41 +++++++++++++++++++ .../mysql/tables/llx_c_incoterms.key.sql | 19 +++++++++ .../install/mysql/tables/llx_c_incoterms.sql | 25 +++++++++++ 3 files changed, 85 insertions(+) create mode 100644 htdocs/install/mysql/data/llx_c_incoterms.sql create mode 100644 htdocs/install/mysql/tables/llx_c_incoterms.key.sql create mode 100644 htdocs/install/mysql/tables/llx_c_incoterms.sql diff --git a/htdocs/install/mysql/data/llx_c_incoterms.sql b/htdocs/install/mysql/data/llx_c_incoterms.sql new file mode 100644 index 00000000000..ad9b09f09fc --- /dev/null +++ b/htdocs/install/mysql/data/llx_c_incoterms.sql @@ -0,0 +1,41 @@ +-- Copyright (C) 2001-2004 Rodolphe Quiedeville +-- Copyright (C) 2003 Jean-Louis Bergamo +-- Copyright (C) 2004-2009 Laurent Destailleur +-- Copyright (C) 2004 Benoit Mortier +-- Copyright (C) 2004 Guillaume Delecourt +-- Copyright (C) 2005-2009 Regis Houssin +-- Copyright (C) 2007 Patrick Raguin +-- +-- 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 3 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, see . +-- +-- + +-- +-- Ne pas placer de commentaire en fin de ligne, ce fichier est parsé lors +-- de l'install et tous les sigles '--' sont supprimés. +-- + + +INSERT INTO llx_c_incoterms (code, libelle, active) VALUES ('EXW', 'Ex Works, au départ non chargé, non dédouané sortie d''usine (uniquement adapté aux flux domestiques, nationaux)', 1); +INSERT INTO llx_c_incoterms (code, libelle, active) VALUES ('FCA', 'Free Carrier, marchandises dédouanées et chargées dans le pays de départ, chez le vendeur ou chez le commissionnaire de transport de l''acheteur', 1); +INSERT INTO llx_c_incoterms (code, libelle, active) VALUES ('FAS', 'Free Alongside Ship, sur le quai du port de départ', 1); +INSERT INTO llx_c_incoterms (code, libelle, active) VALUES ('FOB', 'Free On Board, chargé sur le bateau, les frais de chargement dans celui-ci étant fonction du liner term indiqué par la compagnie maritime (à la charge du vendeur)', 1); +INSERT INTO llx_c_incoterms (code, libelle, active) VALUES ('CFR', 'Cost and Freight, chargé dans le bateau, livraison au port de départ, frais payés jusqu''au port d''arrivée, sans assurance pour le transport, non déchargé du navire à destination (les frais de déchargement sont inclus ou non au port d''arrivée)', 1); +INSERT INTO llx_c_incoterms (code, libelle, active) VALUES ('CIF', 'Cost, Insurance and Freight, chargé sur le bateau, frais jusqu''au port d''arrivée, avec l''assurance marchandise transportée souscrite par le vendeur pour le compte de l''acheteur', 1); +INSERT INTO llx_c_incoterms (code, libelle, active) VALUES ('CPT', 'Carriage Paid To, livraison au premier transporteur, frais jusqu''au déchargement du mode de transport, sans assurance pour le transport', 1); +INSERT INTO llx_c_incoterms (code, libelle, active) VALUES ('CIP', 'Carriage and Insurance Paid to, idem CPT, avec assurance marchandise transportée souscrite par le vendeur pour le compte de l''acheteur', 1); +INSERT INTO llx_c_incoterms (code, libelle, active) VALUES ('DAT', 'Delivered At Terminal, marchandises (déchargées) livrées sur quai, dans un terminal maritime, fluvial, aérien, routier ou ferroviaire désigné (dédouanement import, et post-acheminement payés par l''acheteur)', 1); +INSERT INTO llx_c_incoterms (code, libelle, active) VALUES ('DAP', 'Delivered At Place, marchandises (non déchargées) mises à disposition de l''acheteur dans le pays d''importation au lieu précisé dans le contrat (déchargement, dédouanement import payé par l''acheteur)', 1); +INSERT INTO llx_c_incoterms (code, libelle, active) VALUES ('DDP', 'Delivered Duty Paid, marchandises (non déchargées) livrées à destination finale, dédouanement import et taxes à la charge du vendeur ; l''acheteur prend en charge uniquement le déchargement (si exclusion des taxes type TVA, le préciser clairement)', 1); + diff --git a/htdocs/install/mysql/tables/llx_c_incoterms.key.sql b/htdocs/install/mysql/tables/llx_c_incoterms.key.sql new file mode 100644 index 00000000000..65614a90c4d --- /dev/null +++ b/htdocs/install/mysql/tables/llx_c_incoterms.key.sql @@ -0,0 +1,19 @@ +-- ======================================================================== +-- Copyright (C) 2009 Laurent Destailleur +-- +-- 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 3 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, see . +-- +-- ======================================================================== + +ALTER TABLE llx_c_incoterms ADD UNIQUE INDEX uk_c_incoterms (code); diff --git a/htdocs/install/mysql/tables/llx_c_incoterms.sql b/htdocs/install/mysql/tables/llx_c_incoterms.sql new file mode 100644 index 00000000000..c960f0fab2f --- /dev/null +++ b/htdocs/install/mysql/tables/llx_c_incoterms.sql @@ -0,0 +1,25 @@ +-- ======================================================================== +-- Copyright (C) 2015 Laurent Destailleur +-- +-- 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 3 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, see . +-- +-- ======================================================================== + +CREATE TABLE llx_c_incoterms ( + rowid integer AUTO_INCREMENT PRIMARY KEY, + code varchar(3) NOT NULL, + libelle varchar(255) NOT NULL, + active tinyint DEFAULT 1 NOT NULL +) ENGINE=innodb; + From 703a6c1b5489546469643abb5ce022c78651db11 Mon Sep 17 00:00:00 2001 From: BENKE Charles Date: Thu, 5 Mar 2015 00:38:54 +0100 Subject: [PATCH 248/287] Update modFacture.class.php add fk_bank on bill export, this fields is needed to link with external accounting --- htdocs/core/modules/modFacture.class.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/htdocs/core/modules/modFacture.class.php b/htdocs/core/modules/modFacture.class.php index 86762fbb87c..7b070ae6340 100644 --- a/htdocs/core/modules/modFacture.class.php +++ b/htdocs/core/modules/modFacture.class.php @@ -235,10 +235,10 @@ class modFacture extends DolibarrModules $this->export_label[$r]='CustomersInvoicesAndPayments'; // Translation key (used only if key ExportDataset_xxx_z not found) $this->export_icon[$r]='bill'; $this->export_permission[$r]=array(array("facture","facture","export")); - $this->export_fields_array[$r]=array('s.rowid'=>"IdCompany",'s.nom'=>'CompanyName','s.address'=>'Address','s.zip'=>'Zip','s.town'=>'Town','c.code'=>'CountryCode','s.phone'=>'Phone','s.siren'=>'ProfId1','s.siret'=>'ProfId2','s.ape'=>'ProfId3','s.idprof4'=>'ProfId4','s.code_compta'=>'CustomerAccountancyCode','s.code_compta_fournisseur'=>'SupplierAccountancyCode','s.tva_intra'=>'VATIntra','f.rowid'=>"InvoiceId",'f.facnumber'=>"InvoiceRef",'f.datec'=>"InvoiceDateCreation",'f.datef'=>"DateInvoice",'f.date_lim_reglement'=>"DateDue",'f.total'=>"TotalHT",'f.total_ttc'=>"TotalTTC",'f.tva'=>"TotalVAT",'f.paye'=>"InvoicePaid",'f.fk_statut'=>'InvoiceStatus','f.note_private'=>"NotePrivate",'f.note_public'=>"NotePublic",'f.fk_user_author'=>'CreatedById','uc.login'=>'CreatedByLogin','f.fk_user_valid'=>'ValidatedById','uv.login'=>'ValidatedByLogin','p.rowid'=>'PaymentId','pf.amount'=>'AmountPayment','p.datep'=>'DatePayment','p.num_paiement'=>'PaymentNumber'); - //$this->export_TypeFields_array[$r]=array('s.rowid'=>"List:societe:nom",'s.nom'=>'Text','s.address'=>'Text','s.zip'=>'Text','s.town'=>'Text','c.code'=>'Text','s.phone'=>'Text','s.siren'=>'Text','s.siret'=>'Text','s.ape'=>'Text','s.idprof4'=>'Text','s.code_compta'=>'Text','s.code_compta_fournisseur'=>'Text','s.tva_intra'=>'Text','f.rowid'=>"List:facture:facnumber",'f.facnumber'=>"Text",'f.datec'=>"Date",'f.datef'=>"Date",'f.date_lim_reglement'=>"Date",'f.total'=>"Number",'f.total_ttc'=>"Number",'f.tva'=>"Number",'f.paye'=>"Boolean",'f.fk_statut'=>'Status','f.note_private'=>"Text",'f.note_public'=>"Text",'pf.amount'=>'Number','p.datep'=>'Date','p.num_paiement'=>'Number'); - $this->export_TypeFields_array[$r]=array('s.nom'=>'Text','s.address'=>'Text','s.zip'=>'Text','s.town'=>'Text','c.code'=>'Text','s.phone'=>'Text','s.siren'=>'Text','s.siret'=>'Text','s.ape'=>'Text','s.idprof4'=>'Text','s.code_compta'=>'Text','s.code_compta_fournisseur'=>'Text','s.tva_intra'=>'Text','f.rowid'=>"List:facture:facnumber",'f.facnumber'=>"Text",'f.datec'=>"Date",'f.datef'=>"Date",'f.date_lim_reglement'=>"Date",'f.total'=>"Number",'f.total_ttc'=>"Number",'f.tva'=>"Number",'f.paye'=>"Boolean",'f.fk_statut'=>'Status','f.note_private'=>"Text",'f.note_public'=>"Text",'pf.amount'=>'Number','p.datep'=>'Date','p.num_paiement'=>'Number'); - $this->export_entities_array[$r]=array('s.rowid'=>"company",'s.nom'=>'company','s.address'=>'company','s.zip'=>'company','s.town'=>'company','c.code'=>'company','s.phone'=>'company','s.siren'=>'company','s.siret'=>'company','s.ape'=>'company','s.idprof4'=>'company','s.code_compta'=>'company','s.code_compta_fournisseur'=>'company','s.tva_intra'=>'company','f.rowid'=>"invoice",'f.facnumber'=>"invoice",'f.datec'=>"invoice",'f.datef'=>"invoice",'f.date_lim_reglement'=>"invoice",'f.total'=>"invoice",'f.total_ttc'=>"invoice",'f.tva'=>"invoice",'f.paye'=>"invoice",'f.fk_statut'=>'invoice','f.note_private'=>"invoice",'f.note_public'=>"invoice",'p.rowid'=>'payment','pf.amount'=>'payment','p.datep'=>'payment','p.num_paiement'=>'payment','f.fk_user_author'=>'user','uc.login'=>'user','f.fk_user_valid'=>'user','uv.login'=>'user'); + $this->export_fields_array[$r]=array('s.rowid'=>"IdCompany",'s.nom'=>'CompanyName','s.address'=>'Address','s.zip'=>'Zip','s.town'=>'Town','c.code'=>'CountryCode','s.phone'=>'Phone','s.siren'=>'ProfId1','s.siret'=>'ProfId2','s.ape'=>'ProfId3','s.idprof4'=>'ProfId4','s.code_compta'=>'CustomerAccountancyCode','s.code_compta_fournisseur'=>'SupplierAccountancyCode','s.tva_intra'=>'VATIntra','f.rowid'=>"InvoiceId",'f.facnumber'=>"InvoiceRef",'f.datec'=>"InvoiceDateCreation",'f.datef'=>"DateInvoice",'f.date_lim_reglement'=>"DateDue",'f.total'=>"TotalHT",'f.total_ttc'=>"TotalTTC",'f.tva'=>"TotalVAT",'f.paye'=>"InvoicePaid",'f.fk_statut'=>'InvoiceStatus','f.note_private'=>"NotePrivate",'f.note_public'=>"NotePublic",'f.fk_user_author'=>'CreatedById','uc.login'=>'CreatedByLogin','f.fk_user_valid'=>'ValidatedById','uv.login'=>'ValidatedByLogin','p.rowid'=>'PaymentId','pf.amount'=>'AmountPayment','p.datep'=>'DatePayment','p.num_paiement'=>'PaymentNumber','p.fk_bank'=>'IdTransaction'); + //$this->export_TypeFields_array[$r]=array('s.rowid'=>"List:societe:nom",'s.nom'=>'Text','s.address'=>'Text','s.zip'=>'Text','s.town'=>'Text','c.code'=>'Text','s.phone'=>'Text','s.siren'=>'Text','s.siret'=>'Text','s.ape'=>'Text','s.idprof4'=>'Text','s.code_compta'=>'Text','s.code_compta_fournisseur'=>'Text','s.tva_intra'=>'Text','f.rowid'=>"List:facture:facnumber",'f.facnumber'=>"Text",'f.datec'=>"Date",'f.datef'=>"Date",'f.date_lim_reglement'=>"Date",'f.total'=>"Number",'f.total_ttc'=>"Number",'f.tva'=>"Number",'f.paye'=>"Boolean",'f.fk_statut'=>'Status','f.note_private'=>"Text",'f.note_public'=>"Text",'pf.amount'=>'Number','p.datep'=>'Date','p.num_paiement'=>'Number','p.fk_bank'=>'Number'); + $this->export_TypeFields_array[$r]=array('s.nom'=>'Text','s.address'=>'Text','s.zip'=>'Text','s.town'=>'Text','c.code'=>'Text','s.phone'=>'Text','s.siren'=>'Text','s.siret'=>'Text','s.ape'=>'Text','s.idprof4'=>'Text','s.code_compta'=>'Text','s.code_compta_fournisseur'=>'Text','s.tva_intra'=>'Text','f.rowid'=>"List:facture:facnumber",'f.facnumber'=>"Text",'f.datec'=>"Date",'f.datef'=>"Date",'f.date_lim_reglement'=>"Date",'f.total'=>"Number",'f.total_ttc'=>"Number",'f.tva'=>"Number",'f.paye'=>"Boolean",'f.fk_statut'=>'Status','f.note_private'=>"Text",'f.note_public'=>"Text",'pf.amount'=>'Number','p.datep'=>'Date','p.num_paiement'=>'Number','p.fk_bank'=>'Number'); + $this->export_entities_array[$r]=array('s.rowid'=>"company",'s.nom'=>'company','s.address'=>'company','s.zip'=>'company','s.town'=>'company','c.code'=>'company','s.phone'=>'company','s.siren'=>'company','s.siret'=>'company','s.ape'=>'company','s.idprof4'=>'company','s.code_compta'=>'company','s.code_compta_fournisseur'=>'company','s.tva_intra'=>'company','f.rowid'=>"invoice",'f.facnumber'=>"invoice",'f.datec'=>"invoice",'f.datef'=>"invoice",'f.date_lim_reglement'=>"invoice",'f.total'=>"invoice",'f.total_ttc'=>"invoice",'f.tva'=>"invoice",'f.paye'=>"invoice",'f.fk_statut'=>'invoice','f.note_private'=>"invoice",'f.note_public'=>"invoice",'p.rowid'=>'payment','pf.amount'=>'payment','p.datep'=>'payment','p.num_paiement'=>'payment','p.fk_bank'=>'payment','f.fk_user_author'=>'user','uc.login'=>'user','f.fk_user_valid'=>'user','uv.login'=>'user'); $this->export_dependencies_array[$r]=array('payment'=>'p.rowid'); // To add unique key if we ask a field of a child to avoid the DISTINCT to discard them // Add extra fields $sql="SELECT name, label, type, param FROM ".MAIN_DB_PREFIX."extrafields WHERE elementtype = 'facture'"; From 39a7271f910b8de71003b8eee910069fd06f012d Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 5 Mar 2015 10:57:17 +0100 Subject: [PATCH 249/287] Fix bad merge --- htdocs/includes/tcpdi/fpdf_tpl.php | 271 ++--------------------------- 1 file changed, 10 insertions(+), 261 deletions(-) diff --git a/htdocs/includes/tcpdi/fpdf_tpl.php b/htdocs/includes/tcpdi/fpdf_tpl.php index 0c60a6ed6f3..be03a39b5d3 100644 --- a/htdocs/includes/tcpdi/fpdf_tpl.php +++ b/htdocs/includes/tcpdi/fpdf_tpl.php @@ -29,21 +29,13 @@ class FPDF_TPL extends FPDF { * @var int */ var $tpl = 0; -<<<<<<< HEAD - -======= ->>>>>>> 4af26c119faa512590faad44e296b64b6c9e1978 /** * "In Template"-Flag * @var boolean */ var $_intpl = false; -<<<<<<< HEAD - -======= ->>>>>>> 4af26c119faa512590faad44e296b64b6c9e1978 /** * Nameprefix of Templates used in Resources-Dictonary * @var string A String defining the Prefix used as Template-Object-Names. Have to beginn with an / @@ -55,22 +47,14 @@ class FPDF_TPL extends FPDF { * @var array */ var $_res = array(); -<<<<<<< HEAD - -======= ->>>>>>> 4af26c119faa512590faad44e296b64b6c9e1978 /** * Last used Template data * * @var array */ var $lastUsedTemplateData = array(); -<<<<<<< HEAD - -======= ->>>>>>> 4af26c119faa512590faad44e296b64b6c9e1978 /** * Start a Template * @@ -90,19 +74,11 @@ class FPDF_TPL extends FPDF { * @return int The ID of new created Template */ function beginTemplate($x = null, $y = null, $w = null, $h = null) { -<<<<<<< HEAD if (is_subclass_of($this, 'TCPDF')) { $this->Error('This method is only usable with FPDF. Use TCPDF methods startTemplate() instead.'); return; } - -======= - if (is_subclass_of($this, 'TCPDF')) { - $this->Error('This method is only usable with FPDF. Use TCPDF methods startTemplate() instead.'); - return; - } ->>>>>>> 4af26c119faa512590faad44e296b64b6c9e1978 if ($this->page <= 0) $this->error("You have to add a page to fpdf first!"); @@ -140,11 +116,7 @@ class FPDF_TPL extends FPDF { ); $this->SetAutoPageBreak(false); -<<<<<<< HEAD - -======= ->>>>>>> 4af26c119faa512590faad44e296b64b6c9e1978 // Define own high and width to calculate possitions correct $this->h = $h; $this->w = $w; @@ -155,25 +127,14 @@ class FPDF_TPL extends FPDF { if ($this->CurrentFont) { $fontkey = $this->FontFamily . $this->FontStyle; -<<<<<<< HEAD $this->_res['tpl'][$this->tpl]['fonts'][$fontkey] =& $this->fonts[$fontkey]; - + $this->_out(sprintf('BT /F%d %.2f Tf ET', $this->CurrentFont['i'], $this->FontSizePt)); } - - return $this->tpl; - } - -======= - $this->_res['tpl'][$this->tpl]['fonts'][$fontkey] =& $this->fonts[$fontkey]; - - $this->_out(sprintf('BT /F%d %.2f Tf ET', $this->CurrentFont['i'], $this->FontSizePt)); - } return $this->tpl; } ->>>>>>> 4af26c119faa512590faad44e296b64b6c9e1978 /** * End Template * @@ -182,23 +143,13 @@ class FPDF_TPL extends FPDF { * @return mixed If a template is opened, the ID is returned. If not a false is returned. */ function endTemplate() { -<<<<<<< HEAD if (is_subclass_of($this, 'TCPDF')) { $args = func_get_args(); return call_user_func_array(array($this, 'TCPDF::endTemplate'), $args); } - - if ($this->_intpl) { - $this->_intpl = false; -======= - if (is_subclass_of($this, 'TCPDF')) { - $args = func_get_args(); - return call_user_func_array(array($this, 'TCPDF::endTemplate'), $args); - } if ($this->_intpl) { $this->_intpl = false; ->>>>>>> 4af26c119faa512590faad44e296b64b6c9e1978 $tpl =& $this->tpls[$this->tpl]; $this->SetXY($tpl['o_x'], $tpl['o_y']); $this->tMargin = $tpl['o_tMargin']; @@ -207,39 +158,22 @@ class FPDF_TPL extends FPDF { $this->h = $tpl['o_h']; $this->w = $tpl['o_w']; $this->SetAutoPageBreak($tpl['o_AutoPageBreak'], $tpl['o_bMargin']); -<<<<<<< HEAD - + $this->FontFamily = $tpl['o_FontFamily']; $this->FontStyle = $tpl['o_FontStyle']; $this->FontSizePt = $tpl['o_FontSizePt']; $this->FontSize = $tpl['o_FontSize']; - + $fontkey = $this->FontFamily . $this->FontStyle; if ($fontkey) $this->CurrentFont =& $this->fonts[$fontkey]; - -======= - $this->FontFamily = $tpl['o_FontFamily']; - $this->FontStyle = $tpl['o_FontStyle']; - $this->FontSizePt = $tpl['o_FontSizePt']; - $this->FontSize = $tpl['o_FontSize']; - - $fontkey = $this->FontFamily . $this->FontStyle; - if ($fontkey) - $this->CurrentFont =& $this->fonts[$fontkey]; - ->>>>>>> 4af26c119faa512590faad44e296b64b6c9e1978 return $this->tpl; } else { return false; } } -<<<<<<< HEAD - -======= ->>>>>>> 4af26c119faa512590faad44e296b64b6c9e1978 /** * Use a Template in current Page or other Template * @@ -259,22 +193,7 @@ class FPDF_TPL extends FPDF { */ function useTemplate($tplidx, $_x = null, $_y = null, $_w = 0, $_h = 0) { if ($this->page <= 0) -<<<<<<< HEAD $this->error('You have to add a page first!'); - - if (!isset($this->tpls[$tplidx])) - $this->error('Template does not exist!'); - - if ($this->_intpl) { - $this->_res['tpl'][$this->tpl]['tpls'][$tplidx] =& $this->tpls[$tplidx]; - } - - $tpl =& $this->tpls[$tplidx]; - $w = $tpl['w']; - $h = $tpl['h']; - -======= - $this->error('You have to add a page first!'); if (!isset($this->tpls[$tplidx])) $this->error('Template does not exist!'); @@ -287,21 +206,10 @@ class FPDF_TPL extends FPDF { $w = $tpl['w']; $h = $tpl['h']; ->>>>>>> 4af26c119faa512590faad44e296b64b6c9e1978 if ($_x == null) $_x = 0; if ($_y == null) $_y = 0; -<<<<<<< HEAD - - $_x += $tpl['x']; - $_y += $tpl['y']; - - $wh = $this->getTemplateSize($tplidx, $_w, $_h); - $_w = $wh['w']; - $_h = $wh['h']; - -======= $_x += $tpl['x']; $_y += $tpl['y']; @@ -310,7 +218,6 @@ class FPDF_TPL extends FPDF { $_w = $wh['w']; $_h = $wh['h']; ->>>>>>> 4af26c119faa512590faad44e296b64b6c9e1978 $tData = array( 'x' => $this->x, 'y' => $this->y, @@ -322,17 +229,6 @@ class FPDF_TPL extends FPDF { 'ty' => ($this->h - $_y - $_h), 'lty' => ($this->h - $_y - $_h) - ($this->h - $h) * ($_h / $h) ); -<<<<<<< HEAD - - $this->_out(sprintf('q %.4F 0 0 %.4F %.4F %.4F cm', $tData['scaleX'], $tData['scaleY'], $tData['tx'] * $this->k, $tData['ty'] * $this->k)); // Translate - $this->_out(sprintf('%s%d Do Q', $this->tplprefix, $tplidx)); - - $this->lastUsedTemplateData = $tData; - - return array('w' => $_w, 'h' => $_h); - } - -======= $this->_out(sprintf('q %.4F 0 0 %.4F %.4F %.4F cm', $tData['scaleX'], $tData['scaleY'], $tData['tx'] * $this->k, $tData['ty'] * $this->k)); // Translate $this->_out(sprintf('%s%d Do Q', $this->tplprefix, $tplidx)); @@ -342,7 +238,6 @@ class FPDF_TPL extends FPDF { return array('w' => $_w, 'h' => $_h); } ->>>>>>> 4af26c119faa512590faad44e296b64b6c9e1978 /** * Get The calculated Size of a Template * @@ -360,75 +255,44 @@ class FPDF_TPL extends FPDF { $tpl =& $this->tpls[$tplidx]; $w = $tpl['w']; $h = $tpl['h']; -<<<<<<< HEAD - -======= ->>>>>>> 4af26c119faa512590faad44e296b64b6c9e1978 if ($_w == 0 and $_h == 0) { $_w = $w; $_h = $h; } -<<<<<<< HEAD if($_w == 0) $_w = $_h * $w / $h; if($_h == 0) $_h = $_w * $h / $w; - - return array("w" => $_w, "h" => $_h); - } - -======= - if($_w == 0) - $_w = $_h * $w / $h; - if($_h == 0) - $_h = $_w * $h / $w; return array("w" => $_w, "h" => $_h); } ->>>>>>> 4af26c119faa512590faad44e296b64b6c9e1978 /** * See FPDF/TCPDF-Documentation ;-) */ public function SetFont($family, $style = '', $size = 0) { if (is_subclass_of($this, 'TCPDF')) { -<<<<<<< HEAD $args = func_get_args(); return call_user_func_array(array($this, 'TCPDF::SetFont'), $args); } - - parent::SetFont($family, $style, $size); - - $fontkey = $this->FontFamily . $this->FontStyle; - -======= - $args = func_get_args(); - return call_user_func_array(array($this, 'TCPDF::SetFont'), $args); - } parent::SetFont($family, $style, $size); $fontkey = $this->FontFamily . $this->FontStyle; ->>>>>>> 4af26c119faa512590faad44e296b64b6c9e1978 if ($this->_intpl) { $this->_res['tpl'][$this->tpl]['fonts'][$fontkey] =& $this->fonts[$fontkey]; } else { $this->_res['page'][$this->page]['fonts'][$fontkey] =& $this->fonts[$fontkey]; } } -<<<<<<< HEAD - -======= ->>>>>>> 4af26c119faa512590faad44e296b64b6c9e1978 /** * See FPDF/TCPDF-Documentation ;-) */ function Image( -<<<<<<< HEAD $file, $x = '', $y = '', $w = 0, $h = 0, $type = '', $link = '', $align = '', $resize = false, $dpi = 300, $palign = '', $ismask = false, $imgmask = false, $border = 0, $fitbox = false, $hidden = false, $fitonpage = false, $alt = false, $altimgs = array() @@ -437,60 +301,31 @@ class FPDF_TPL extends FPDF { $args = func_get_args(); return call_user_func_array(array($this, 'TCPDF::Image'), $args); } - -======= - $file, $x = '', $y = '', $w = 0, $h = 0, $type = '', $link = '', $align = '', $resize = false, - $dpi = 300, $palign = '', $ismask = false, $imgmask = false, $border = 0, $fitbox = false, - $hidden = false, $fitonpage = false, $alt = false, $altimgs = array() - ) { - if (is_subclass_of($this, 'TCPDF')) { - $args = func_get_args(); - return call_user_func_array(array($this, 'TCPDF::Image'), $args); - } ->>>>>>> 4af26c119faa512590faad44e296b64b6c9e1978 $ret = parent::Image($file, $x, $y, $w, $h, $type, $link); if ($this->_intpl) { $this->_res['tpl'][$this->tpl]['images'][$file] =& $this->images[$file]; } else { $this->_res['page'][$this->page]['images'][$file] =& $this->images[$file]; } -<<<<<<< HEAD - - return $ret; - } - -======= return $ret; } ->>>>>>> 4af26c119faa512590faad44e296b64b6c9e1978 /** * See FPDF-Documentation ;-) * * AddPage is not available when you're "in" a template. */ function AddPage($orientation = '', $format = '', $keepmargins = false, $tocpage = false) { -<<<<<<< HEAD if (is_subclass_of($this, 'TCPDF')) { $args = func_get_args(); return call_user_func_array(array($this, 'TCPDF::AddPage'), $args); } - - if ($this->_intpl) - $this->Error('Adding pages in templates isn\'t possible!'); - -======= - if (is_subclass_of($this, 'TCPDF')) { - $args = func_get_args(); - return call_user_func_array(array($this, 'TCPDF::AddPage'), $args); - } if ($this->_intpl) $this->Error('Adding pages in templates isn\'t possible!'); ->>>>>>> 4af26c119faa512590faad44e296b64b6c9e1978 parent::AddPage($orientation, $format); } @@ -499,77 +334,43 @@ class FPDF_TPL extends FPDF { */ function Link($x, $y, $w, $h, $link, $spaces = 0) { if (is_subclass_of($this, 'TCPDF')) { -<<<<<<< HEAD $args = func_get_args(); return call_user_func_array(array($this, 'TCPDF::Link'), $args); } - + if ($this->_intpl) $this->Error('Using links in templates aren\'t possible!'); - + parent::Link($x, $y, $w, $h, $link); } - + function AddLink() { if (is_subclass_of($this, 'TCPDF')) { $args = func_get_args(); return call_user_func_array(array($this, 'TCPDF::AddLink'), $args); } - -======= - $args = func_get_args(); - return call_user_func_array(array($this, 'TCPDF::Link'), $args); - } - if ($this->_intpl) - $this->Error('Using links in templates aren\'t possible!'); - - parent::Link($x, $y, $w, $h, $link); - } - - function AddLink() { - if (is_subclass_of($this, 'TCPDF')) { - $args = func_get_args(); - return call_user_func_array(array($this, 'TCPDF::AddLink'), $args); - } - ->>>>>>> 4af26c119faa512590faad44e296b64b6c9e1978 if ($this->_intpl) $this->Error('Adding links in templates aren\'t possible!'); return parent::AddLink(); } -<<<<<<< HEAD - + function SetLink($link, $y = 0, $page = -1) { if (is_subclass_of($this, 'TCPDF')) { $args = func_get_args(); return call_user_func_array(array($this, 'TCPDF::SetLink'), $args); } - -======= - function SetLink($link, $y = 0, $page = -1) { - if (is_subclass_of($this, 'TCPDF')) { - $args = func_get_args(); - return call_user_func_array(array($this, 'TCPDF::SetLink'), $args); - } - ->>>>>>> 4af26c119faa512590faad44e296b64b6c9e1978 if ($this->_intpl) $this->Error('Setting links in templates aren\'t possible!'); parent::SetLink($link, $y, $page); } -<<<<<<< HEAD - -======= ->>>>>>> 4af26c119faa512590faad44e296b64b6c9e1978 /** * Private Method that writes the form xobjects */ function _putformxobjects() { $filter=($this->compress) ? '/Filter /FlateDecode ' : ''; -<<<<<<< HEAD reset($this->tpls); foreach($this->tpls AS $tplidx => $tpl) { @@ -577,15 +378,6 @@ class FPDF_TPL extends FPDF { $this->_newobj(); $this->tpls[$tplidx]['n'] = $this->n; $this->_out('<<'.$filter.'/Type /XObject'); -======= - reset($this->tpls); - foreach($this->tpls AS $tplidx => $tpl) { - - $p=($this->compress) ? gzcompress($tpl['buffer']) : $tpl['buffer']; - $this->_newobj(); - $this->tpls[$tplidx]['n'] = $this->n; - $this->_out('<<'.$filter.'/Type /XObject'); ->>>>>>> 4af26c119faa512590faad44e296b64b6c9e1978 $this->_out('/Subtype /Form'); $this->_out('/FormType 1'); $this->_out(sprintf('/BBox [%.2F %.2F %.2F %.2F]', @@ -598,18 +390,13 @@ class FPDF_TPL extends FPDF { // ury ($tpl['h'] - $tpl['y']) * $this->k )); -<<<<<<< HEAD - -======= ->>>>>>> 4af26c119faa512590faad44e296b64b6c9e1978 if ($tpl['x'] != 0 || $tpl['y'] != 0) { $this->_out(sprintf('/Matrix [1 0 0 1 %.5F %.5F]', -$tpl['x'] * $this->k * 2, $tpl['y'] * $this->k * 2 )); } -<<<<<<< HEAD - + $this->_out('/Resources '); $this->_out('<_out('/F' . $font['i'] . ' ' . $font['n'] . ' 0 R'); $this->_out('>>'); } - if(isset($this->_res['tpl'][$tplidx]['images']) && count($this->_res['tpl'][$tplidx]['images']) || + if(isset($this->_res['tpl'][$tplidx]['images']) && count($this->_res['tpl'][$tplidx]['images']) || isset($this->_res['tpl'][$tplidx]['tpls']) && count($this->_res['tpl'][$tplidx]['tpls'])) { $this->_out('/XObject <<'); if (isset($this->_res['tpl'][$tplidx]['images']) && count($this->_res['tpl'][$tplidx]['images'])) { foreach($this->_res['tpl'][$tplidx]['images'] as $image) $this->_out('/I' . $image['i'] . ' ' . $image['n'] . ' 0 R'); -======= - - $this->_out('/Resources '); - - $this->_out('<_res['tpl'][$tplidx]['fonts']) && count($this->_res['tpl'][$tplidx]['fonts'])) { - $this->_out('/Font <<'); - foreach($this->_res['tpl'][$tplidx]['fonts'] as $font) - $this->_out('/F' . $font['i'] . ' ' . $font['n'] . ' 0 R'); - $this->_out('>>'); - } - if(isset($this->_res['tpl'][$tplidx]['images']) && count($this->_res['tpl'][$tplidx]['images']) || - isset($this->_res['tpl'][$tplidx]['tpls']) && count($this->_res['tpl'][$tplidx]['tpls'])) - { - $this->_out('/XObject <<'); - if (isset($this->_res['tpl'][$tplidx]['images']) && count($this->_res['tpl'][$tplidx]['images'])) { - foreach($this->_res['tpl'][$tplidx]['images'] as $image) - $this->_out('/I' . $image['i'] . ' ' . $image['n'] . ' 0 R'); ->>>>>>> 4af26c119faa512590faad44e296b64b6c9e1978 } if (isset($this->_res['tpl'][$tplidx]['tpls']) && count($this->_res['tpl'][$tplidx]['tpls'])) { foreach($this->_res['tpl'][$tplidx]['tpls'] as $i => $tpl) $this->_out($this->tplprefix . $i . ' ' . $tpl['n'] . ' 0 R'); } $this->_out('>>'); -<<<<<<< HEAD } $this->_out('>>'); - + $this->_out('/Length ' . strlen($p) . ' >>'); $this->_putstream($p); $this->_out('endobj'); } } - -======= - } - $this->_out('>>'); - $this->_out('/Length ' . strlen($p) . ' >>'); - $this->_putstream($p); - $this->_out('endobj'); - } - } - ->>>>>>> 4af26c119faa512590faad44e296b64b6c9e1978 /** * Overwritten to add _putformxobjects() after _putimages() * @@ -680,17 +436,10 @@ class FPDF_TPL extends FPDF { parent::_putimages(); $this->_putformxobjects(); } -<<<<<<< HEAD - - function _putxobjectdict() { - parent::_putxobjectdict(); - -======= function _putxobjectdict() { parent::_putxobjectdict(); ->>>>>>> 4af26c119faa512590faad44e296b64b6c9e1978 if (count($this->tpls)) { foreach($this->tpls as $tplidx => $tpl) { $this->_out(sprintf('%s%d %d 0 R', $this->tplprefix, $tplidx, $tpl['n'])); From c36f92396b03890be7367a1398c48dc06ccda990 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 5 Mar 2015 11:13:44 +0100 Subject: [PATCH 250/287] Add navigation into the new timesheet week page. Fix bad merge --- htdocs/core/lib/project.lib.php | 37 ++++++++++++----------- htdocs/langs/en_US/projects.lang | 3 +- htdocs/main.inc.php | 4 +-- htdocs/projet/activity/perday.php | 50 +++++++++++++++++++++++++++++-- 4 files changed, 69 insertions(+), 25 deletions(-) diff --git a/htdocs/core/lib/project.lib.php b/htdocs/core/lib/project.lib.php index eb7617b5c7e..e4015812e62 100644 --- a/htdocs/core/lib/project.lib.php +++ b/htdocs/core/lib/project.lib.php @@ -234,10 +234,10 @@ function project_admin_prepare_head() /** * Show task lines with a particular parent * - * @param string $inc Counter that count number of lines legitimate to show (for return) - * @param int $parent Id of parent task to start - * @param array $lines Array of all tasks - * @param int $level Level of task + * @param string $inc Line number (start to 0, then increased by recursive call) + * @param string $parent Id of parent project to show (0 to show all) + * @param Task[] $lines Array of lines + * @param int $level Level (start to 0, then increased/decrease by recursive call) * @param string $var Color * @param int $showproject Show project columns * @param int $taskrole Array of roles of user for each tasks @@ -482,12 +482,12 @@ function projectLinesa(&$inc, $parent, &$lines, &$level, $var, $showproject, &$t /** * Output a task line into a pertime intput mode * - * @param string $inc ? - * @param string $parent ? - * @param Task[] $lines ? - * @param int $level ? - * @param string $projectsrole ? - * @param string $tasksrole ? + * @param string $inc Line number (start to 0, then increased by recursive call) + * @param string $parent Id of parent project to show (0 to show all) + * @param Task[] $lines Array of lines + * @param int $level Level (start to 0, then increased/decrease by recursive call) + * @param string $projectsrole Array of roles user has on project + * @param string $tasksrole Array of roles user has on task * @param string $mine Show only task lines I am assigned to * @param int $restricteditformytask 0=No restriction, 1=Enable add time only if task is a task i am affected to * @return $inc @@ -628,12 +628,12 @@ function projectLinesPerTime(&$inc, $parent, $lines, &$level, &$projectsrole, &$ /** * Output a task line into a perday intput mode * - * @param string $inc ? - * @param string $parent ? - * @param Task[] $lines ? - * @param int $level ? - * @param string $projectsrole ? - * @param string $tasksrole ? + * @param string $inc Line number (start to 0, then increased by recursive call) + * @param string $parent Id of parent project to show (0 to show all) + * @param Task[] $lines Array of lines + * @param int $level Level (start to 0, then increased/decrease by recursive call) + * @param string $projectsrole Array of roles user has on project + * @param string $tasksrole Array of roles user has on task * @param string $mine Show only task lines I am assigned to * @param int $restricteditformytask 0=No restriction, 1=Enable add time only if task is a task i am affected to * @return $inc @@ -750,7 +750,7 @@ function projectLinesPerDay(&$inc, $parent, $lines, &$level, &$projectsrole, &$t { $dayWorkLoad = 0; $tableCell ='
'.$langs->trans("BankName").''; - $tableCell.='+'; + $tableCell.='+'; $tableCell.=''; @@ -927,7 +927,8 @@ function print_projecttasks_array($db, $socid, $projectsListId, $mytasks=0, $sta print "
"; - if (!empty($conf->global->PROJECT_LIMIT_YEAR_RANGE)) { + if (!empty($conf->global->PROJECT_LIMIT_YEAR_RANGE)) + { //Add the year filter input print ''; print ''; diff --git a/htdocs/langs/en_US/projects.lang b/htdocs/langs/en_US/projects.lang index dc25c1f33b7..936e86ad692 100644 --- a/htdocs/langs/en_US/projects.lang +++ b/htdocs/langs/en_US/projects.lang @@ -136,4 +136,5 @@ ProjectMustBeValidatedFirst=Project must be validated first ProjectDraft=Draft projects FirstAddRessourceToAllocateTime=Associate a ressource to allocate time InputPerTime=Input per time -InputPerDay=Input per day \ No newline at end of file +InputPerDay=Input per day +TimeAlreadyRecorded=Time spent already recorded for this task/day and user %s \ No newline at end of file diff --git a/htdocs/main.inc.php b/htdocs/main.inc.php index 4818b2d38f1..36e246c42f2 100644 --- a/htdocs/main.inc.php +++ b/htdocs/main.inc.php @@ -1376,9 +1376,7 @@ function top_menu($head, $title='', $target='', $disablejs=0, $disablehead=0, $a // Wrapper to show tooltips print "\n".''; } diff --git a/htdocs/projet/activity/perday.php b/htdocs/projet/activity/perday.php index f7b37ca1ca0..692267d6965 100644 --- a/htdocs/projet/activity/perday.php +++ b/htdocs/projet/activity/perday.php @@ -50,6 +50,11 @@ $result = restrictedArea($user, 'projet', $projectid); $now=dol_now(); +$year=GETPOST("year","int")?GETPOST("year","int"):date("Y"); +$month=GETPOST("month","int")?GETPOST("month","int"):date("m"); +$week=GETPOST("week","int")?GETPOST("week","int"):date("W"); +$day=GETPOST("day","int")?GETPOST("day","int"):date("d"); + /* * Actions @@ -138,6 +143,40 @@ print "\n"; dol_fiche_end(); */ + +$startdayarray=dol_get_first_day_week($day, $month, $year); + +$prev = $startdayarray; +$prev_year = $prev['prev_year']; +$prev_month = $prev['prev_month']; +$prev_day = $prev['prev_day']; +$first_day = $prev['first_day']; +$first_month= $prev['first_month']; +$first_year = $prev['first_year']; +$week = $prev['week']; + +$day = (int) $day; +$next = dol_get_next_week($first_day, $week, $first_month, $first_year); +$next_year = $next['year']; +$next_month = $next['month']; +$next_day = $next['day']; + +// Define firstdaytoshow and lastdaytoshow (warning: lastdaytoshow is last second to show + 1) +$firstdaytoshow=dol_mktime(0,0,0,$first_month,$first_day,$first_year); +$lastdaytoshow=dol_time_plus_duree($firstdaytoshow, 7, 'd'); + +$tmpday = $first_day; + +// Show navigation bar +$nav ="".img_previous($langs->trans("Previous"))."\n"; +$nav.=" ".dol_print_date(dol_mktime(0,0,0,$first_month,$first_day,$first_year),"%Y").", ".$langs->trans("Week")." ".$week; +$nav.=" \n"; +$nav.="".img_next($langs->trans("Next"))."\n"; +$nav.="   (".$langs->trans("Today").")"; +$picto='calendarweek'; +print '
'.$nav.'
'; + + print '
'; print ''; print ''; @@ -147,8 +186,6 @@ print ''; print ''; //print ''; -$tmp=dol_getdate($now); -$startdayarray=dol_get_first_day_week($tmp['mday'], $tmp['mon'], $tmp['year']); $startday=dol_mktime(12, 0, 0, $startdayarray['first_month'], $startdayarray['first_day'], $startdayarray['first_year']); for($i=0;$i<7;$i++) @@ -192,7 +229,14 @@ print '
'; print ''; print '
'; -print ''; +print ''."\n\n"; + + +print ''; llxFooter(); From dc15eee533b85c5856d9508ad6ffb7f13c348198 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 5 Mar 2015 11:21:58 +0100 Subject: [PATCH 251/287] Fix: missing dependcy on project to check before deleting --- htdocs/societe/class/societe.class.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/societe/class/societe.class.php b/htdocs/societe/class/societe.class.php index 510e184e521..a18aedfcc1b 100644 --- a/htdocs/societe/class/societe.class.php +++ b/htdocs/societe/class/societe.class.php @@ -1,6 +1,6 @@ - * Copyright (C) 2004-2014 Laurent Destailleur + * Copyright (C) 2004-2015 Laurent Destailleur * Copyright (C) 2004 Eric Seigne * Copyright (C) 2003 Brian Fraval * Copyright (C) 2006 Andre Cianfarani @@ -42,7 +42,7 @@ class Societe extends CommonObject public $element='societe'; public $table_element = 'societe'; public $fk_element='fk_soc'; - protected $childtables=array("propal","commande","facture","contrat","facture_fourn","commande_fournisseur"); // To test if we can delete object + protected $childtables=array("propal","commande","facture","contrat","facture_fourn","commande_fournisseur","projet"); // To test if we can delete object /** * 0=No test on entity, 1=Test with field entity, 2=Test with link by societe From 9c12c325dbf60a450c6b23b8f57424f3999a2b57 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 5 Mar 2015 11:46:03 +0100 Subject: [PATCH 252/287] Fix regression into enable/disable external calendars --- htdocs/comm/action/index.php | 9 ++++----- htdocs/comm/action/peruser.php | 8 ++++---- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/htdocs/comm/action/index.php b/htdocs/comm/action/index.php index 1565bf79cac..f2e945cf83d 100644 --- a/htdocs/comm/action/index.php +++ b/htdocs/comm/action/index.php @@ -363,17 +363,16 @@ if (! empty($conf->use_javascript_ajax)) { foreach ($showextcals as $val) { - $htmlname = dol_string_nospecial($val['name']); - $htmlname = dol_string_nospecial($htmlname,'_',array("\.","#")); + $htmlname = md5($val['name']); $s.='' . "\n"; - $s.='
' . $val ['name'] . '  
'; + $s.='
' . $val ['name'] . '  
'; } } $s.='
'.$langs->trans("AgendaShowBirthdayEvents").'  
'; diff --git a/htdocs/comm/action/peruser.php b/htdocs/comm/action/peruser.php index 599bc32ceba..0f281a91af4 100644 --- a/htdocs/comm/action/peruser.php +++ b/htdocs/comm/action/peruser.php @@ -305,16 +305,16 @@ if ($conf->use_javascript_ajax) { foreach ($showextcals as $val) { - $htmlname = dol_string_nospecial($val['name']); + $htmlname = md5($val['name']); $s.='' . "\n"; - $s.='
' . $val ['name'] . '  
'; + $s.='
' . $val ['name'] . '  
'; } } } From 8b5dd4910f22ea37718fe7bedd9b390e554a40ec Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 5 Mar 2015 13:02:37 +0100 Subject: [PATCH 253/287] Fix bad update of denormalized field --- htdocs/projet/class/task.class.php | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/htdocs/projet/class/task.class.php b/htdocs/projet/class/task.class.php index a9ecdd7bbc6..4c3e3995b03 100644 --- a/htdocs/projet/class/task.class.php +++ b/htdocs/projet/class/task.class.php @@ -586,7 +586,7 @@ class Task extends CommonObject if ($filteronprojstatus > -1) $sql.= " AND p.fk_statut = ".$filteronprojstatus; $sql.= " ORDER BY p.ref, t.rang, t.dateo"; - //print $sql; + //print $sql;exit; dol_syslog(get_class($this)."::getTasksArray", LOG_DEBUG); $resql = $this->db->query($sql); if ($resql) @@ -759,6 +759,8 @@ class Task extends CommonObject { global $conf,$langs; + dol_syslog(get_class($this)."::addTimeSpent", LOG_DEBUG); + $ret = 0; // Check parameters @@ -790,8 +792,8 @@ class Task extends CommonObject $sql.= ", ".(isset($this->timespent_note)?"'".$this->db->escape($this->timespent_note)."'":"null"); $sql.= ")"; - dol_syslog(get_class($this)."::addTimeSpent", LOG_DEBUG); - if ($this->db->query($sql) ) + $resql=$this->db->query($sql); + if ($resql) { $tasktime_id = $this->db->last_insert_id(MAIN_DB_PREFIX."projet_task_time"); $ret = $tasktime_id; @@ -800,21 +802,22 @@ class Task extends CommonObject { // Call trigger $result=$this->call_trigger('TASK_TIMESPENT_CREATE',$user); - if ($result < 0) { $this->db->rollback(); $ret=-1; } + if ($result < 0) { $ret=-1; } // End call triggers } } else { $this->error=$this->db->lasterror(); - $this->db->rollback(); $ret = -1; } if ($ret >= 0) { + // Recalculate amount of time spent for task and update denormalized field $sql = "UPDATE ".MAIN_DB_PREFIX."projet_task"; - $sql.= " SET duration_effective = duration_effective + '".price2num($this->timespent_duration)."'"; + //$sql.= " SET duration_effective = (".$this->db->ifsql('duration_effective IS NULL', 0, 'duration_effective').") + ".price2num($this->timespent_duration); + $sql.= " SET duration_effective = (SELECT SUM(task_duration) FROM ".MAIN_DB_PREFIX."projet_task_time as ptt where ptt.fk_task = ".$this->id.")"; if (isset($this->progress)) $sql.= ", progress = " . $this->progress; // Do not overwrite value if not provided $sql.= " WHERE rowid = ".$this->id; @@ -822,7 +825,6 @@ class Task extends CommonObject if (! $this->db->query($sql) ) { $this->error=$this->db->lasterror(); - $this->db->rollback(); $ret = -2; } @@ -834,12 +836,18 @@ class Task extends CommonObject if (! $this->db->query($sql) ) { $this->error=$this->db->lasterror(); - $this->db->rollback(); $ret = -2; } } - if ($ret >=0) $this->db->commit(); + if ($ret >=0) + { + $this->db->commit(); + } + else + { + $this->db->rollback(); + } return $ret; } From d7ab3f112c163f6cf17c1dc6e9e697e710a0ea5d Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 5 Mar 2015 13:48:57 +0100 Subject: [PATCH 254/287] NEW: Show difference between timespent by everybody and time spent by user making timesheet into timesheet pages. NEW: Can enter start hours of task when creating timesheet --- htdocs/core/lib/project.lib.php | 66 +++++++++++++------ .../install/mysql/migration/3.7.0-3.8.0.sql | 4 ++ .../mysql/tables/llx_projet_task_time.sql | 5 +- htdocs/langs/en_US/main.lang | 1 + htdocs/langs/en_US/projects.lang | 2 + htdocs/projet/activity/perday.php | 14 ++-- htdocs/projet/activity/pertime.php | 48 ++++++++++---- htdocs/projet/class/task.class.php | 13 +++- htdocs/projet/tasks/time.php | 41 +++++++++--- 9 files changed, 140 insertions(+), 54 deletions(-) diff --git a/htdocs/core/lib/project.lib.php b/htdocs/core/lib/project.lib.php index e4015812e62..e028c3cbbd8 100644 --- a/htdocs/core/lib/project.lib.php +++ b/htdocs/core/lib/project.lib.php @@ -177,15 +177,21 @@ function project_timesheet_prepare_head($mode) $h = 0; - $head[$h][0] = DOL_URL_ROOT."/projet/activity/perday.php".($mode?'?mode='.$mode:''); - $head[$h][1] = $langs->trans("InputPerDay"); - $head[$h][2] = 'inputperday'; - $h++; + if (empty($conf->global->PROJECT_DISABLE_TIMESHEET_PERDAY)) + { + $head[$h][0] = DOL_URL_ROOT."/projet/activity/perday.php".($mode?'?mode='.$mode:''); + $head[$h][1] = $langs->trans("InputPerDay"); + $head[$h][2] = 'inputperday'; + $h++; + } - $head[$h][0] = DOL_URL_ROOT."/projet/activity/pertime.php".($mode?'?mode='.$mode:''); - $head[$h][1] = $langs->trans("InputPerTime"); - $head[$h][2] = 'inputpertime'; - $h++; + if (empty($conf->global->PROJECT_DISABLE_TIMESHEET_PERTIME)) + { + $head[$h][0] = DOL_URL_ROOT."/projet/activity/pertime.php".($mode?'?mode='.$mode:''); + $head[$h][1] = $langs->trans("InputPerTime"); + $head[$h][2] = 'inputpertime'; + $h++; + } complete_head_from_modules($conf,$langs,null,$head,$h,'project_timesheet'); @@ -524,20 +530,22 @@ function projectLinesPerTime(&$inc, $parent, $lines, &$level, &$projectsrole, &$ // If we want all or we have a role on task, we show it if (empty($mine) || ! empty($tasksrole[$lines[$i]->id])) { - print "
\n"; - - // Project - print "\n"; + + // Project + print ""; // Ref print ''; @@ -564,8 +572,9 @@ function projectLinesPerTime(&$inc, $parent, $lines, &$level, &$projectsrole, &$ print $formother->select_percent($lines[$i]->progress, $lines[$i]->id . 'progress'); print ''; - // Time spent + // Time spent by everybody print '\n"; + // Time spent by user + print '\n"; + $disabledproject=1;$disabledtask=1; //print "x".$lines[$i]->fk_project; //var_dump($lines[$i]); @@ -592,11 +608,13 @@ function projectLinesPerTime(&$inc, $parent, $lines, &$level, &$projectsrole, &$ } // Form to add new time - print ''; @@ -713,9 +731,9 @@ function projectLinesPerDay(&$inc, $parent, $lines, &$level, &$projectsrole, &$t print $formother->select_percent($lines[$i]->progress, $lines[$i]->id . 'progress'); print ''; - // Time spent - /* + // Time spent by everybody print '\n"; - */ + + // Time spent by user + print '\n"; $disabledproject=1;$disabledtask=1; //print "x".$lines[$i]->fk_project; diff --git a/htdocs/install/mysql/migration/3.7.0-3.8.0.sql b/htdocs/install/mysql/migration/3.7.0-3.8.0.sql index 4f3c802a9da..3233022d3f9 100755 --- a/htdocs/install/mysql/migration/3.7.0-3.8.0.sql +++ b/htdocs/install/mysql/migration/3.7.0-3.8.0.sql @@ -19,6 +19,10 @@ -- -- VMYSQL4.1 DELETE FROM llx_usergroup_user WHERE fk_usergroup NOT IN (SELECT rowid from llx_usergroup); +UPDATE llx_projet_task_time SET task_datehour = task_date where task_datehour IS NULL; +ALTER TABLE llx_projet_task_time ADD COLUMN task_date_withhour integer DEFAULT 0 after task_datehour; + + ALTER TABLE llx_commande_fournisseur MODIFY COLUMN date_livraison datetime; -- Add id commandefourndet in llx_commande_fournisseur_dispatch to correct /fourn/commande/dispatch.php display when several times same product in supplier order diff --git a/htdocs/install/mysql/tables/llx_projet_task_time.sql b/htdocs/install/mysql/tables/llx_projet_task_time.sql index d5d89812b4a..d58b35146a7 100644 --- a/htdocs/install/mysql/tables/llx_projet_task_time.sql +++ b/htdocs/install/mysql/tables/llx_projet_task_time.sql @@ -20,8 +20,9 @@ create table llx_projet_task_time ( rowid integer AUTO_INCREMENT PRIMARY KEY, fk_task integer NOT NULL, - task_date date, -- only the day - task_datehour datetime, -- day + hour + task_date date, -- only the day + task_datehour datetime, -- day + hour + task_date_withhour integer DEFAULT 0; -- 0 by default, 1 if date was entered with start hour task_duration double, fk_user integer, thm double(24,8), diff --git a/htdocs/langs/en_US/main.lang b/htdocs/langs/en_US/main.lang index ba7353b015d..be893d52569 100644 --- a/htdocs/langs/en_US/main.lang +++ b/htdocs/langs/en_US/main.lang @@ -220,6 +220,7 @@ Cards=Cards Card=Card Now=Now Date=Date +DateAndHour=Date and hour DateStart=Date start DateEnd=Date end DateCreation=Creation date diff --git a/htdocs/langs/en_US/projects.lang b/htdocs/langs/en_US/projects.lang index 936e86ad692..53e7140be08 100644 --- a/htdocs/langs/en_US/projects.lang +++ b/htdocs/langs/en_US/projects.lang @@ -31,6 +31,8 @@ NoProject=No project defined or owned NbOpenTasks=Nb of opened tasks NbOfProjects=Nb of projects TimeSpent=Time spent +TimeSpentByYou=Time spent by you +TimeSpentByUser=Time spent by user TimesSpent=Time spent RefTask=Ref. task LabelTask=Label task diff --git a/htdocs/projet/activity/perday.php b/htdocs/projet/activity/perday.php index 692267d6965..9ca8f95ac45 100644 --- a/htdocs/projet/activity/perday.php +++ b/htdocs/projet/activity/perday.php @@ -83,8 +83,10 @@ $taskstatic = new Task($db); $title=$langs->trans("TimeSpent"); if ($mine) $title=$langs->trans("MyTimeSpent"); +$usertoprocess=$user; + //$projectsListId = $projectstatic->getProjectsAuthorizedForUser($user,$mine,1); -$projectsListId = $projectstatic->getProjectsAuthorizedForUser($user,0,1); // Return all project i have permission on. I want my tasks and some of my task may be on a public projet that is not my project +$projectsListId = $projectstatic->getProjectsAuthorizedForUser($usertoprocess,0,1); // Return all project i have permission on. I want my tasks and some of my task may be on a public projet that is not my project if ($id) { @@ -94,8 +96,8 @@ if ($id) $onlyopened=1; // or -1 $tasksarray=$taskstatic->getTasksArray(0,0,($project->id?$project->id:$projectsListId),$socid,0,'',$onlyopened); // We want to see all task of opened project i am allowed to see, not only mine. Later only mine will be editable later. -$projectsrole=$taskstatic->getUserRolesForProjectsOrTasks($user,0,($project->id?$project->id:$projectsListId),0); -$tasksrole=$taskstatic->getUserRolesForProjectsOrTasks(0,$user,($project->id?$project->id:$projectsListId),0); +$projectsrole=$taskstatic->getUserRolesForProjectsOrTasks($usertoprocess,0,($project->id?$project->id:$projectsListId),0); +$tasksrole=$taskstatic->getUserRolesForProjectsOrTasks(0,$usertoprocess,($project->id?$project->id:$projectsListId),0); //var_dump($tasksarray); //var_dump($projectsrole); //var_dump($taskrole); @@ -184,7 +186,9 @@ print ''; print ''; print ''; print ''; -//print ''; +print ''; +if ($usertoprocess->id == $user->id) print ''; +else print ''; $startday=dol_mktime(12, 0, 0, $startdayarray['first_month'], $startdayarray['first_day'], $startdayarray['first_year']); @@ -204,7 +208,7 @@ if (count($tasksarray) > 0) projectLinesPerDay($j, 0, $tasksarray, $level, $projectsrole, $tasksrole, $mine, $restricteditformytask); print ' - + diff --git a/htdocs/projet/activity/pertime.php b/htdocs/projet/activity/pertime.php index 9d277251772..9f2dc3e99ca 100644 --- a/htdocs/projet/activity/pertime.php +++ b/htdocs/projet/activity/pertime.php @@ -62,8 +62,8 @@ if ($action == 'addtime' && $user->rights->projet->creer) { if (intval($time) > 0) { - // Hours or minutes - if (preg_match("/([0-9]+)(hour|min)/",$key,$matches)) + // Hours or minutes of duration + if (preg_match("/([0-9]+)duration(hour|min)/",$key,$matches)) { $id = $matches[1]; if ($id > 0) @@ -86,15 +86,33 @@ if ($action == 'addtime' && $user->rights->projet->creer) $task->progress = GETPOST($key . 'progress', 'int'); $task->timespent_duration = $val; $task->timespent_fk_user = $user->id; - $task->timespent_date = dol_mktime(12,0,0,$_POST["{$key}month"],$_POST["{$key}day"],$_POST["{$key}year"]); - $task->addTimeSpent($user); + if (GETPOST($key."hour") != '' && GETPOST($key."hour") >= 0) // If hour was entered + { + $task->timespent_date = dol_mktime(GETPOST($key."hour"),GETPOST($key."min"),0,GETPOST($key."month"),GETPOST($key."day"),GETPOST($key."year")); + $task->timespent_withhour = 1; + } + else + { + $task->timespent_date = dol_mktime(12,0,0,GETPOST($key."month"),GETPOST($key."day"),GETPOST($key."year")); + } + + $result=$task->addTimeSpent($user); + if ($result < 0) + { + setEventMessages($task->error, $task->errors, 'errors'); + $error++; + break; + } } - setEventMessage($langs->trans("RecordSaved")); + if (! $error) + { + setEventMessage($langs->trans("RecordSaved")); - // Redirect to avoid submit twice on back - header('Location: '.$_SERVER["PHP_SELF"].'?id='.$projectid.($mode?'&mode='.$mode:'')); - exit; + // Redirect to avoid submit twice on back + header('Location: '.$_SERVER["PHP_SELF"].($projectid?'?id='.$projectid:'?').($mode?'&mode='.$mode:'')); + exit; + } } else { @@ -116,8 +134,9 @@ $taskstatic = new Task($db); $title=$langs->trans("TimeSpent"); if ($mine) $title=$langs->trans("MyTimeSpent"); -//$projectsListId = $projectstatic->getProjectsAuthorizedForUser($user,$mine,1); -$projectsListId = $projectstatic->getProjectsAuthorizedForUser($user,0,1); // Return all project i have permission on. I want my tasks and some of my task may be on a public projet that is not my project +$usertoprocess = $user; + +$projectsListId = $projectstatic->getProjectsAuthorizedForUser($usertoprocess,0,1); // Return all project i have permission on. I want my tasks and some of my task may be on a public projet that is not my project if ($id) { @@ -127,8 +146,8 @@ if ($id) $onlyopened=1; // or -1 $tasksarray=$taskstatic->getTasksArray(0,0,($project->id?$project->id:$projectsListId),$socid,0,'',$onlyopened); // We want to see all task of opened project i am allowed to see, not only mine. Later only mine will be editable later. -$projectsrole=$taskstatic->getUserRolesForProjectsOrTasks($user,0,($project->id?$project->id:$projectsListId),0); -$tasksrole=$taskstatic->getUserRolesForProjectsOrTasks(0,$user,($project->id?$project->id:$projectsListId),0); +$projectsrole=$taskstatic->getUserRolesForProjectsOrTasks($usertoprocess,0,($project->id?$project->id:$projectsListId),0); +$tasksrole=$taskstatic->getUserRolesForProjectsOrTasks(0,$usertoprocess,($project->id?$project->id:$projectsListId),0); //var_dump($tasksarray); //var_dump($projectsrole); //var_dump($taskrole); @@ -184,7 +203,10 @@ print ''; print ''; print ''; print ''; -print ''; +if ($usertoprocess->id == $user->id) print ''; +else print ''; +print ''; +print ''; print "\n"; // By default, we can edit only tasks we are assigned to diff --git a/htdocs/projet/class/task.class.php b/htdocs/projet/class/task.class.php index 4c3e3995b03..f9e07ab6e9d 100644 --- a/htdocs/projet/class/task.class.php +++ b/htdocs/projet/class/task.class.php @@ -61,6 +61,7 @@ class Task extends CommonObject var $timespent_old_duration; var $timespent_date; var $timespent_datehour; // More accurate start date (same than timespent_date but includes hours, minutes and seconds) + var $timespent_withhour; // 1 = we entered also start hours for timesheet line var $timespent_fk_user; var $timespent_note; @@ -780,6 +781,7 @@ class Task extends CommonObject $sql.= "fk_task"; $sql.= ", task_date"; $sql.= ", task_datehour"; + $sql.= ", task_date_withhour"; $sql.= ", task_duration"; $sql.= ", fk_user"; $sql.= ", note"; @@ -787,6 +789,7 @@ class Task extends CommonObject $sql.= $this->id; $sql.= ", '".$this->db->idate($this->timespent_date)."'"; $sql.= ", '".$this->db->idate($this->timespent_datehour)."'"; + $sql.= ", ".(empty($this->timespent_withhour)?0:1); $sql.= ", ".$this->timespent_duration; $sql.= ", ".$this->timespent_fk_user; $sql.= ", ".(isset($this->timespent_note)?"'".$this->db->escape($this->timespent_note)."'":"null"); @@ -816,7 +819,6 @@ class Task extends CommonObject { // Recalculate amount of time spent for task and update denormalized field $sql = "UPDATE ".MAIN_DB_PREFIX."projet_task"; - //$sql.= " SET duration_effective = (".$this->db->ifsql('duration_effective IS NULL', 0, 'duration_effective').") + ".price2num($this->timespent_duration); $sql.= " SET duration_effective = (SELECT SUM(task_duration) FROM ".MAIN_DB_PREFIX."projet_task_time as ptt where ptt.fk_task = ".$this->id.")"; if (isset($this->progress)) $sql.= ", progress = " . $this->progress; // Do not overwrite value if not provided $sql.= " WHERE rowid = ".$this->id; @@ -906,6 +908,8 @@ class Task extends CommonObject $sql.= " t.rowid,"; $sql.= " t.fk_task,"; $sql.= " t.task_date,"; + $sql.= " t.task_datehour,"; + $sql.= " t.task_date_withhour,"; $sql.= " t.task_duration,"; $sql.= " t.fk_user,"; $sql.= " t.note"; @@ -922,7 +926,9 @@ class Task extends CommonObject $this->timespent_id = $obj->rowid; $this->id = $obj->fk_task; - $this->timespent_date = $obj->task_date; + $this->timespent_date = $this->db->jdate($obj->task_date); + $this->timespent_datehour = $this->db->jdate($obj->task_datehour); + $this->timespent_withhour = $obj->task_date_withhour; $this->timespent_duration = $obj->task_duration; $this->timespent_fk_user = $obj->fk_user; $this->timespent_note = $obj->note; @@ -961,6 +967,7 @@ class Task extends CommonObject $sql = "UPDATE ".MAIN_DB_PREFIX."projet_task_time SET"; $sql.= " task_date = '".$this->db->idate($this->timespent_date)."',"; $sql.= " task_datehour = '".$this->db->idate($this->timespent_datehour)."',"; + $sql.= " task_date_withhour = ".(empty($this->timespent_withhour)?0:1); $sql.= " task_duration = ".$this->timespent_duration.","; $sql.= " fk_user = ".$this->timespent_fk_user.","; $sql.= " note = ".(isset($this->timespent_note)?"'".$this->db->escape($this->timespent_note)."'":"null"); @@ -995,7 +1002,7 @@ class Task extends CommonObject $newDuration = $this->timespent_duration - $this->timespent_old_duration; $sql = "UPDATE ".MAIN_DB_PREFIX."projet_task"; - $sql.= " SET duration_effective = duration_effective + '".$newDuration."'"; + $sql.= " SET duration_effective = (SELECT SUM(task_duration) FROM ".MAIN_DB_PREFIX."projet_task_time as ptt where ptt.fk_task = ".$this->id.")"; $sql.= " WHERE rowid = ".$this->id; dol_syslog(get_class($this)."::updateTimeSpent", LOG_DEBUG); diff --git a/htdocs/projet/tasks/time.php b/htdocs/projet/tasks/time.php index 9951902ec5b..20ef1714164 100644 --- a/htdocs/projet/tasks/time.php +++ b/htdocs/projet/tasks/time.php @@ -87,7 +87,15 @@ if ($action == 'addtimespent' && $user->rights->projet->creer) $object->progress = GETPOST('progress', 'int'); $object->timespent_duration = $_POST["timespent_durationhour"]*60*60; // We store duration in seconds $object->timespent_duration+= $_POST["timespent_durationmin"]*60; // We store duration in seconds - $object->timespent_date = dol_mktime(12,0,0,$_POST["timemonth"],$_POST["timeday"],$_POST["timeyear"]); + if (GETPOST("timehour") != '' && GETPOST("timehour") >= 0) // If hour was entered + { + $object->timespent_date = dol_mktime(GETPOST("timehour"),GETPOST("timemin"),0,GETPOST("timemonth"),GETPOST("timeday"),GETPOST("timeyear")); + $object->timespent_withhour = 1; + } + else + { + $object->timespent_date = dol_mktime(12,0,0,GETPOST("timemonth"),GETPOST("timeday"),GETPOST("timeyear")); + } $object->timespent_fk_user = $_POST["userid"]; $result=$object->addTimeSpent($user); if ($result >= 0) @@ -126,7 +134,15 @@ if ($action == 'updateline' && ! $_POST["cancel"] && $user->rights->projet->cree $object->timespent_old_duration = $_POST["old_duration"]; $object->timespent_duration = $_POST["new_durationhour"]*60*60; // We store duration in seconds $object->timespent_duration+= $_POST["new_durationmin"]*60; // We store duration in seconds - $object->timespent_date = dol_mktime(12,0,0,$_POST["timelinemonth"],$_POST["timelineday"],$_POST["timelineyear"]); + if (GETPOST("timelinehour") != '' && GETPOST("timelinehour") >= 0) // If hour was entered + { + $object->timespent_date = dol_mktime(GETPOST("timelinehour"),GETPOST("timelinemin"),0,GETPOST("timelinemonth"),GETPOST("timelineday"),GETPOST("timelineyear")); + $object->timespent_withhour = 1; + } + else + { + $object->timespent_date = dol_mktime(12,0,0,GETPOST("timelinemonth"),GETPOST("timelineday"),GETPOST("timelineyear")); + } $object->timespent_fk_user = $_POST["userid_line"]; $result=$object->updateTimeSpent($user); @@ -341,7 +357,7 @@ if ($id > 0 || ! empty($ref)) /* - * Add time spent + * Form to add time spent */ if ($user->rights->projet->creer) { @@ -367,8 +383,9 @@ if ($id > 0 || ! empty($ref)) // Date print ''; // Contributor @@ -410,13 +427,13 @@ if ($id > 0 || ! empty($ref)) /* * List of time spent */ - $sql = "SELECT t.rowid, t.task_date, t.task_duration, t.fk_user, t.note"; + $sql = "SELECT t.rowid, t.task_date, t.task_datehour, t.task_date_withhour, t.task_duration, t.fk_user, t.note"; $sql.= ", u.lastname, u.firstname"; $sql .= " FROM ".MAIN_DB_PREFIX."projet_task_time as t"; $sql .= " , ".MAIN_DB_PREFIX."user as u"; $sql .= " WHERE t.fk_task =".$object->id; $sql .= " AND t.fk_user = u.rowid"; - $sql .= " ORDER BY t.task_date DESC"; + $sql .= " ORDER BY t.task_date DESC, t.task_datehour DESC, t.rowid DESC"; $var=true; $resql = $db->query($sql); @@ -459,15 +476,18 @@ if ($id > 0 || ! empty($ref)) $var=!$var; print ""; + $date1=$db->jdate($task_time->task_date); + $date2=$db->jdate($task_time->task_datehour); + // Date - print ''; @@ -480,6 +500,7 @@ if ($id > 0 || ! empty($ref)) $contactsoftask[]=$task_time->fk_user; } if (count($contactsoftask)>0) { + print img_object('','user','class="hideonsmartphone"'); print $form->select_dolusers($task_time->fk_user,'userid_line',0,'',0,'',$contactsoftask); }else { print img_error($langs->trans('FirstAddRessourceToAllocateTime')).$langs->trans('FirstAddRessourceToAllocateTime'); From 22045603b744134fa4c75066b97ff1adca623d37 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 5 Mar 2015 13:51:29 +0100 Subject: [PATCH 255/287] Fix bad update of denormalized field --- htdocs/projet/class/task.class.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/projet/class/task.class.php b/htdocs/projet/class/task.class.php index 017e2b782ec..b01a9644cb1 100644 --- a/htdocs/projet/class/task.class.php +++ b/htdocs/projet/class/task.class.php @@ -807,7 +807,7 @@ class Task extends CommonObject if ($ret >= 0) { $sql = "UPDATE ".MAIN_DB_PREFIX."projet_task"; - $sql.= " SET duration_effective = duration_effective + '".price2num($this->timespent_duration)."'"; + $sql.= " SET duration_effective = (SELECT SUM(task_duration) FROM ".MAIN_DB_PREFIX."projet_task_time as ptt where ptt.fk_task = ".$this->id.")"; if (isset($this->progress)) $sql.= ", progress = " . $this->progress; // Do not overwrite value if not provided $sql.= " WHERE rowid = ".$this->id; @@ -980,7 +980,7 @@ class Task extends CommonObject $newDuration = $this->timespent_duration - $this->timespent_old_duration; $sql = "UPDATE ".MAIN_DB_PREFIX."projet_task"; - $sql.= " SET duration_effective = duration_effective + '".$newDuration."'"; + $sql.= " SET duration_effective = (SELECT SUM(task_duration) FROM ".MAIN_DB_PREFIX."projet_task_time as ptt where ptt.fk_task = ".$this->id.")"; $sql.= " WHERE rowid = ".$this->id; dol_syslog(get_class($this)."::updateTimeSpent", LOG_DEBUG); From 97f36825df1c626c642d7edc05730e521d7a4f6c Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 5 Mar 2015 21:47:50 +0100 Subject: [PATCH 256/287] Work on new timesheet page --- htdocs/core/lib/project.lib.php | 16 ++++--- htdocs/projet/activity/perday.php | 69 ++++++++++++++++-------------- htdocs/projet/class/task.class.php | 13 +++++- 3 files changed, 58 insertions(+), 40 deletions(-) diff --git a/htdocs/core/lib/project.lib.php b/htdocs/core/lib/project.lib.php index e028c3cbbd8..f744508d9bf 100644 --- a/htdocs/core/lib/project.lib.php +++ b/htdocs/core/lib/project.lib.php @@ -555,10 +555,12 @@ function projectLinesPerTime(&$inc, $parent, $lines, &$level, &$projectsrole, &$ for ($k = 0 ; $k < $level ; $k++) print "   "; $taskstatic->id=$lines[$i]->id; $taskstatic->ref=$lines[$i]->label; + $taskstatic->date_start=$lines[$i]->date_start; + $taskstatic->date_end=$lines[$i]->date_end; print $taskstatic->getNomUrl(0); - print "
"; - for ($k = 0 ; $k < $level ; $k++) print "   "; - print get_date_range($lines[$i]->date_start,$lines[$i]->date_end,'',$langs,0); + //print "
"; + //for ($k = 0 ; $k < $level ; $k++) print "   "; + //print get_date_range($lines[$i]->date_start,$lines[$i]->date_end,'',$langs,0); print "\n"; // Planned Workload @@ -714,10 +716,12 @@ function projectLinesPerDay(&$inc, $parent, $lines, &$level, &$projectsrole, &$t for ($k = 0 ; $k < $level ; $k++) print "   "; $taskstatic->id=$lines[$i]->id; $taskstatic->ref=$lines[$i]->label; + $taskstatic->date_start=$lines[$i]->date_start; + $taskstatic->date_end=$lines[$i]->date_end; print $taskstatic->getNomUrl(0); - print "
"; - for ($k = 0 ; $k < $level ; $k++) print "   "; - print get_date_range($lines[$i]->date_start,$lines[$i]->date_end,'',$langs,0); + //print "
"; + //for ($k = 0 ; $k < $level ; $k++) print "   "; + //print get_date_range($lines[$i]->date_start,$lines[$i]->date_end,'',$langs,0); print "\n"; // Planned Workload diff --git a/htdocs/projet/activity/perday.php b/htdocs/projet/activity/perday.php index 9ca8f95ac45..abec2e8cf7c 100644 --- a/htdocs/projet/activity/perday.php +++ b/htdocs/projet/activity/perday.php @@ -108,10 +108,45 @@ llxHeader("",$title,"",'','','',array('/core/js/timesheet.js')); print_barre_liste($title, $page, $_SERVER["PHP_SELF"], "", $sortfield, $sortorder, "", $num); -print '
'; +$startdayarray=dol_get_first_day_week($day, $month, $year); + +$prev = $startdayarray; +$prev_year = $prev['prev_year']; +$prev_month = $prev['prev_month']; +$prev_day = $prev['prev_day']; +$first_day = $prev['first_day']; +$first_month= $prev['first_month']; +$first_year = $prev['first_year']; +$week = $prev['week']; + +$day = (int) $day; +$next = dol_get_next_week($first_day, $week, $first_month, $first_year); +$next_year = $next['year']; +$next_month = $next['month']; +$next_day = $next['day']; + +// Define firstdaytoshow and lastdaytoshow (warning: lastdaytoshow is last second to show + 1) +$firstdaytoshow=dol_mktime(0,0,0,$first_month,$first_day,$first_year); +$lastdaytoshow=dol_time_plus_duree($firstdaytoshow, 7, 'd'); + +$tmpday = $first_day; + +// Show navigation bar +$nav ="".img_previous($langs->trans("Previous"))."\n"; +$nav.=" ".dol_print_date(dol_mktime(0,0,0,$first_month,$first_day,$first_year),"%Y").", ".$langs->trans("Week")." ".$week; +$nav.=" \n"; +$nav.="".img_next($langs->trans("Next"))."\n"; +$nav.="   (".$langs->trans("Today").")"; +$picto='calendarweek'; + + +print ''; print ''; print ''; print ''; +print ''; +print ''; +print ''; $head=project_timesheet_prepare_head($mode); dol_fiche_head($head, 'inputperday', '', 0, 'task'); @@ -146,36 +181,6 @@ print "\n"; */ -$startdayarray=dol_get_first_day_week($day, $month, $year); - -$prev = $startdayarray; -$prev_year = $prev['prev_year']; -$prev_month = $prev['prev_month']; -$prev_day = $prev['prev_day']; -$first_day = $prev['first_day']; -$first_month= $prev['first_month']; -$first_year = $prev['first_year']; -$week = $prev['week']; - -$day = (int) $day; -$next = dol_get_next_week($first_day, $week, $first_month, $first_year); -$next_year = $next['year']; -$next_month = $next['month']; -$next_day = $next['day']; - -// Define firstdaytoshow and lastdaytoshow (warning: lastdaytoshow is last second to show + 1) -$firstdaytoshow=dol_mktime(0,0,0,$first_month,$first_day,$first_year); -$lastdaytoshow=dol_time_plus_duree($firstdaytoshow, 7, 'd'); - -$tmpday = $first_day; - -// Show navigation bar -$nav ="".img_previous($langs->trans("Previous"))."\n"; -$nav.=" ".dol_print_date(dol_mktime(0,0,0,$first_month,$first_day,$first_year),"%Y").", ".$langs->trans("Week")." ".$week; -$nav.=" \n"; -$nav.="".img_next($langs->trans("Next"))."\n"; -$nav.="   (".$langs->trans("Today").")"; -$picto='calendarweek'; print '
'.$nav.'
'; @@ -230,7 +235,7 @@ print ''; -print ''; +print ''; print ''; print ''."\n\n"; diff --git a/htdocs/projet/class/task.class.php b/htdocs/projet/class/task.class.php index f9e07ab6e9d..c322e0be3cc 100644 --- a/htdocs/projet/class/task.class.php +++ b/htdocs/projet/class/task.class.php @@ -506,9 +506,18 @@ class Task extends CommonObject global $langs; $result=''; - $label=$langs->trans("ShowTask").': '.$this->ref.($this->label?' - '.$this->label:''); + $label = '' . $langs->trans("ShowTask") . ''; + if (! empty($this->ref)) + $label .= '
' . $langs->trans('Ref') . ': ' . $this->ref; + if (! empty($this->title)) + $label .= '
' . $langs->trans('LabelTask') . ': ' . $this->label; + if ($this->date_start || $this->date_end) + { + $label .= "
".get_date_range($this->date_start,$this->date_end,'',$langs,0); + } + $linkclose = '" title="'.dol_escape_htmltag($label, 1).'" class="classfortooltip">'; - $lien = ''; + $lien = ' 46f56dc7dfff82250816df2bd2db313c 67798229e915f5841274ee70487feec4 -8d61cfa815ca3bb981582bcc7db0a6bd +e9fb1ad286fe67ee78fa8ce60a7be71c d41d8cd98f00b204e9800998ecf8427e @@ -19,7 +19,7 @@ 91885edae345ea489237442ebe3c8304 -706b9f915c400211b1c85c6ca6c11060 +6734d43389eded6e6ec04df0d0ac6a0c 4f72962320b42bab18deef783febd12b 6fe0eb8de0e5c45c09845bb8242fcb1c dacb01d46e370bb3bcc9574cd082f464 @@ -95,18 +95,18 @@ 68f0a32904f0ff877cb2c2820b38dc9b -083d2c1c63007a5a3487ec43bdd926d1 +00b0eb68f7ef07e9d614ae942f84e9a8 08194ccdf2c8801e9ce4acd3fc6a8829 -66a88729f0af41a466b40b1430f229f7 +422a9396b9040de1212afd253cc738aa 772b9a692d9998d6e7d8fd6e28ccb042 1f2562ebcb87267a49e9c8ec11f92d90 1e47fc4e62453875065109ef46259108 e8f85ee5f1ce535b1a6933f18ed09ba0 e047fd0ab0886550203c49269e7ad1ca 5f6244d1e0c7f706ccaed8c71240fc35 -4f7695bf300da817cbee7feffaa21508 +0b882db2159085006ffd37c772f7d8bf 10b05107d83798c17e2de027dfa923e6 fb72e6073af1b2f0763f9edfb4394d6c 942423fa65f36d20685e565e76434771 @@ -135,6 +135,7 @@ 90662aecd9eb51bf87b91f76d452381e 35b24d3c1592ad0e60c99c81a94be6b9 773f9a324037de24ba20edfa4f69099d +b791736af07760c81845b8fa160c6e39 858f4d351d6a865bccffef7fa262d99b 42b9d3d703feb637b4babe11190adb52 7f6bef974f62fb589b0c2d193750d714 @@ -142,7 +143,7 @@ 1ea47e3f2a830596d139ec65f559a508 2067170df6bc861d12d11a277986747a c1be7df4483ccc0e3b2ee08f977d911b -5f00bbdd645ef9bbf53ea25feeeac3f3 +15c0b5e011ee5e983f3f5c96db67d760 4489937620fe0ce4998a18b327a79cfa b447c8a39fa7d8217dfa5519af90e911 967aa7e79415181dfb2963777a90720d @@ -154,15 +155,15 @@ 41afb11aefb73a16398bd906a0201864 ef51c84433eab6197f43d0559f22fd4b -01cacadfbda4293ab21e779e06146085 +b2ee036efc506d6afd50dd7ac7ccc811 e79892f863bfba42a2658e43a2e8546b 978cfbff83d963db5c848161fc3ab286 69a64091740dccdfd8bd2f61df53fba3 dcce80148d3ea055836f7f38ab71f0c1 89a36b8dd5d33e53b92b491bc3edddfe 8b3806e68b169d4cd2c1320a5ab6fe8f -5abcc5736ddd1748f943313023e76de6 -937159f009bc845bd67dda6fc8c86b77 +3d6c42d646e2503f6a71b3618358f697 +46395deac9909d4a668bba6b94ee4c8a a08eb617d4122bc3972c2c04da32cb70 bf729609f42e090aed2a970401930e6d 2a6afbab650385179de02fe9205455d7 @@ -174,8 +175,8 @@ 2cf90126aba2b06f593f838a592ed66a 69be8c3d12533054535cbebb7d7efd07 0c89a620fdc2487c3cf242fa34acbfd6 -77a59143907052032b136e6883a0e1c2 -381ef356a676703edf225c3a56071002 +b3d4f333045789b87703c3c385194b0a +a5605b39b6125fc36ea7a6b083e30578 19e39ed2f2ac92ccec072d8d3d741104 0b3730d08a8d573f9195b07f58ccf09f 448ed84f8c692dae865030fdadfabb3e @@ -183,10 +184,10 @@ edcd9c936456f8945c9e05797b68a0c3 6ff462498bec936a81e4762d3fdbf31f 849d81f9f23ca9b07ea52367b4a666f5 -e549c764f41502093e349cd471306f3c +9af36af76afed9fe2efe0337be9ddf71 80f1b4396367b316403e0a81ae68c9ac cbafb5e0cfab93c9964b37d5c90b049c -f075b322db82ca5a1082e18033cea0f6 +c535a4a7b059b3963f5a5ddff9056faf a1ce81dd3436a5f87396dbc8213500d7 7b09d4f614806db46728a2fcf577f388 5343a79284c9127377a8827395d5b204 @@ -199,11 +200,11 @@ 0987559b12f37ae2490c1a5f5dd83076 32769f39902632408013c5860b088804 b3bf4266b0325db6ed8d9cd310cd2ef6 -a377699a88d8e920c8860ebb24aeacf2 -e62424215546778bde995edfa9692ca0 +4acbc9a5abb1a5d5afb9eaac8e18d34d +7e14eae5d5e6edcad2751240257a81f4 4bdf86d2111c1a361549dbb6523edb65 -105fea1b3cecab53fca1d10fde1a8823 -2887d01ae3349dff6c04d5902a5d6e5e +bc0db72496553e902eec64ef13a66b08 +8d97de9a3fac4e667f273bb41f920d93 6a605a7186f129ee54393898a6d9f4b0 5813003639fb8751dc574567dbf90989 114d8997f2920c105be850fc6ca8cdc1 @@ -253,7 +254,7 @@ 22cb27adf9a761ca0cb76e0e54b71890 3d9cc4ec66df38298e16365e009dfe66 26c66f78f5db62e9af07cb11280afc24 -368d57ca80f31c58192581ec7ca7f649 +9bba5c89e5dd034e4d6ddd1b19a8abd7 5c25310c78417e37fd75c8769e3c172f @@ -5349,64 +5350,108 @@ 3a316818411b5a80ef878dc5c8483950 -f4d6dda9a7e9a13fae9a0b5666a1af85 -26adcdd9610a48fcda8eddfd22fab072 -27f0f0c023d8775a7d970a0550caa3ef +3c06688411baa451d053f64eeccb1834 +bcb93bbeb8cf2831e49ff5541d277a1f +d306e9ad7b8b67464493c3281417afdc 6bb88a8a3d69511d1bf9e7af12ab5f47 -443543014f50021a6aab6e3dc45ed587 -a8231d248b1a221019ad16fdd605a9fd +2652ce7b4dcf00a1b07d8b1debedf867 +a1775d6ba3d8b76629dcdc2c1006048b +a874a391c41c223a007297af0fc82d71 0f6007361d5e4c8f34a2e83d402567b1 -b49ce165ab6bb7d90fd020bb3958ff1f -8ee3baf3211d960fc39e28c4e2a793c8 +a75033315ee90464410b47cc27ce9ff0 +bc1d75d2d4988d2ad9cac651bc44b8b3 +36cc4107f0d39d89b8031042c4159468 +8fd8e9a11cca513a4da0f25ff1a24149 +5af577705b43ce01285f2721a4850ac4 +2937220203e5a52762f5c9a4527e1988 +baadbf936466cfc106ae73e5f15dba89 +4fd59032d7c3a59fd45028bafa245721 191b3c2e856e750c06c0ba7987f902fb eb85dc872664c0769e9fab1b7540b4d5 -cc2cb448f60c5ecf61f6879aec325801 -d4836ebb5fa4e49eb36ba797c9f117e2 +17dfe118f580bc2a08e21e8104ef68eb +ad485022027867116de0bf6c25b1854a +5aeb1084e3a6ae5ef7ecc2bfc7a15592 +8702f5d6fbad08bf74378506ef376f83 +7596c070ac1bc839022e0a7aba2156ef +bcc98729a04598aecb86c451b91433ea +368af9ad30db4935e51b2109b9d4e9ca e0a7f23376f50de631db93814aff2e35 7ad3c70ef87d3657f918d3ee3649f31f -b2664e1ae97756c12114cb3371848ba2 +52b7639c5c4e35f33bb3c69cbfa0588d +a2a228f499608ddddeb2ba54834a5b7f c940b153fb6c5b3498efa181881b5b6c -fcc615d2a469180dd6a29ee6c04e866f -5a3660e46c91205c9203901c6b47cf8e +f9f9da534cce6a9124cc6b919329944b +287cb7bb6e6966708534cb9ed48d48ac +4775a411c20fe8fb13e9fb3a46629dc3 +9b2ce8f93949146d63dfef4d4784ad4c +18638db567f8b6fd7b1c6641ebf2c958 +463334491415afc3e56661e87196b4f8 +016527b52b6af2d6784fffeb23a2349b 2a315fa2593161154c319788f0ef2127 -544195d15ad41278307f99c79129ed72 -f163ef4cda9bb39f8abfcfcf2b683e0d +8b75ae7921f26b4f4b11d18ed921248e +7db990cc030127f1b64a4d3492f8f3e2 +afdcd64e0d7d78942401354d7f5f180d +51f6fe162641de3714866950d5eff4e8 +0a9d5e42c711a284436fa6f267e8ab85 +2c5e8a67d1a805aae9842bbad59a873f c22fdc8941f2956e0930b20105870468 +1f2386bedbebd633223278c1fd25109a +e0d060c7f70126e74c443b72ae560791 +20e28c8b386ddbb38ead777f717d7c44 96c6b586a6afb6d72dc8b93b30f844d5 -768d12956504372d4dcffea0f0bc2865 -39b329017c9d46eeb7f89f11e8540c96 -a01d7dccbd0a43d02a87035b60b5ca8c -8745faaac931fd3990eaad40b663a00d -82f254a1bc551aee1583bd6461b62cfe +351ce642d2008500c8780cce574acdb2 +fc1cb0e9030ce6b891319ce46dd8c434 +95bf00532c504c237041c4e3f04936a1 +bdf5ae55ea4d553beb785266dd0f9ffa +2894170c52a47ac02bf094bf047f1984 +fa8aa7a5c2077676637614809bc0ea0c +b8f1f393d7a247fdfe7668acf776e9d2 +35b71c6a8e678cdaa9d484ebab42c2ca +8f55434707b160cf1a8331d27e37e7e4 +4711cc4662b9136a881497c27b596135 +950310a6c12362b084a68b0cfa7f3373 +6ac17b4d7485fe73dd2d754ce2a0e2d9 +96fe7b1e5cd48c7332cf17b789f7af66 +02aac38356af65808e08e21f1ddd225d +bccc18d3b8c2b941ef7ef6602aab6c69 +de96058dc4fedbe4ccca03f9966ff743 3daad3713df02c15beebd09ceecacacd -0583253d3e49f14e3b6306fa788a6f66 -d0a111306e668d146a52e2299597888e -a722bf1cb509c0218c9b0d41386fdbbe +b8b582e30d3f3bd8867221dcc3dbf365 +75c68bb955477a99fc98600f5e1f40a3 +bf1c8fcdd3706774086cd133a6e04d45 +eee692f442eaec2b8291419a2017e50b +f9389202889738a0935be0d96f3aa609 +9b187fb3a908fb75b7b2a8573a4d13c4 c458a95a74915bb3e01102060bf3d27c -66a08a1e2a2405c7ad5affeca0f81b2f -4674617014723f062743145bd2952df7 +78fdf805f1cea6cd01912192821ec734 +34b9ef2cadf050ad58f391a7990c6975 +c0f60dd955a2bd3e6bace66eb362c9a5 +a5f3fbbef1831fe0bcd060edb6e5010b +c49883919b7912057b1ffad674a9c7c2 +99d8349acae8fcd95094364adf24dae2 +72b2fd6a41260897ef758436603d33a2 cacdbe68a428ae36151a3d1152b2b77b -1aa821a18b07bc7cba92552a372b8f9d -42f2f6e2122319a302b2769011897b2a -205fd4b7bc978688de8420087c161bcb +86c5b7ba9581a58bf6e465aea7d52e46 +3c4338d70de8c99a86b3ee15924172a1 +fb794db6e06fa3cf7479fc889894caf3 -0d24de61581243b069fb508efbc78a67 -561027d7adbd2358225866cba60568d2 +3abe66ba8da6b6bf9cf1c6b0e907d51d +9a29da1e201fb23de4f499adbb9f6a71 edd56d70cac390ef63feeef7e9d71b3f -75837274a0d67e19ee975aaef9e283ee +5f4ae32bd59400b8f788ac644b693ed2 8f83bbc144d70505672f82679546c72d -5c546b7f37191a754b6743a640c6a0cd +809d819fe86dc60509c0b39997fc0d4f 17bfd10e3232de9145f5b74a6ef6afac -bd2d14a110664154fc509e3d3f9421dd +67b77209f88a051d1a7dd39e6584212b b162a10416c2cba0be1ba5d979e19145 @@ -5756,8 +5801,13 @@ 93d0209adac1b1a2b4e3cf2173cf995a 20e95e9c16378e6ac4df49011220f904 + +778ee87bf2f490b2737b2575d6a8367d +36e0aff3d3354e60d6470d44c07d1760 +c6f393b8430b95f521554b427d675a68 + -4ad543978a9d6664dccfe0e58b428c5f +d2a5b87e5832c708a67b8718e6cb89bd 6bff9cf68d35e1f83c670731e270c91c f6b62af680035531c943bb9fe3f416a1 725a7d1d35aaa7deb29d8d7b68d5a7f9 @@ -5802,7 +5852,7 @@ 758456bd92e4f81e1fdff423d4f914ab -f80e903b3aef314dc7e173ba95324c56 +fc8213a4a5a98ee458ddacc6bdd363c4 edc900f68ee6af819ace6dc30b968d80 @@ -5814,7 +5864,7 @@ 69caa949b7e0f3137c6ce7482f38e0f8 -c234c6e7b71d97e977d881538fab1d5e +a040ae2fc7273f1761c0b6294465db86 a0fa0788291ee95ccb306b8aded3fce3 @@ -5837,7 +5887,7 @@ ac2861b424e2b7e30a532f37b33d6889 97bfaff0b5c453d074f05fef1fc4c3df 35433c33dbc3525adc99ba89816d3733 -45b742c58510d055adee01e93aa33ff3 +4aad58f34304117925aeb72dde0e16ec d41d8cd98f00b204e9800998ecf8427e @@ -5931,32 +5981,34 @@ af876c926d49c59376d8b6d642ce9f66 -b30fb8f9811c1fa4d96fb35456366a8d +2ba22b10ce887c66563fb062cab1d79c 5fa21d6616fd146640d8cb59d52fd6d2 -0425a56b168d7f707d31028ad6122c26 +62e1ab1273d5a8dba9003cf14e678f94 9f9e7fb20c0cfc32dd7879ea99bcb3a0 -fedfac2139ca74edbddaba770b52995e +9b6ecbb4d4ec11fe513ec2a724749201 d41d8cd98f00b204e9800998ecf8427e 5c09b3d75fcba736c3353468236e5338 688c47e56752db341e110657c4f6f4de -d6d72917df770c5f42763d5bafd71857 +6f0972a6d7681bb65406b323efa8c202 0a81d81144952f49baecb31cfc610fee -453d482e2c6217d080e4ba4ac382aff7 +85a44971ad662216ae35ee13cc448517 +3cfe3654b3fc16954d91d3968fe71e24 d41d8cd98f00b204e9800998ecf8427e -46ff31a1787666ae78665dcea6351800 +e4a89a0342afbc8771e9178a78677517 +0e38e1224840ed30469ccfc96cae5407 2e7c67c1f808b58e33a5d256c282f02f d41d8cd98f00b204e9800998ecf8427e -33d557efbd941e679c386377e63d949b +17cd44fc331db26f8a7eb438b6f83cd3 e122c4a3c7fd8e1814f52d447e2d1a87 @@ -5965,8 +6017,8 @@ 0ea32bda75dc7855fd061f23d129c35c -de6be0f3faeef94e762c4e1ea1def02d -f38b902b5ce63c83e6dc6ffe2f9cf0bb +c5afccdb1da5846e310db9f174201302 +ad942ced24fef3b0b541041a3ce20205 25b3ce6e2f12f227c4a1ac8db9fab357 @@ -5986,6 +6038,24 @@ d25255649d1fb417a7e7041ed86dc8c9 23a9fe711137f3cb4f06dd011d38c23b + +d41d8cd98f00b204e9800998ecf8427e +93f6a40587eabe04d03bd3e910a780c3 + + +9b2c6de73503cceb102e875a364f6626 +6c5d484bdf6d9ef4529adc17eb829766 +65e54e9e6458c353a92eeaafdb0d0022 + + +d41d8cd98f00b204e9800998ecf8427e +cff8400cdba7775f87330b11ec9a4a65 + + +8a6845f5a3f6180df651c1be45e24878 +bebba22e7a5fdb20a52dfcf1b64772a1 +477b247136b3b54b251d5257ed61ee19 + d41d8cd98f00b204e9800998ecf8427e 0ac7cc84f48f255d71c0be34442038c1 @@ -6000,7 +6070,7 @@ d41d8cd98f00b204e9800998ecf8427e 7d845e5c3c1ac2c7b1c49de0d7e1c7e9 -8d01e83c7ea6584ed8244fe84628bd7b +241877437e8750febbd662602dd0efcd abefa8f7d035ae87eb5b45b0c43843be @@ -6014,16 +6084,16 @@ a7a90ee73e8f7f25267dc0ed66b3d8aa -a7f47e13476c054174040b29f993c271 +c541711e1f2070a1cc8528e9991d7fed -3cf2e98145b2f736130d75ebce1998f2 +fb4334120f1d5c30e64da6c12d2c777f d41d8cd98f00b204e9800998ecf8427e 1d09e4bcc7c8b15b8870ee521b50f1f6 f94fa580d25989d4f7a0729699c794f4 -dcd7588470066bf274c070ea79bf0b3c +bdb60ef8622cea7e270534ffb78c9714 d41d8cd98f00b204e9800998ecf8427e @@ -6037,7 +6107,7 @@ d41d8cd98f00b204e9800998ecf8427e -c5b4ae74b2b2e938d18d6f91ae094157 +4cc2f72a3e23dd082248e7e1582b9cb1 502547de717912a19aca06ddd223995c 4c457d8c88e79b1bab6c830a9162e718 2395be35cede1fb715ef9a4e497300a0 @@ -6075,12 +6145,12 @@ d41d8cd98f00b204e9800998ecf8427e -8c73a6f5b6e511bc183fcf2b5c1f8783 +ff07e29c887a25d0261857b7bc9e1deb d41d8cd98f00b204e9800998ecf8427e 63a86b61d1158210eedd7055b3bfd935 -d9f10175f29b8f142255f95be2d07965 +dd4877a4d2778561d4ccdbdba4b8b76d 648275f02e4c1be714897110a9aae56c @@ -6097,9 +6167,9 @@ 2a452e950585fb39d94e41a414471df5 -4703a36c950de669ee918e763e014fe1 +4dfd0119f671aa86ba1405c9814b08b0 977109b651acad563d27a9f05efa820a -f0bd1599b002694c6ec351d6606921f4 +3fa0561c00883f627c54f080237ca03d d41d8cd98f00b204e9800998ecf8427e @@ -6112,9 +6182,9 @@ d41d8cd98f00b204e9800998ecf8427e 3e8b72640f3dd0117bde24b366b7a8f5 6a1a6da93f9c2d77d68c8edb90139899 -3285c87826c9621ebf4352cf2a3ee2a0 -8a1c4f997f37fb274bc58c905649c0e0 -2211e75d50ae16f94e147f2f05a85d91 +6f6227ce98c203851dcddd1f027a86d5 +4ae815a0b31e0c4b8b900b7da88ab8c1 +1806b43471d2254c540ce3ab52353877 d6e07b8cab924d1b1b4e7b467aad3e67 80c65c798aad65e52c21289ba4fc8db2 @@ -6152,29 +6222,29 @@ 926bd78111e0f27f638bb0705f92439b -8e16469fd236e9975f6a14a9e59c147c +7a998e3b11f1086c7953293442f3530a 37d695c0d624c79d4d5fa14dd131876e -040fcead42553050d648d53d01d642b6 +01ec301f4005d3565727c01ea5b63eb5 58e190fe5c72ba2cd4db99fd17aac7ac -212fcab202e934b30e6fcc7c5128ed3d -6a692cc606a48741b08fef765bdaec4c +a0668dc98834af718fd96f310c7f6003 +56db30e1de65b6fb81931cd4469be39b d41d8cd98f00b204e9800998ecf8427e 3d18b6afcda65c40d3e5b1565e0ae3f1 -0cde765c7d578d103c71dfc4197438c8 +091c302f41e52a36598a19df1860971f 4bac12077505462bd962adb666852966 -3ce4735205d14eef357f1fc90d655ece +22a2ab52185732bcafd64fbd4a68eea8 cc7d7a963ee9ef58ede0680241f53de1 ebb2e597917e22900853dfa300de88da d41d8cd98f00b204e9800998ecf8427e -5b69636b3ce9773a65a8750f65d31ee9 +2c6f884e37b89f861f19faba99009ecb 32df7d91f327cfdcd67d831f6e7535eb @@ -6297,10 +6367,11 @@ 1fce4641b42b1c6680093428f2ccada5 -f4306fe54c33047d10182d177f39b89f +255c511cf57d5c863564fd3ec0bae654 d41d8cd98f00b204e9800998ecf8427e 957b9030b18c319e7c1529a4ffc72b85 6b6851714ab5e4f9491c2500a26c8ceb +29dbab62db9356e1b3574520bf3fa8b6 6dee88d0cf667f9b940d2696690f6744 @@ -6314,24 +6385,27 @@ 5ef3117292cb272cb72190d67bda189d -25d6c35728da1df381db408e61137d98 +9e42ef4e51c3d0795c44215d8264acc4 ff890ffae74d79a90ade34016ffd241d 1e1d68cabdaa8e946ad786f083a114a1 080945adaf8304688ce778f8acc821fe a2546e7613e0c76e1c26692507f66836 8cc4b11d20b0e01eb7e7b7401c2f12c8 -190087a51700f34c1b861261d838a6cf +10740fb22bfc2ac1b339e9d784cb9c23 6cea8bdd89a385b695dda1279e3021fa -e48ba3cc3d7d8641f31fb4d1e1cce67a -fbe31176a2ece8671e34270b56ed9224 -cf7fe720eedb6cef5c6cb67feb5a31ea +c41cd25f077b172e0acff8f4e6830847 +ae990e59fea5de5b4483ff48d541723f +bd68e17f01cde910409d40075ec640bf 4aeaafb21fcc66d532de0612676423e5 b7c3b27785924f5b023754855bbe3177 -526b1578733967a53e9c7ea0d3687334 +537bb9602db6a018f9e12b2286bd26e6 9e2d3bb695cfcdfebe705c171aa299ec -d7f98378b22bf02d1e96caa8c354a518 +02e18a866ed73982a37672572da83321 60d139c55b1533b31a8fcd4150ac35ed -d02f3b80bd620e44b248b763a745c555 +cd235b4afb8a95d5975434d7526fd7d3 + + +a4a1f69d36f0c22e9eb2767ea3f0adbd d41d8cd98f00b204e9800998ecf8427e @@ -6341,11 +6415,11 @@ 6534c21938d98c00bad6449081c65979 42a382d9a7146ddbf4c31c3aa55d6623 7a69303716cb7dff3ae011d2202de8f8 -8c209ae5445bf45531c133034a243439 +9b9fe5839d3b4cdf2bd5bd8faae1206b b4987de205c69745a11bb3ca910cf99f -b9ef591e526bb7585e2e9e7224d9ce66 +61d3ec9976c54d1a116baee6582b4d8c 3beda9cd6565bab822fd85e21efcf733 @@ -6378,21 +6452,21 @@ 6648383dfcecce0fa8010ee26e19c029 10d80a81dab8b4b36bc477b7d06b2c89 d41d8cd98f00b204e9800998ecf8427e -bd966e5b800b4d63bc3884eb6c4dc944 +4c2e051a6a49ecd0ff1f82fe3c63118c f0e5ef9a4d74a8c802f1b67415f319a1 d67feaff91ea41dbdb614dce38ba542f 6a42f85c4852916c71548c179234aeef 0db78f95e23062feab46593d28704532 639d7ee6567e210b36ecae473c5ce5fd -14dcc1c1453ec2180a3bdc0cc53fc18d +f772672fe0aeee71dd5c6bfd8d14808e 2de8820df5ad2c53044c62ff4ad718b9 454ff3948173d81e3f0c7ac1b77fc91a 98b51504f52bc57c9d900d0fc1bdb4ab -84fca517a57320901e6f4d09aee570e5 -47fdbddb0716950e3754211aa67c8c43 +620414a7322b7ecf17e2644a9a3f80cb +9a92997f7f8d84b6ef1685765babe1e5 f01a62497c9a085386bdc7c1defae763 ea8f7edcca4e35f95a3f2b7eed940d90 -66809106d19298be518b4f947dc0f323 +7f6a63a8afc26cee7c61918fd7559f77 a14866ebe77e5755d7b9772210696e42 b28954162df69981caec0998d15b77cc 447cb865dedd025c82a0402a41d2253e @@ -6400,29 +6474,30 @@ 7b53b4073832d6097d69bdf50ccf5ba2 1b0a44d142ae00530558bf5a6562492d 6cbfa567b0f4153bbc7f74adfe6bb4d2 -b6f90f0325529e3a39ebe651d0f910e7 +efa61e935b3bddded6bf488f1c27109f 88379d7c5cf4379d141f0e277fc2d499 3c36fca38f15327101e2cc37493e60fa c3d1e1b3f31c8bc2c6ac7582205a85ab 2c4b8a901ebd2581714ea5b7db8ffd1b daff44759e4f9c193a667ed427ba5444 -29b823646e763c2e7a64098be3ba5130 +dd505607a04547e95b76e3821ae75568 +666a30d3eb073d969dae5b1f73fa7d2e f4d35924864fb87b787ab9a9925fb091 2cf0c82aa4ed8fa0e22c393b7f5ecee4 2cb5c8f2cf03c6df6d3b70394b454d1e c65c84d23e2a8ad950ca58a1a2ca90db 73aae48b832026e3d24c305f58743806 e7df06c253dee16873fac26b32670722 -d4ce19166b58327ea8fe72de57a8dd85 +0bb1fb4ad3250cc312d571055323db79 507d7fd927984729187a4891f616f37c ed773b5b64093d6017aecdf1ca79fef5 4b15299e9a1c837d8e32aafe9abb00d7 b418b86d6c9003364c5a060946082ccb 16f583734d76081ef1a4b44d1e0657a6 -4dd69e598e667405299c866a9277af26 -e07da2dad2151513bd8dcbfe29d43e3c +dcff719e866b3af9fd9555b5a5867d64 +e72a74aa70d48feb14c3a5fde6089fcc a239faf6b54526481abaffe15d1f594d -4b9010ae3ecbf6e792d3bfb687ea2ab7 +e28bd469ef1c049843bc41dbe0f84d66 fe33e132e503f32398fb9809fe51da85 4b85147a9ebfcb923038a17487822286 e639d0ea5fc52734d43abbba8262dbb0 @@ -6436,7 +6511,7 @@ d41d8cd98f00b204e9800998ecf8427e 80f54c48fa46d0aaa977e404035aadf5 febda7bf2f326668d1f627ea9f2230b1 -4e6602a9b00bab8fd936f4800a1014ec +4f695f9327d6b2361640731a09e99a33 fe8c6f4acebea37d34b626a537db0e29 90ffdb58422df4e942a1a90cf5225c11 f1a8c3f9d6af74c305810725f125691f @@ -6460,8 +6535,8 @@ 38da2f7fcc1f2fe80b87db53e8767282 51e003dd68580f4f37558726f8452b53 748938e5e5aadef1aef9a8b79362b1bc -e4a93615651fab4af7d9288cdcecc86e -6d73868eae09dc15710f4c71ea25d7a0 +0de6fae1b00ab6cd538ffeef40f045be +00de18319f0abfb4c50f76b60f3fa2e7 6b58f5c0cad8d233b94b0874a41e4c7d 9596a02e5898fe117ac4d2f080a1b3bf afee7ccb55d1420cc8e36da4657825d1 @@ -6469,7 +6544,7 @@ d2b5ecf5e328a75e984f342ec80a60e2 07e043e1c42a0fe90d2226eaacb013e2 4cd01a2e1b1d02f7bfaff7792fb45da9 -f12d4e2a7b8866e08c4635b6776c1b02 +81a2f4c5a6b5946b088aabf7f5e9404e ce24eb153015acfdeca2e5559cc41583 a969dd13ed2ab6f921564ecd22121515 c2ced639d9b476d69e952e110169346b @@ -6477,22 +6552,23 @@ 3e30f76aaabd46ad9759658b706af3f8 4d7e3a9cca8144dca5f184f23e63953a 60c540c4dfb653ef65e67a628645f590 -abb811eb8d79dbeb78f5e67711905618 -1653a3d486b7113e331b01813407091a +3c3312f639641a1e2f7d5eab79209b7f +604bdd7909398dc5d136d47f9fc4bf39 98ca2d412c720690b46b8bf566cf4fb5 a9d45ffd6281800146fcfb2e3ab90ab6 66b21a3ea2de0ae271e470c339c40d07 9bfcd5451fd684e35ed69b3912791a6c b416db3eacff1ad448692d14aadff327 -b37a46d1de1e9b957b33881225da36dd +c8f2877e5e9d05fde24a7c7059c145ed b0bd3479b483ba56d613a91242e0efdb 0bbc469b628cbc940ebdd59f2e218b6c e1ed3c24b7fa01be0254d5e6393237e5 0e5a8ff24a2f4bb98d5c6c732e57619a 811dbf5341b537fccdf98ff790cda72c d868ca6c92ed42be6d193a71b5ae5a7d -11709bdc16ba921e8fe3774a1c7aba5f +d3361d904c96677405ad3081d4bbfc4f 503104f81619bf8296bdd1893079765f +595325924223d40b0ea97c9df4ebfde4 aa7ebaddf8d815b3dfd1b3281f26de84 59519c8b2bd240bdfc50476ea344cf8a f68235c447fde10de92e0732d17258bd @@ -6502,7 +6578,7 @@ 3cfbb9ef9c493bf739d501114cbe798c 0d3a43a7afc190f34f52855f28a34e4f 48f9b2c134655de1b0f5f7d50f01b765 -b3c941e7ae9574a1330c98ce07aade9f +03f439fdc6137b29736006bd4bee8ec5 70c6fc7d08f3c562322c9f53273f1393 @@ -6547,7 +6623,7 @@ 8c78f30a301fd7c5092ed59d95f2f688 -db4b88a7cb7f2e983e9349a0564aa877 +841ebb62c8967f82132d6c19e372bdff f8bfc1daca01458dceb9aebc7ffb5ddf @@ -6578,10 +6654,12 @@ 79a20f938fb5d3f145447ae44db05477 f2a1930d9be82084b365ccc8819d8484 d41d8cd98f00b204e9800998ecf8427e +5468ba4d16d0e057cf45f0984a79ac2e 1de24508893015db0757ec63e74a8086 2ae8b7de36d0e4c3630977569bf93bd6 -7af81ecb2106b1ca78c310332a02c604 +050cbe3b9406a05a76f6a8d1c2fed6e6 2b19c3592fbed5e4bd96730f87af438c +69bb08052b60d7d59cbe0e6ff0e45089 de943e7a2b8a603c3ebc34507309a46d @@ -6603,7 +6681,7 @@ d41d8cd98f00b204e9800998ecf8427e 4553664f3a8bd058468c8fe3a6622db9 -86a595136563ba16d9b4fbb1cb97415c +7ffccecde85645232cd150f4ceb54f8d f0e4f84ac2849eef8c8da252f2a875fd fdc9f14617e70aba304986ff7e32811e @@ -6692,7 +6770,7 @@ 347df504c0b23da0ae91c9b5a344c1a2 d41d8cd98f00b204e9800998ecf8427e 9b301131818ad7072d10624d9fce65b8 -215929b6545fc8cfacbb7386e4cbedca +fd0799a717f127a9c48bcb11d33a4d72 d41d8cd98f00b204e9800998ecf8427e @@ -6717,7 +6795,7 @@ 80af429597316aca3852de474a686ff4 -391c970a033d0593a16fb904119818d7 +5a89df7d532fb5730ba5fa40e3fb4037 d41d8cd98f00b204e9800998ecf8427e @@ -6728,12 +6806,12 @@ 35063f32bb86ee8cd1460cc9b50460ba cc44ae6151419f24f801a399a8da8e9a -577a5a6dd151bcd7cf6d8fcbd70677e8 +1a4b02d31eef47e71fb394b5688cd663 d41d8cd98f00b204e9800998ecf8427e 6b8b8ce50599e40cb74603a883f5d49b -b6e05cae93872a350f3ca2352f15f6ea +2cce9a1d8bf4c822dda113e210bc4f6b d41d8cd98f00b204e9800998ecf8427e @@ -6764,11 +6842,11 @@ d41d8cd98f00b204e9800998ecf8427e -70b0380559e50123f150a6f30a4d6699 +be907e7e9b0ac5a24a34af01ec1c21a6 d41d8cd98f00b204e9800998ecf8427e -04876764536d2c0ff37e0f1c9035c639 +a64def4ba4a8a55272108f79d0667e39 3621a212806836a2b3ca23f601c1b670 b3f46a3f7cc553bcda255db88fd2309a @@ -6777,6 +6855,19 @@ 6bb3fb472a3ff31f31945a68bb806cde 29977b078710f6ebe992f5b534b7d897 e1efd5d8bc348da70c325a08fc8c37a8 + + +d175d0af5c450eb501bca361a275c309 +d41d8cd98f00b204e9800998ecf8427e +13e7a0e137341f5a38764ea645b425f8 + + +d41d8cd98f00b204e9800998ecf8427e +e4239be8b90a077f8afc116e683151c9 +751806f248816fea7429cc7c4132539b +ebf0a4412227a0b61ae52df0105d46fe + + 610022638254b2075ec4bba535c5fe37 @@ -6819,10 +6910,10 @@ d41d8cd98f00b204e9800998ecf8427e -6a04d0a55d694688b7a8e43c72f63891 +9f8ec55a2df1f58b2ebd299fae8a1c6d -5ba605e1b76e515803012ab67abe2e4a +bcc3831429d49ff3a32c645c64be2e0e 0276bf6040d05e80ab5f6c6910f6ddfc @@ -6837,10 +6928,10 @@ bea23817aaf13e638fc0e6d274b0a63f d41d8cd98f00b204e9800998ecf8427e 2f133b07231a558b4551cfe813b6dd92 -c304ed5cba54aec736b4550b472a1337 +ccba00148532ae0e30f6f1d082817c10 -36473125e09319a9870285bf7302b83e +83bd77075a70f4b3a661fb57a0f0212f d41d8cd98f00b204e9800998ecf8427e db3734d67e45bf4a5140fbb38effa947 @@ -6861,28 +6952,28 @@ d41d8cd98f00b204e9800998ecf8427e -bd77bec5b425c9fbc1a4830a3ccccaa6 +6be749cfe859aafce02b030d57362ad7 -60d1a2024e5d8c9d6cdc0c295a243652 +898b153724a1748b8ea360e0b94aba77 d41d8cd98f00b204e9800998ecf8427e d07b23771a6639fd5f6216da796ff343 -290e1eed5e28283e741bea66c30ec042 +b1328a661909e538f58d43197eac2a40 5cba7b9316b591829c756097ae0485cb d41d8cd98f00b204e9800998ecf8427e 1f669f066fd46b6c9ca05177e177ed23 -bef21989e641a45d0f362fcb97281341 +3c270b13f4a5b576799d30edf1b7061c 00b8f993b58e8278a8115fb82ba7db57 32cfbcb58d6ae71455e0c58f951f2849 -bbdf49461b8f7bfda4446af93641d362 +69db05aac79ae05729e3797abcc2f1d1 710958b3055ce271a53ebd4e6325eee4 @@ -6893,13 +6984,13 @@ d41d8cd98f00b204e9800998ecf8427e 4dfcdf4d3cb3af826834c1fbb852f513 -9ee40eca1f3111186855090e11978198 +08bd77ccf4ecfd2cccf23e9925909375 d787be1614e93a5b0dff651c2d1962b8 d41d8cd98f00b204e9800998ecf8427e fc2cd8f1b832bcd093d8f65cf48d6be1 -94d4a670a65a20356db9e332884b5b3e +eea69eebcbf32860db846f30a803b9e5 05afeb97327056d436d21d891b041057 @@ -6937,6 +7028,7 @@ e1e875671e566acb90ca03d16b7e63ed be1a34c1c77c5431dfcee9caaabcfd88 f71705be8958fd18f828eb64eb254202 +3be7925340a260d3ffccc912ede415b5 36602e78494c46c4704cc578d4fb90cd d0889baa672fc0c803bf11ba7f57f6b1 @@ -6956,7 +7048,7 @@ 1a47a847fe417086b3f0b8d467d35d1b b69b43bab30c28687680635f91a53017 311aab84570c363ed4ff7e5069f5d949 -fa7542a63fa8d175b25c6db3d460d8a2 +3f0df7430bd8ed69801318a62221f4b6 6ce7b2cb223fead83bb4294741e580e2 @@ -7001,8 +7093,8 @@ 6a4676f26cc4774608c53cd47ae76efa -5cdd42491af381a414bea885fb5c234a -8df084360e41bb5dcce4719ba16c4804 +3273ff24d482f29e015604a5a5190712 +6b13618c39c1ae78d6be5a9580a25daf a90e349b1dfda275772af8b109e8be6f @@ -7024,7 +7116,7 @@ d41d8cd98f00b204e9800998ecf8427e 86b05756ec73691d2b88e25bbce1e86a b123826d90b2ffa257bd9880c090a6ac -f454a5cbdd36bfd22d6240b85e503e3d +30a766af9cb25ef9be5c36d4823109f3 59d8e23aebde2396d3440271828f4e20 @@ -7068,7 +7160,7 @@ 1921a40ef2e203a9c7e33e33d8481630 -84c13b91d89d2ca2851e10c25a0cd166 +3bd4ca8f6d546fed7f45d59930fab106 3afe82801f5cd602354186397efe9210 @@ -7080,14 +7172,14 @@ 7d040a1858a6f1e8b3d8e7fc68b1b008 -2d1bc07a8c28954534f37204c02c33f5 +4515ffcb074f47a2d9a4af2766b074cb a267dd6d9a787dbaa95ee81e9812a81a d41d8cd98f00b204e9800998ecf8427e 90bc49dfe52d6be339781906352ddbdb b3586b44a75323dbf02f85aea44e25db -e4d79c5376e95d08abe328aefaee064f +d5cde2d518971a3d6bd1e682b7c42092 1699071ff4bb09210ac267d430c05352 @@ -7095,6 +7187,42 @@ 202fffca61e528efe134dd32a3a44c64 9db7bfe5fec55a085d9f0dec8717479c + +83e824012a7c92746e71afc022ecb636 + + +18df2d1590e825952abeb40304a9597a + + +596d7781222e476b027a59499fa2d92a +ffae59f2cf83f882b269e06e420602c3 +7dd46b8a806a7567c0a88a13fa4f905b + + +9b9b0157749548ed0fa38782aca9b1e1 +296f4be076bb584ea5779e3059648a53 + + +1b2ed3db48be32e106a6dd6351f324be +b1688c8a3bd5948865884f0eaf3a0251 + + +99bd91055f47d5a74f9c395d74fbab6c + + +74d1739c0d14cabc655cde37e2fb25a8 + + +81d6b2b51a9b495e2512ab0952fb3afa + + +3542838ab2e1d4ec2cdd98db328a247d +3645cf8b754a2925eb02025881aa3ffb + + +fd8e048c8923d556fd7ae7c5234ad474 +b9dce9a8342b0e0d203581e86770d28d + d9cb53a9d7329a35ccba6560d05ca39c @@ -7118,8 +7246,8 @@ 3b3a6cb8fed3de208bc9a97209fed209 -c4b52ea2075814429b8a00a486f74baf -3229eae002e5525f9b545644256aede8 +a42209411960f30b6b6e5e38bc560af4 +7855abdb54739fae3eb0ae1d5a18ecb2 583594a72118966d0ce436acbf5ab344 @@ -7132,10 +7260,10 @@ 1aaa761fff1db6880a873b2f7aba4769 -73b7987dbc53760d356ad398d8f31a6b +96ee353361cdd805d62109efa227f63d ffcd5053589c705062adeade31ce92f6 68dc3ea2cd9c6508a925df50fa011221 -95444b95d6bfbb4cc05bddb1fd2d430b +694616680b479a5a29cc4bcf08d2b0a9 deac83a4c0eda829eedb0f9136a1fae5 @@ -7204,9 +7332,8 @@ bda3f6f14b6ef2f298a116a9e5e4de47 d41d8cd98f00b204e9800998ecf8427e -14cf870bc89190b003d4b67d08399a82 9b4cf41fd9e3065e1849aff895a0999d -b9866ad3e2a12514c3062cf74a711f6e +b34de60c5a1ca8b6e1e0d1c614022e80 3b29a33fb5f50c27d39d0645b1d1d96b @@ -7221,50 +7348,51 @@ d41d8cd98f00b204e9800998ecf8427e -87a15a164f064663c4d567a67b877a14 +282d8a4bd07329456966b4a7a359ddc5 d41d8cd98f00b204e9800998ecf8427e -51b4e94e74766a82470e5ff6c5753cea +c0b5fb2dce5b0a621a8653d6db38785c 3d863d079d9ebd0a4d6450acbed047f3 -68ef70376e6452b0db41d188de3e7309 +2ff2dde238be1c2c76ff373412a78e9e d41d8cd98f00b204e9800998ecf8427e -583e353c57d884970f1753605d7ab749 +ec17764560eab22337e40b09dab7fa84 bc584ec274c28d5fd6bc06909523cb8d -447dafbb6d90617a37c7f8e9038d2d45 -5d709c9a142b17a1cd1439197ac62ff2 +db597412bbafac95b4df7c52007804d3 +0950ed07fcf3abc1d21340fcc9d51be9 +138f3da6669669416a9600e7bcf485ec -e01dc79eab31ca899f8bd155d989482e -9946885ee4e9044e9a3fab8e6bf4f0c1 -8574e2c0ea7292d815892d241b029a73 +bdabc11685cbe7bcd760143cc3431e3f +4b52f2ecd9144b4fc8cf9484c23157af +b0599b42b4a17c1d140801a1b2dbfcc1 0529ddc77e8c681c33c47b9b7687e810 faa2eda13c5607ace72e34e9c0966a0c b704dae630c7215138b1f90caf77b450 -285e61a9ffd5231adede10df1871ab5d -714867efd7c071524ee3b0b4667a3ddd -9477e6a93b94cf81c26b5cbcd7f7fd67 +5da52c371983bff1e44d50c00565aa5c +dc5cd8b4ba8b06cf2c836d35f5117a5a +4fb1cb61faf463c209fddd1bb0b3ff81 d41d8cd98f00b204e9800998ecf8427e -d2d4f3c4b03e226a2ae751d35adc84c7 -f60aa8f7e04400f4af3bab2ea21f3383 +b03a23d99ff8934ba5a850184a0b0d0c +c86ea16e4f10b94df31701289c00b4ab -9ad62e69014ff23f232dcc43859b6018 -c741e135218d1dbfbcc03a6a4e0271a9 -1960bfd361ca2e7b2582c1633c35b0a3 +0896aa5a8e5444e0bb03ae80c097e82d +dd5996e0d69cf32275d6870b55b56bfa +c7e4e70e698600098ac2c42e411db419 07fe07a999542e322404d77a30264169 -18296a04b5d36082d8afca4e449f1ee6 -87f5b2af13b175d47eca8a33bcc68005 +86aac7d09e8e3ac69c3279b861b80968 +93cad33fd939e06b959b63c019777d91 43cc87a6b84afe612af178e9c0945279 @@ -7321,7 +7449,7 @@ d41d8cd98f00b204e9800998ecf8427e 7bd2acd718a001933d1b9723411d4371 6288df74fb85f7c954c18bf614aafcd3 -845e63a81a5b8edfa079c2fec094d6e1 +aed3cd0e313e75338a46d0dc30bb718c 55cc97fa2026cc42b4771d975b45fedb @@ -7345,7 +7473,7 @@ d41d8cd98f00b204e9800998ecf8427e cbf93873197cf6bdd0e36cd66d2a87c8 -86da383df93404580615782f4265bcb8 +009c4b4f2f9ed03cb27e8a74b3839136 2758f3882de560e1d11d208959c0627e @@ -7364,27 +7492,26 @@ ab88360e0141e3ddb3c8be3ee745008b -099c61f85742fec38c0e6fedff80d7eb -f15cbc07a79882808b31c59831725260 -2f76a335578ef4412e9b3b4a222ccb08 +f81a579ee5ec1adcd1a1de6fce3cb5c8 +5aad4002fc93b2b92d994edbbf95c50b 6fe5e34cc37004b4342377afa27fe78e 65306d3a5faf1ede100f0b433e707aa9 d41d8cd98f00b204e9800998ecf8427e -5baae840658acdb066b3294b07d6ed63 -e2e322bda8e0a19f571796b5ca46a266 +d6814238960c3d3ae89a8748af2cd846 +1dc3d6a1dd909a8a58fe8eca47ead5ac 87ab6c05827eaa2db8236ca2c0262ead -04e84d93b6851156225d86b33bc68056 +1d878883bffeb35ff573a04d207a7938 748fa3c47dca5861db4a736455d0f981 -762d623e34cb8c1d8b575801543027c8 -e99a525c7011b5cc748b27040716cfd1 +b3cf8bd9552d63ecc9746ca05452bf2f +674268c96f941fc5a6cd52da5fb0fd43 abcdf41603da0d617bee025c713adb41 c7c981cbe885fadb6853ac3250aab799 b9a967a29731ccf78b3693d680e3790a -848ba012f7bb08ead96269cac742157a +4a04cfbfb8d5f124746c3e2cd8007186 ccf2ea9b4262741181a0cff7c620146c @@ -7409,7 +7536,7 @@ 76e6aec3a1262b7b199fd88ae651d049 -1d00dfe3dd378ed263a943b10148ffb6 +a3148c5d3f8b6a38cf976cc250985d9f 479aca46b8b848649e96c290319deff5 @@ -7432,9 +7559,9 @@ 4c3fefbce8919598e7f04618a3e54ea2 -03f893c7c0667770a66ed0fd11f1a710 +a63bc90ab57ab5555e882b8db7130b63 d41d8cd98f00b204e9800998ecf8427e -0d39677613072296fbda7f35c0ed9d70 +60a4cd8e106aecadb8d082876de57a25 d60fa512ab394825284751728195161c @@ -7444,10 +7571,10 @@ cf7beba0674c611eca3eb40103a9d56d -c61793fa62504e540c4c08fc387776f1 +be4909eb830f52517bb34572822210b6 d41d8cd98f00b204e9800998ecf8427e cf3df8807edf32bdf31d3d0d148cba77 -d93f9826f6e8ef4bc66e8a92ae30020e +1f61fc5521e5a125d27fce95bd4ae5dc 6d0f156645b7ce84c269ff3adb915803 @@ -7469,7 +7596,7 @@ 831e6575098342dfa342551494097a24 -062c91c56e9a1aacf0045ba9ef2d295c +c425f95f5b0e994be961e09520cde9b3 d6d047f9389cde6f11b9175ffda432ac @@ -7509,7 +7636,7 @@ af528677086b2c26806ac47af95d9d9d -fa82bbcd66e5d31ac2f43c52caaa4acc +43b599b8900f31fcd51d013ccac558b2 d41d8cd98f00b204e9800998ecf8427e @@ -7542,7 +7669,7 @@ fde1dac27ff95323136138883a8cb086 -020e671dfeaf92176c35766720c2b8ec +64e3aebc902234add5ddbc3714b778fc d41d8cd98f00b204e9800998ecf8427e @@ -7559,9 +7686,9 @@ b3c7a210b2be2599c7fe2af126eeb062 994337d7c14c76b4537aa2e748b48729 b77816831ef40cf1b79779e1ada51d8e -1b526413dd24dc7b5d6910cf07f3aa1a -319b65909579d3ec171265423a48e35e -d6a0e0fc84f08a62d144e63ccd0f798d +5446b7733bcb58774c487c717831a8f4 +dd0fa2140f5450e0f05d6555af374289 +ca4c5271c26dc0bd0f7537f2d4fe8d75 fe62c00b682dd677dbca4764d5f0fe97 @@ -7576,8 +7703,8 @@ 21055e6d625cd5dc3e805ededd1f350a -bcc15386db16f0050d01b4d80fe68dbd -d77e4af5d17f15fdfd920ec8fda7fc45 +aec47b386df0e0df628a1e31f109e998 +0f079eeaf763fe056f582fd3d821b216 95559609c47c88b112952073fb77410e b79674bb1410c34f6428a0e392318740 ee9a71add932db04def7fb3a6d8af20f @@ -7597,10 +7724,10 @@ ea1a3bd45013d291cafdce135ebbd13c -c78c359e1ac036fa9a991e635efbfac5 +5b0073ef255ade9c14c4d56a735c5684 221d0b581479c434f039e58da4718a8d a6f5b10b14e766e788351b506b6f6024 -48ac89c72e2794fbcbb1078e0fe7d9ba +f94ccfe8360d382460cf8aca0492b9a0 9423e6de63cf281df2bcda0892da0a88 c8506bcf84839f36e61a555912e7c31c 2e5082f8e6d7976945c0e8e951d5f261 @@ -7633,7 +7760,7 @@ bef639ba5d15fbe93aa7df26bf6c3a70 -32160cab79f75fc38ed26bb590037169 +70bd9741b82ec97e1e005663b8ee8671 d00dcd6a42cd0d91cbd5639c56a4b6a7 008656d6620cb1ef43935edc30fd2994 @@ -7641,15 +7768,15 @@ 7ab5486f4cec78b1c4d93a1df0d83b51 -8b9453a22ca4ec5cd5f504b0f3338238 +73644c7a9c7312b638a8de811c0f71b8 d41d8cd98f00b204e9800998ecf8427e -0e3fff0ddbce47ecce252c82a6e02fa7 +770001d8b9e70249a27cfc567e770219 f47f735ec8627b7b3e9ce6a5e1643d4c fff5ddf9542281c2d2568153781b4c73 16e1a29a5b79d4a3668b3a71ca3d86df -992dde85a7ee2f81661fd7a54abf7f89 +5aa861a485746b0cce73cee39a4eebc6 78a3befa9a3a9bdb40420e432352250b a42439ac674abe10958f58d747f7cde0 @@ -8029,19 +8156,19 @@ f1f34d8c0f864daa5e8ab56801027430 -b7454525aa100e079c56a92ef4866283 +831fe459f7d3606afc5482fbfbe85278 c3e50ad0d4c93692a2810e136ada70d7 ab274a62d5a3a8ab5f1e745725b83dfc c4e9cd5c18af616969894e4dceb95f97 462f3f2edf24c9118a0a6df7f00765fa -a7f112322d606a3807c6e4eff9bf9b1f +5b2e22d569f45024f23cd0f6c213ea86 90a76b121fb7fe4b51daad580591cc8c ef12ff29adae2685e120e58aa04e23bc bc8b10dd8cc1f841662dfdd87868197c 311cb7d4bf06cb181cfffb6e44ed5826 e1161971bb06488cabe9066c8e827741 -90086ae0090269082c6221cdaff54d9c -4573107d98f6599ed40b01012378fa81 +f7b4e392e8e49b03c37439ecd4210e83 +7528006b9faf6605713f4b2f19f19f17 3222e8667905ffdb07a756fa25a26bd9 c710e46b08ef99b41b5167db96309c81 f28164a5a95f0a8408bfa00f4a40680d @@ -8060,7 +8187,7 @@ 75fb4c310c4f0554d3ac9859d0c5b646 e337dc8e080a86ce2e187cf3a38d0b10 de30767cf0a5d454269ab9986fce13c0 -b84cc0bb32567be3d521af1a1d2b4cce +1c3f72b75a408faa2fd8b60944cc2533 34be9245428cb84ae31c992eb21f33d3 9eea13d3889d78fdbc614dea77011565 6f3b6f771da549d8e22263e795ddecaf @@ -8070,14 +8197,15 @@ fb5913e34a812d5fdf9e25b8ca8c9fb2 3c801db51ff672838b9306c63df460e0 51a8ed92619d4857e0eaddd369a14b38 -a4fcafdd9412d243c46e1b55d7911f2c +3687aa1cf5d5f099a8b746660efe601c 5f5e1f71ef91392a3edee6cdf5e03408 8cc192424d2a8a3a8439cf6c9e9c866d 228b0316d26bdd36e56a9158eea64ef6 59b195fcff4d3877045fee21c364d524 324f3b1c1afefe3296f76db472cbc9f6 -8d2578f24429a8c9863f267bd792fb16 -6ec9a9a11b06059192bcf4a71a34dd22 +4897fa688236216c771946add0f2564c +d01fdb1e6043fb26b049108da5e4df60 +d091b8b83cd5b9dfb948872eb9b9e4dc a171ba167ab22bbfd25e570f28bd8483 f0d89af2ab05f3af36e1a4edec69c7db 1a6980f79392b14b3a7e00db58f915ff @@ -9748,24 +9876,24 @@ be05aa1b12e3b558de747e470b5731c8 -c2f72a6d3ee9b7e45506ead106bc8f86 +65db64d894cf8b776148fc4324d16986 3262db34410c13ae4d777e263d779217 -d11569807aab1e77f9bcd96fe375bde9 +97af3c06de8fcf9955b0d09d7d2c7397 c08f79985fa33fe026ef475f840f87b1 -e61deb16dd6421608631ed5c1f671c6a -f71ca57649aece8045b66345a612e20a -48451fe44b83835898ec108b9d9bf866 +1a6a7ea85a76cb09bc7568856b7f9a28 +4a00c2ddb39f4e28db51f6d0f3283859 +385be3b28799de9f80d0ef46508efbdc 98fec0976eec22385c2b735cb80d7448 b7c27239e68ce6f51296820da50bfffa 60d670dc85d029ed1c3f63693d0d4288 186dbbf4b11a9684557157006bf2a232 -8e42376332e36c72edf33421d3f12bf8 -cb73d7bfbdae912945ec4d98c0d1ec9b +78663365fd9c3f521c456712bf1aaf17 +45ac46e656485f54c2e642c00ece251c cfc96587347a77604730af23372d747f -6b1538d4b9683808221f30ddad0414d8 +398d48fad9f224e2c8a811b7e63cfb5b f5f165bb15c6391fc12ebac3e0a0f3e6 555145f760c70cf34b190b7214e3b5cc -dd62bf79621c56e565feabc0b84574d0 +c4db7841d9ac141c2e07f986344cf10e 7508982db7d5e9e5c7fec3f096de32b0 aa86f6cb23c2ae8294bcbd6f2315e8ed c56f3ea358f24bb4e820768e948b416b @@ -9776,11 +9904,11 @@ 2da0a1995db50d0752d2e509a3bca37f 78f2edd4512d3859d13e1c90618932ff 10c2dcc555137e38039193ccedfc0cd3 -b0d093ebda261c4ac0a6bb982cfa41f0 +f3cb3a7da6c4a8e947856ce9a7529a90 418334153f5b6a5543f6cb5a28f3c82b -bac99d873d638b05891fda9f7c62d562 -021de63f1074cc73a6d83a3e83a5ae55 -c7f8ee7a8d27fb0d86b5386b8cd9a6f7 +c760d45b0959664fe5ef8f18e31cd4ae +d01ee19b9b423b0378dfb48c8a20b021 +914772c1d09c8268418beaafaf36313d 199dcc4ae427c0d0e5fbde6c0d2d2f99 57da58850de2f4591fc18e23473ba8ad 08fc6ae338f02d76f77339c8537012ba @@ -9799,8 +9927,8 @@ 7dcd96797a60b5e466e25990e534f588 1818aababec2539efc6cee74006d4d0c 16202ce23ad23f4f86fcbd0c5d16dea2 -83a5a0b9fdc95c8f1647075e8c63c00a -d95dd0afca51ee1616ffe9550cfc1f93 +2086b1a692e4c3cc5dbe6edbc87976d4 +8dcd21c1d37a27cc9a9f227a2b283388 87eae3bfbea127d8e90970cf3fe8a9a1 @@ -10153,8 +10281,9 @@ 9ff187bdce93767cf2f24dbb5b0a34c5 c04364a46b55ae75b65db731f040dbee 5437aca264069f35e46a3fc46f04c2d9 -438c872ca8fdb808934df640ad361350 +b00df950231dc8222d5a74855b0708b5 9d95d44e6045f242b1ad717ed35f195b +5f1f15ee0a4ecc70e93427b814af9489 cf750bc5baeb59198423a8ba9039fccf b50591f99fa324afaba5e4e1d15829f3 349416524f35254fa72144bc7e08f9a6 @@ -10188,15 +10317,16 @@ 1008cbc1e61ed90dfd79c57cd620c92b 46f6b55d98da9ef1ffec9b1d1a6125bd e4e03fc7d82d2da0126d8445f09f61c2 -7a0cedeb2e3c160aa33e736ebba6059e +03cdf6ba23e31c14abc2bb3a79b7472c fab14e1ece001f18e03308c4abd5d7b6 2bac51be88c59c5ee21511836859e221 0889424a15f7ae4d5147e680d379e3c0 b8357efaf2331cd36af04b80256e3181 5a0de7d0f34fd6f63ae32d20e0a32b9d a1fe9c904ea0bd6d6ea490b977432ffc -d98e38cacdacd9d7c74df773358d6e6f +f424ed5d8ad204b2ccfd39045ab44d3b 3bb797554b6eedd86f67a0c36e9918ec +89b6756ccb0d05b4191b704aafaf5803 9afb68804040e5f7d92d7c308b79f770 d7d2fd96c741b616945e848ade9f9539 7767ff394313f1229871b8ee58c26a99 @@ -10429,7 +10559,7 @@ 52517073ee32fd105af7fccfde018e29 -2fb346f0383dd975a301eca9a423c12a +ca1f6c3cde7a72fc33fa826f580ca872 d41d8cd98f00b204e9800998ecf8427e @@ -10440,17 +10570,17 @@ d41d8cd98f00b204e9800998ecf8427e -1ba9555290fac6190106a623ece3376f -3a9bf22080b7d3c4d3a154affe9d6095 +e4a286e635b8486ef952cd5e7c063272 +daa87eb4e5a5dec7a491a6313f9335c9 bdd80120aa3357c1ac276e8b2ffb81a6 -7cb5f8fa9f76dae5e107abfbc0e35d82 +720ce5f162f6879e42bd51a2e677966c 8326aa93734dd8035a04c12062e68ce4 d41d8cd98f00b204e9800998ecf8427e -a6eb7d29b6a4649096f384711efdf232 +529b00d17c929c47878ebeb1cf313267 099f9b1f56cae48a1b679ed282e3766d @@ -12286,6 +12416,7 @@ 2e0eb0e3d978cfc35b462a199aeded78 9e36c55b53a1b080066d9947a92d2ce3 9e36c55b53a1b080066d9947a92d2ce3 +8f120e35f8b6608fb34e38edf9a2687c a9e38adb81052e1178a2486de8a87c28 7389cc51b77b11b297ccce79048a1c7f 0474bee65715fc6918a92b668178be6c @@ -12350,7 +12481,7 @@ d41d8cd98f00b204e9800998ecf8427e -be5e2576e65fca0640a3e943edb7b4a2 +b7ac1e65cfb2226f71c4c585b87ef36d fd6a54cb5cf80f075d7687ad66dd2cb9 @@ -12368,20 +12499,20 @@ 11689e5722e4204b9d01e5e4483b92ef -cc97395704f8c817d0c92e81b4626429 +ba1182650ae38ce16735a2f783046f85 a20a84fb09238e216ab80d91674426b1 d41d8cd98f00b204e9800998ecf8427e 4b94e9ad89c520b4cc4ab986a1cfb5f8 -348ac1d0cc575dcee2a8bd3fe3da6096 +62867ac6e7f63524ba1bbd195e5504ef 96a92bc03a6ca67f39d363c36031dee7 db802ba04a77501799a7073600802c80 0e4f03114e8298dfc23bb94d0df5d390 5e1aea18f899b4a763a0291dcf1f2b90 -c6798747955c37d2da47a6753d831cf4 +f34e17319f0c0f4b26c44fed42091c3b eed35a94809263558ac663233eaa2f38 @@ -12390,44 +12521,153 @@ d41d8cd98f00b204e9800998ecf8427e -74d19c16439bec3b2eeabde4bb8b6b1d -15faab5d58a32bd40d3f163cfaf951b6 +2174cc25f7e4e713034396fa94be1c93 +8334218ca0707e5c27f28b6897c673e6 a1838ba6f718aeec0172bc6e9d90f4b6 -eb474eb2e1039037169aaacb91443c3e +1d1dd963b8dfb47170403042c4c86431 7770e9e8e3fb4b98bc149059c5bc9633 -7aece8343f1f3c70f617733955c2bce6 +b0fd3b28285996794ea374e10881da03 7b7cde9c324feeed6e94f50e1655ba40 3c77ad60389c5eaaa410ac4a176b3ab6 bdb99f4a1594eaf4923129f21035a88d 966129fc8b4d82883741779cf87ea57a -9c258004b01196601cc918cc09857b0a +a2252f5482460d20d054a1f7d36f4dbe + + +3064b1ab98d9562f84c353c586a36765 +4d843333d740ee7e132b9aba3ca84c79 + + +352318e7e91b1ea9e37097409c9907a4 + + +48e867f61a945a10e84ccc6b297b530d + + +decda684aa41b7e3d4c9cbd82c57bf16 + + +e85c36b02b54ca8575353e41a035ef98 + + +a9edd5331230715886153f1ac2535d10 +a76cbf5801d8a007cdf2b8d82534e922 +a7f9c53e667b559a168e9c669751b9b4 + + +09fd73462e6973de1e5b4d5ea13015f3 + + +c030f0ca220a0377d27db496ed8b5318 + + +4fbee2586602efafa0764319b427939f + + +2acaf08f39c54745ac076d2e907273a8 + + +628ed9cddef9a2221251063053805324 +1fa2e700c74403c7941380638b09d82c +75f02406119800a1604d0b579ef3e61b +4f45d10b5ee1f09cb3fe944a95d6862b +f2a7ed553bd2288e8618c2c270a904df + + +8e3e6864c5fc86e81a2fa2ab2a39c6cf + + +dc14015d4641c2ace184a65f28bbe2a8 + + +eb6922c389258f0bcdee9efd22fb92ce + + +8aa3a2b726bc259ba9d57cb66d1ebeee + + +569784a8bbe92385bb2e32740788ad5c +b31ffb415b0662026fc6b92c0f87953c + + +839af79be6bad3e0880427117aa63e1f + + +ced84ab2bf5bd9391ea24b6bc30e987d + + +1f34e4ab0ec69431bd6661f39e138684 + + +19399c45ec6fb7cd97adf8455d766818 +aee69fb06398d6982ddbd7a4c8462a50 +6802f7660d7b71d1684e3a0ad0472ad8 +5ace6d4ad483742bc7d0679a934ed312 + + +593cc9cb911cbd7433bc198d2e0ea7f5 +93c7eed93f34e0951873519d5c60df2b + + +d6051e8e91e3b9275fb3315c5f10bd4d +e4552f8e8c2cb90661b4d9693e13ba52 + + +a2621ad34bd5b20864c8cf669c3d8a93 +469ce28873bd63023d33e9738b52d92e +b98d1eb79425c7db97a6837942aa64f7 + + +8a6217da856e75f4de79612f74f12e9e + + +660ce536dc1d691a14b4cede3f8c25cc +7abe92af6f134fc8ab7b414ddfa9fdc3 +8a8f3a86b7714c89caddbe4bdc73af8f + + +1bf6a453a4d929acc0c868e4cf6bc083 +144997b030c9e8c99a686d3c8d17ead6 + + +7e9686417f83eab48e7d19d61b6a5f7f + + +060b91056472c88d12426eaddd919c41 +4a313ea27e6c40565d7381b271199751 +a911dbae66b9f63328e9033182ae455a + + +a9d6e5bf4ae47e75eacbee49bce7d945 +15a61b5570ae5be9f79bfd79f6ee6faa +df00595a449a2aa6ebd8e79c8aad37ee 9382e7efb69651b29045f2421d618717 0b959ec99ed9ee63f065c7d40454b9ec -ce4ff827937faf5800380ff9867324b5 +a7387351fcf1eaf404d6f7f41b178ca4 -be24a0530d2ce043c5f6df3e85e309b1 +2c0d16fc13d82dcc90011730fb8c32aa -dc472d539640920357d694745d5c7f9d +c660c836df813f50dfdfe793821cbb94 1ebef0db96238c1bd7372bea81b9761d 4a3747f8978a90ab4ed41be95c2f5695 4f9ad2e49a960637c6f48ee7c228ee0f 0e96616ba6ef78c2874b6c9fb9c10c7a -857ef0aa17df0f205806791dcd65427c -986e2f39e85074de9facf0ea7973f315 +9da09c907dca9a53fd16ba8b261e4f62 +6df215e0c6cc349308be769a25c4ce74 d41d8cd98f00b204e9800998ecf8427e From 1660c1c05bd72a2e9a8187b01ddd1c10e479c2f0 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 6 Mar 2015 01:30:46 +0100 Subject: [PATCH 258/287] Fix bug introduced with var_dump --- htdocs/core/db/mssql.class.php | 52 +++++++++++++++++----------------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/htdocs/core/db/mssql.class.php b/htdocs/core/db/mssql.class.php index e2d938da710..3523e21bdf0 100644 --- a/htdocs/core/db/mssql.class.php +++ b/htdocs/core/db/mssql.class.php @@ -237,10 +237,10 @@ class DoliDBMssql extends DoliDB $res=mssql_query('select @@TRANCOUNT'); $this->transaction_opened=mssql_result($res, 0, 0); - + if ($this->transaction_opened == 0) { - //return 1; //There is a mess with auto_commit and 'SET IMPLICIT_TRANSACTIONS ON' generate also a mess + //return 1; //There is a mess with auto_commit and 'SET IMPLICIT_TRANSACTIONS ON' generate also a mess $ret=mssql_query("SET IMPLICIT_TRANSACTIONS OFF;BEGIN TRANSACTION;",$this->db); if ($ret) { @@ -264,7 +264,7 @@ class DoliDBMssql extends DoliDB { $res=mssql_query('select @@TRANCOUNT'); $this->transaction_opened=mssql_result($res, 0, 0); - + if ($this->transaction_opened == 1) { //return 1; //There is a mess with auto_commit and 'SET IMPLICIT_TRANSACTION ON' generate also a mess @@ -296,7 +296,7 @@ class DoliDBMssql extends DoliDB { $res=mssql_query('select @@TRANCOUNT'); $this->transaction_opened=mssql_result($res, 0, 0); - + if ($this->transaction_opened == 1) { $ret=mssql_query("ROLLBACK TRANSACTION",$this->db); @@ -322,7 +322,7 @@ class DoliDBMssql extends DoliDB function query($query,$usesavepoint=0,$type='auto') { $query = trim($query); - + if (preg_match('/^--/',$query)) return true; // Conversion syntaxe MySql vers MSDE. @@ -331,7 +331,7 @@ class DoliDBMssql extends DoliDB $query = str_ireplace(", tms = tms", "", $query); $query=preg_replace("/([. ,\t(])(percent|file|public)([. ,=\t)])/","$1[$2]$3",$query); - + if ($type=="auto" || $type='dml') { $query=preg_replace('/AUTO_INCREMENT/i','IDENTITY',$query); @@ -339,7 +339,7 @@ class DoliDBMssql extends DoliDB $query=preg_replace('/float\((.*)\)/','numeric($1)',$query); $query=preg_replace('/([ \t])unsigned|IF NOT EXISTS[ \t]/i','$1',$query); $query=preg_replace('/([ \t])(MEDIUM|TINY|LONG){0,1}TEXT([ \t,])/i',"$1VARCHAR(MAX)$3",$query); - + $matches=array(); $original_query=''; if (preg_match('/ALTER TABLE\h+(\w+?)\h+ADD\h+(?:(UNIQUE)|INDEX)\h+(?:INDEX)?\h*(\w+?)\h*\((.+)\)/is', $query,$matches)) @@ -360,7 +360,7 @@ class DoliDBMssql extends DoliDB if ($query_comp) $query.=" WHERE ".implode(" AND ",$query_comp); } - } + } else { if (preg_match('/ALTER TABLE\h+(\w+?)\h+ADD\h+PRIMARY\h+KEY\h+(\w+?)\h*\((.+)\)/is', $query, $matches)) @@ -369,7 +369,7 @@ class DoliDBMssql extends DoliDB $query="ALTER TABLE [".$matches[1]."] ADD CONSTRAINT [".$matches[2]."] PRIMARY KEY CLUSTERED (".$matches[3].")"; } } - + } if ($type=="auto" || $type='ddl') @@ -384,13 +384,13 @@ class DoliDBMssql extends DoliDB // Supprimer l'instruction MySql $query = str_ireplace(" limit ".$number, "", $query); } - + $itemfound = stripos($query, " week("); if ($itemfound !== false) { // Recreer une requete sans instruction Mysql $positionMySql = stripos($query, " week("); $newquery = substr($query, 0, $positionMySql); - + // Recuperer la date passee en parametre $extractvalue = stristr($query, " week("); $extractvalue = substr($extractvalue, 6); @@ -398,7 +398,7 @@ class DoliDBMssql extends DoliDB // Conserver la fin de la requete $endofquery = substr($extractvalue, $positionMySql); $extractvalue = substr($extractvalue, 0, $positionMySql); - + // Remplacer l'instruction MySql en Sql Server // Inserer la date en parametre et le reste de la requete $query = $newquery." DATEPART(week, ".$extractvalue.$endofquery; @@ -407,11 +407,11 @@ class DoliDBMssql extends DoliDB { //var_dump($query); //var_dump($matches); - if (stripos($query,'llx_c_departements') !== false) var_dump($query); + //if (stripos($query,'llx_c_departements') !== false) var_dump($query); $sql='SET IDENTITY_INSERT ['.trim($matches[1]).'] ON;'; @mssql_query($sql, $this->db); $post_query='SET IDENTITY_INSERT ['.trim($matches[1]).'] OFF;'; - + } } //print ""; @@ -427,7 +427,7 @@ class DoliDBMssql extends DoliDB { $ret = mssql_query($query, $this->db); } - + if (!empty($post_query)) { @mssql_query($post_query, $this->db); @@ -732,13 +732,13 @@ class DoliDBMssql extends DoliDB //TODO: Check if we need to force a charset //$sql.= ' DEFAULT CHARACTER SET '.$charset.' DEFAULT COLLATE '.$collation; $ret=$this->query($sql); - + $this->select_db($database); $sql="CREATE USER [$owner] FOR LOGIN [$owner]"; mssql_query($sql,$this->db); $sql="ALTER ROLE [db_owner] ADD MEMBER [$owner]"; mssql_query($sql,$this->db); - + $sql="ALTER DATABASE [$database] SET ANSI_NULL_DEFAULT ON;"; @mssql_query($sql,$this->db); $sql="ALTER DATABASE [$database] SET ANSI_NULL ON;"; @@ -976,12 +976,12 @@ class DoliDBMssql extends DoliDB } $sql="SELECT name from sys.databases where name='".$dolibarr_main_db_name."'"; $ressql=$this->query($sql); - if (! $ressql) + if (! $ressql) { dol_syslog(get_class($this)."::DDLCreateUser sql=".$sql, LOG_WARNING); return -1; - } - else + } + else { if ($num) { @@ -1106,7 +1106,7 @@ class DoliDBMssql extends DoliDB return array(); } - + /** * Escape a field name according to escape's syntax * @@ -1116,18 +1116,18 @@ class DoliDBMssql extends DoliDB function EscapeFieldName($fieldname) { return "[".$fieldname."]"; } - - + + /** * Get information on field - * + * * @param string $table Table name which contains fields * @param mixed $fields String for one field or array of string for multiple field * @return boolean|multitype:object */ function GetFieldInformation($table,$fields) { $sql="SELECT * from INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='".$this->escape($table)."' AND COLUMN_NAME"; - if (is_array($fields)) + if (is_array($fields)) { $where=" IN ('".implode("','",$fields)."')"; } @@ -1144,7 +1144,7 @@ class DoliDBMssql extends DoliDB $result[]=$obj; } } - else + else return false; return $result; From 049174b76f02424cbbd7fa985a09ead6a788c2dd Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 6 Mar 2015 01:53:02 +0100 Subject: [PATCH 259/287] Fix bugs reported by https://scrutinizer-ci.com/g/Dolibarr/dolibarr/ --- htdocs/admin/fichinter.php | 2 +- htdocs/admin/security_file.php | 2 +- htdocs/contrat/document.php | 2 +- htdocs/core/class/commonobject.class.php | 24 ++++++++++++------------ 4 files changed, 15 insertions(+), 15 deletions(-) diff --git a/htdocs/admin/fichinter.php b/htdocs/admin/fichinter.php index 8965b225cfb..8e06e946dee 100644 --- a/htdocs/admin/fichinter.php +++ b/htdocs/admin/fichinter.php @@ -221,7 +221,7 @@ else if ($action == 'set_FICHINTER_DRAFT_WATERMARK') elseif ($action == 'set_FICHINTER_PRINT_PRODUCTS') { $val = GETPOST('FICHINTER_PRINT_PRODUCTS','alpha'); - $res = dolibarr_set_const($db, "FICHINTER_PRINT_PRODUCTS",($val == 'on'),'bool',0,'',$conf->entity); + $res = dolibarr_set_const($db, "FICHINTER_PRINT_PRODUCTS",($val == 'on' ? 1 : 0),'bool',0,'',$conf->entity); if (! $res > 0) $error++; diff --git a/htdocs/admin/security_file.php b/htdocs/admin/security_file.php index 4c0dd435634..d99db6ed638 100644 --- a/htdocs/admin/security_file.php +++ b/htdocs/admin/security_file.php @@ -208,7 +208,7 @@ $formfile->form_attach_new_file($_SERVER['PHP_SELF'], $langs->trans("FormToTestF // List of document $filearray=dol_dir_list($upload_dir, "files", 0, '', '', 'name', SORT_ASC, 1); -$formfile->list_of_documents($filearray, '', 'admin_temp', ''); +$formfile->list_of_documents($filearray, null, 'admin_temp', ''); llxFooter(); $db->close(); diff --git a/htdocs/contrat/document.php b/htdocs/contrat/document.php index 6c520105c36..49466c7fcb0 100644 --- a/htdocs/contrat/document.php +++ b/htdocs/contrat/document.php @@ -91,7 +91,7 @@ llxHeader(); if ($object->id) { - $head=contract_prepare_head($object, $user); + $head=contract_prepare_head($object); dol_fiche_head($head, 'documents', $langs->trans("Contract"), 0, 'contract'); diff --git a/htdocs/core/class/commonobject.class.php b/htdocs/core/class/commonobject.class.php index 3c5bb73d93e..8ad8ecd2331 100644 --- a/htdocs/core/class/commonobject.class.php +++ b/htdocs/core/class/commonobject.class.php @@ -888,7 +888,7 @@ abstract class CommonObject if (! $this->table_element) { - dol_print_error('',get_class($this)."::load_previous_next_ref was called on objet with property table_element not defined", LOG_ERR); + dol_print_error('',get_class($this)."::load_previous_next_ref was called on objet with property table_element not defined"); return -1; } @@ -2389,8 +2389,8 @@ abstract class CommonObject return 1; } } - - + + /** * Return incoterms informations * @@ -2409,13 +2409,13 @@ abstract class CommonObject $res = $this->db->fetch_object($result); $out .= $res->code; } - } - + } + $out .= ' - '.$this->location_incoterms; - + return $out; } - + /** * Return incoterms informations for pdf display * @@ -2430,12 +2430,12 @@ abstract class CommonObject $res = $this->db->fetch_object($resql); return 'Incoterm : '.$res->code.' - '.$this->location_incoterms; } - else + else { - return false; + return false; } } - + /** * Define incoterms values of current object * @@ -2457,14 +2457,14 @@ abstract class CommonObject { $this->fk_incoterms = $id_incoterm; $this->location_incoterms = $location; - + $sql = 'SELECT libelle FROM '.MAIN_DB_PREFIX.'c_incoterms WHERE rowid = '.(int) $this->fk_incoterms; $res = $this->db->query($sql); if ($res) { $obj = $this->db->fetch_object($res); $this->libelle_incoterms = $obj->libelle; - } + } return 1; } else From c7c7c393ee9db5dc52eadc5371c07b3f7067b59e Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 6 Mar 2015 02:14:59 +0100 Subject: [PATCH 260/287] sql syntax errors --- htdocs/install/mysql/migration/3.7.0-3.8.0.sql | 2 +- .../mysql/tables/llx_askpricesupplierdet_extrafields.sql | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/install/mysql/migration/3.7.0-3.8.0.sql b/htdocs/install/mysql/migration/3.7.0-3.8.0.sql index 3233022d3f9..2a36ef78737 100755 --- a/htdocs/install/mysql/migration/3.7.0-3.8.0.sql +++ b/htdocs/install/mysql/migration/3.7.0-3.8.0.sql @@ -316,7 +316,7 @@ CREATE TABLE llx_askpricesupplier_extrafields ( ) ENGINE=innodb; CREATE TABLE llx_askpricesupplierdet_extrafields ( - rowid integer AUTO_INCREMENT PRIMAR KEY, + rowid integer AUTO_INCREMENT PRIMARY KEY, tms timestamp, fk_object integer NOT NULL, import_key varchar(14) DEFAULT NULL diff --git a/htdocs/install/mysql/tables/llx_askpricesupplierdet_extrafields.sql b/htdocs/install/mysql/tables/llx_askpricesupplierdet_extrafields.sql index 6ecbcf83d2c..7bfab6e408c 100644 --- a/htdocs/install/mysql/tables/llx_askpricesupplierdet_extrafields.sql +++ b/htdocs/install/mysql/tables/llx_askpricesupplierdet_extrafields.sql @@ -16,7 +16,7 @@ -- ======================================================================== CREATE TABLE llx_askpricesupplierdet_extrafields ( - rowid integer AUTO_INCREMENT PRIMAR KEY, + rowid integer AUTO_INCREMENT PRIMARY KEY, tms timestamp, fk_object integer NOT NULL, import_key varchar(14) DEFAULT NULL From a0762a5113942f6b9a2f1dc39c915fec1022a78f Mon Sep 17 00:00:00 2001 From: Scrutinizer Auto-Fixer Date: Fri, 6 Mar 2015 01:31:49 +0000 Subject: [PATCH 261/287] Scrutinizer Auto-Fixes This commit consists of patches automatically generated for this project on https://scrutinizer-ci.com --- htdocs/admin/system/filecheck.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/admin/system/filecheck.php b/htdocs/admin/system/filecheck.php index 278aae8ea5b..8eff6821224 100644 --- a/htdocs/admin/system/filecheck.php +++ b/htdocs/admin/system/filecheck.php @@ -108,7 +108,7 @@ $db->close(); /** * Function to get list of updated or modified files * - * @param object $dir SimpleXMLElement of files to test + * @param SimpleXMLElement $dir SimpleXMLElement of files to test * @param string $path Path of file * @return array Array of filenames */ From 27e99793a373a7348ccf1185d051999f618f8782 Mon Sep 17 00:00:00 2001 From: Scrutinizer Auto-Fixer Date: Fri, 6 Mar 2015 02:10:01 +0000 Subject: [PATCH 262/287] Scrutinizer Auto-Fixes This commit consists of patches automatically generated for this project on https://scrutinizer-ci.com --- htdocs/core/class/commondocgenerator.class.php | 4 ++-- htdocs/core/class/cookie.class.php | 2 +- htdocs/core/class/html.form.class.php | 12 ++++++------ htdocs/core/class/html.formbank.class.php | 2 +- htdocs/core/class/html.formcron.class.php | 4 ++-- htdocs/core/class/html.formmailing.class.php | 2 +- htdocs/core/class/html.formother.class.php | 8 ++++---- htdocs/core/class/menu.class.php | 4 ++-- htdocs/core/class/mobiledetect.class.php | 8 ++++---- htdocs/core/class/openid.class.php | 14 +++++++------- htdocs/core/class/translate.class.php | 8 ++++---- htdocs/core/datepicker.php | 2 +- htdocs/core/db/mysql.class.php | 4 ++-- htdocs/core/db/mysqli.class.php | 6 +++--- htdocs/core/db/pgsql.class.php | 10 +++++----- htdocs/core/lib/json.lib.php | 2 +- .../askpricesupplier/modules_askpricesupplier.php | 4 ++-- htdocs/core/modules/commande/modules_commande.php | 4 ++-- htdocs/core/modules/contract/modules_contract.php | 4 ++-- htdocs/core/modules/dons/modules_don.php | 2 +- .../core/modules/expedition/modules_expedition.php | 4 ++-- .../expensereport/modules_expensereport.php | 4 ++-- htdocs/core/modules/export/modules_export.php | 2 +- htdocs/core/modules/facture/modules_facture.php | 4 ++-- htdocs/expedition/class/expeditionbatch.class.php | 4 ++-- 25 files changed, 62 insertions(+), 62 deletions(-) diff --git a/htdocs/core/class/commondocgenerator.class.php b/htdocs/core/class/commondocgenerator.class.php index b7f8e09677f..bf11c4fea13 100644 --- a/htdocs/core/class/commondocgenerator.class.php +++ b/htdocs/core/class/commondocgenerator.class.php @@ -206,7 +206,7 @@ abstract class CommonDocGenerator /** * Define array with couple subtitution key => subtitution value * - * @param Object $object contact + * @param Contact $object contact * @param Translate $outputlangs object for output * @param array_key $array_key Name of the key for return array * @return array of substitution key->code @@ -442,7 +442,7 @@ abstract class CommonDocGenerator /** * Define array with couple substitution key => substitution value * - * @param Object $object Main object to use as data source + * @param Expedition $object Main object to use as data source * @param Translate $outputlangs Lang object to use for output * @param array_key $array_key Name of the key for return array * @return array Array of substitution diff --git a/htdocs/core/class/cookie.class.php b/htdocs/core/class/cookie.class.php index bcca9fcfa73..150d52fae62 100644 --- a/htdocs/core/class/cookie.class.php +++ b/htdocs/core/class/cookie.class.php @@ -109,7 +109,7 @@ class DolCookie * * @param string $cookie Cookie name * @param string $value Cookie value - * @param string $expire Expiration + * @param integer $expire Expiration * @param string $path Path of cookie * @param string $domain Domain name * @param int $secure 0 or 1 diff --git a/htdocs/core/class/html.form.class.php b/htdocs/core/class/html.form.class.php index c5cdbc3f9e7..31fb095e3c8 100644 --- a/htdocs/core/class/html.form.class.php +++ b/htdocs/core/class/html.form.class.php @@ -480,7 +480,7 @@ class Form * @param string $selected Id or Code or Label of preselected country * @param string $htmlname Name of html select object * @param string $htmloption Options html on select object - * @param string $maxlength Max length for labels (0=no limit) + * @param integer $maxlength Max length for labels (0=no limit) * @return string HTML string with select */ function select_country($selected='',$htmlname='country_id',$htmloption='',$maxlength=0) @@ -658,7 +658,7 @@ class Form * @param string $htmlname Name of field in html form * @param int $showempty Add an empty field * @param int $hidetext Do not show label 'Type' before combo box (used only if there is at least 2 choices to select) - * @param string $forceall 1=Force to show products and services in combo list, whatever are activated modules, 0=No force, -1=Force none (and set hidden field to 'service') + * @param integer $forceall 1=Force to show products and services in combo list, whatever are activated modules, 0=No force, -1=Force none (and set hidden field to 'service') * @return void */ function select_type_of_lines($selected='',$htmlname='type',$showempty=0,$hidetext=0,$forceall=0) @@ -1072,9 +1072,9 @@ class Form * @param int $showempty 0=no empty value, 1=add an empty value * @param string $exclude List of contacts id to exclude * @param string $limitto Disable answers that are not id in this array list - * @param string $showfunction Add function into label + * @param integer $showfunction Add function into label * @param string $moreclass Add more class to class style - * @param string $showsoc Add company into label + * @param integer $showsoc Add company into label * @param int $forcecombo Force to use combo box * @param array $events Event options. Example: array(array('method'=>'getContacts', 'url'=>dol_buildpath('/core/ajax/contacts.php',1), 'htmlname'=>'contactid', 'params'=>array('add-customer-contact'=>'disabled'))) * @param bool $options_only Return options only (for ajax treatment) @@ -1095,10 +1095,10 @@ class Form * @param int $showempty 0=no empty value, 1=add an empty value, 2=add line 'Internal' (used by user edit) * @param string $exclude List of contacts id to exclude * @param string $limitto Disable answers that are not id in this array list - * @param string $showfunction Add function into label + * @param integer $showfunction Add function into label * @param string $moreclass Add more class to class style * @param bool $options_only Return options only (for ajax treatment) - * @param string $showsoc Add company into label + * @param integer $showsoc Add company into label * @param int $forcecombo Force to use combo box * @param array $events Event options. Example: array(array('method'=>'getContacts', 'url'=>dol_buildpath('/core/ajax/contacts.php',1), 'htmlname'=>'contactid', 'params'=>array('add-customer-contact'=>'disabled'))) * @return int <0 if KO, Nb of contact in list if OK diff --git a/htdocs/core/class/html.formbank.class.php b/htdocs/core/class/html.formbank.class.php index 12bff860a26..6335e25dd72 100644 --- a/htdocs/core/class/html.formbank.class.php +++ b/htdocs/core/class/html.formbank.class.php @@ -45,7 +45,7 @@ class FormBank /** * Retourne la liste des types de comptes financiers * - * @param string $selected Type pre-selectionne + * @param integer $selected Type pre-selectionne * @param string $htmlname Nom champ formulaire * @return void */ diff --git a/htdocs/core/class/html.formcron.class.php b/htdocs/core/class/html.formcron.class.php index 4de88a7bfc9..86c80413855 100644 --- a/htdocs/core/class/html.formcron.class.php +++ b/htdocs/core/class/html.formcron.class.php @@ -47,8 +47,8 @@ class FormCron extends Form * Display On Off selector * * @param string $htmlname Html control name - * @param string $selected selected value - * @param string $readonly Select is read only or not + * @param integer $selected selected value + * @param integer $readonly Select is read only or not * @return string HTML select field */ function select_typejob($htmlname,$selected=0,$readonly=0) diff --git a/htdocs/core/class/html.formmailing.class.php b/htdocs/core/class/html.formmailing.class.php index 98a76c84686..93fdac553a3 100644 --- a/htdocs/core/class/html.formmailing.class.php +++ b/htdocs/core/class/html.formmailing.class.php @@ -48,7 +48,7 @@ class FormMailing extends Form * * @param string $selectedid the selected id * @param string $htmlname name of controm - * @param number $show_empty show empty option + * @param integer $show_empty show empty option * @return string HTML select */ public function selectDestinariesStatus($selectedid='',$htmlname='dest_status', $show_empty=0) { diff --git a/htdocs/core/class/html.formother.class.php b/htdocs/core/class/html.formother.class.php index d418a32fd77..4ea60dbf2c1 100644 --- a/htdocs/core/class/html.formother.class.php +++ b/htdocs/core/class/html.formother.class.php @@ -157,7 +157,7 @@ class FormOther * * @param string $selected Preselected ecotaxes * @param string $htmlname Name of combo list - * @return void + * @return integer */ function select_ecotaxes($selected='',$htmlname='ecotaxe_id') { @@ -268,7 +268,7 @@ class FormOther /** * Return a HTML select list to select a percent * - * @param string $selected pourcentage pre-selectionne + * @param integer $selected pourcentage pre-selectionne * @param string $htmlname nom de la liste deroulante * @param int $disabled Disabled or not * @param int $increment increment value @@ -303,7 +303,7 @@ class FormOther * Return select list for categories (to use in form search selectors) * * @param int $type Type of categories (0=product, 1=suppliers, 2=customers, 3=members) - * @param string $selected Preselected value + * @param integer $selected Preselected value * @param string $htmlname Name of combo list * @param int $nocateg Show also an entry "Not categorized" * @return string Html combo list code @@ -834,7 +834,7 @@ class FormOther * @param int $offset Offset * @param int $invert Invert * @param string $option Option - * @return void + * @return string */ function selectyear($selected='',$htmlname='yearid',$useempty=0, $min_year=10, $max_year=5, $offset=0, $invert=0, $option='') { diff --git a/htdocs/core/class/menu.class.php b/htdocs/core/class/menu.class.php index 411158dea84..dff357d8f91 100644 --- a/htdocs/core/class/menu.class.php +++ b/htdocs/core/class/menu.class.php @@ -53,7 +53,7 @@ class Menu * * @param string $url Url to follow on click * @param string $titre Label of menu to add - * @param string $level Level of menu to add + * @param integer $level Level of menu to add * @param int $enabled Menu active or not (0=Not active, 1=Active, 2=Active but grey) * @param string $target Target lien * @param string $mainmenu Main menu ('home', 'companies', 'products', ...) @@ -71,7 +71,7 @@ class Menu * @param int $idafter Array key after which inserting new entry * @param string $url Url to follow on click * @param string $titre Label of menu to add - * @param string $level Level of menu to add + * @param integer $level Level of menu to add * @param int $enabled Menu active or not * @param string $target Target lien * @param string $mainmenu Main menu ('home', 'companies', 'products', ...) diff --git a/htdocs/core/class/mobiledetect.class.php b/htdocs/core/class/mobiledetect.class.php index 297058698aa..b04e0e98c91 100644 --- a/htdocs/core/class/mobiledetect.class.php +++ b/htdocs/core/class/mobiledetect.class.php @@ -687,7 +687,7 @@ class MobileDetect /** * Retrieve the User-Agent. * - * @return string|null The user agent if it's set. + * @return string The user agent if it's set. */ public function getUserAgent() { @@ -879,7 +879,7 @@ class MobileDetect * * @param string $name Name * @param array $arguments Arguments - * @return mixed + * @return null|boolean * * @throws BadMethodCallException when the method doesn't exist and doesn't start with 'is' * @method boolean is[...]() @@ -926,7 +926,7 @@ class MobileDetect * * @param string $key Key * @param string $userAgent deprecated - * @return mixed + * @return null|boolean */ protected function matchUAAgainstKey($key, $userAgent = null) { @@ -1009,7 +1009,7 @@ class MobileDetect * @param string $key key * @param string $userAgent deprecated * @param string $httpHeaders deprecated - * @return bool|int|null + * @return null|boolean * * @todo: The httpHeaders part is not yet used. */ diff --git a/htdocs/core/class/openid.class.php b/htdocs/core/class/openid.class.php index a5e01998ecd..d46481a0c60 100644 --- a/htdocs/core/class/openid.class.php +++ b/htdocs/core/class/openid.class.php @@ -150,7 +150,7 @@ class SimpleOpenID /** * GetIdentity * - * @return void + * @return string */ function GetIdentity() { // Get Identity @@ -187,7 +187,7 @@ class SimpleOpenID /** * IsError * - * @return void + * @return boolean */ function IsError() { @@ -225,7 +225,7 @@ class SimpleOpenID * OpenID_Standarize * * @param string $openid_identity Server - * @return void + * @return string */ function OpenID_Standarize($openid_identity = null) { @@ -251,7 +251,7 @@ class SimpleOpenID * array2url * * @param array $arr An array - * @return boolean|string false if KO, string of url if OK + * @return false|string false if KO, string of url if OK */ function array2url($arr) { // converts associated array to URL Query String @@ -303,7 +303,7 @@ class SimpleOpenID * @param string $url URL * @param string $method Method * @param string $params Params - * @return boolean|unknown + * @return string */ function CURL_Request($url, $method="GET", $params = "") { // Remember, SSL MUST BE SUPPORTED @@ -384,7 +384,7 @@ class SimpleOpenID /** * GetRedirectURL * - * @return void + * @return string */ function GetRedirectURL() { @@ -428,7 +428,7 @@ class SimpleOpenID /** * ValidateWithServer * - * @return void + * @return boolean */ function ValidateWithServer() { diff --git a/htdocs/core/class/translate.class.php b/htdocs/core/class/translate.class.php index 7347b065a79..0e55da2769a 100644 --- a/htdocs/core/class/translate.class.php +++ b/htdocs/core/class/translate.class.php @@ -153,7 +153,7 @@ class Translate * If $domain is "file@module" instead of "file" then we look for module lang file * in htdocs/custom/modules/mymodule/langs/code_CODE/file.lang * then in htdocs/module/langs/code_CODE/file.lang instead of htdocs/langs/code_CODE/file.lang - * @param string $alt 0 (try xx_ZZ then 1), 1 (try xx_XX then 2), 2 (try en_US) + * @param integer $alt 0 (try xx_ZZ then 1), 1 (try xx_XX then 2), 2 (try en_US) * @param int $stopafterdirection Stop when the DIRECTION tag is found (optimize speed) * @param int $forcelangdir To force a different lang directory * @return int <0 if KO, 0 if already loaded or loading not required, >0 if OK @@ -548,7 +548,7 @@ class Translate * Return list of all available languages * * @param string $langdir Directory to scan - * @param string $maxlength Max length for each value in combo box (will be truncated) + * @param integer $maxlength Max length for each value in combo box (will be truncated) * @param int $usecode Show code instead of country name for language variant * @return array List of languages */ @@ -583,7 +583,7 @@ class Translate * Return if a filename $filename exists for current language (or alternate language) * * @param string $filename Language filename to search - * @param string $searchalt Search also alernate language file + * @param integer $searchalt Search also alernate language file * @return boolean true if exists and readable */ function file_exists($filename,$searchalt=0) @@ -720,7 +720,7 @@ class Translate * Return a currency code into its symbol * * @param string $currency_code Currency code - * @param string $forceloadall 1=Force to load all currencies into cache. We know we need to use all of them. By default read and cache only required currency. + * @param integer $forceloadall 1=Force to load all currencies into cache. We know we need to use all of them. By default read and cache only required currency. * @return string Currency symbol encoded into UTF8 */ function getCurrencySymbol($currency_code, $forceloadall=0) diff --git a/htdocs/core/datepicker.php b/htdocs/core/datepicker.php index c1918ed6247..eae723946f6 100644 --- a/htdocs/core/datepicker.php +++ b/htdocs/core/datepicker.php @@ -122,7 +122,7 @@ print ''."\n"; * Convert date to timestamp * * @param string $mysqldate Date YYYMMDD - * @return timestamp Timestamp + * @return integer Timestamp */ function xyzToUnixTimestamp($mysqldate) { diff --git a/htdocs/core/db/mysql.class.php b/htdocs/core/db/mysql.class.php index bd3e77f37d5..64efc837bcd 100644 --- a/htdocs/core/db/mysql.class.php +++ b/htdocs/core/db/mysql.class.php @@ -183,7 +183,7 @@ class DoliDBMysql extends DoliDB * @param string $login login * @param string $passwd password * @param string $name name of database (not used for mysql, used for pgsql) - * @param string $port Port of database server + * @param integer $port Port of database server * @return resource Database access handler * @see close */ @@ -314,7 +314,7 @@ class DoliDBMysql extends DoliDB /** * Return datas as an array * - * @param Resultset $resultset Resultset of request + * @param resource $resultset Resultset of request * @return array Array */ function fetch_row($resultset) diff --git a/htdocs/core/db/mysqli.class.php b/htdocs/core/db/mysqli.class.php index cd692db677c..1126f6c8a57 100644 --- a/htdocs/core/db/mysqli.class.php +++ b/htdocs/core/db/mysqli.class.php @@ -186,7 +186,7 @@ class DoliDBMysqli extends DoliDB * @param string $login login * @param string $passwd password * @param string $name name of database (not used for mysql, used for pgsql) - * @param string $port Port of database server + * @param integer $port Port of database server * @return resource Database access handler * @see close */ @@ -317,7 +317,7 @@ class DoliDBMysqli extends DoliDB /** * Return datas as an array * - * @param Resultset $resultset Resultset of request + * @param resource $resultset Resultset of request * @return array Array */ function fetch_row($resultset) @@ -716,7 +716,7 @@ class DoliDBMysqli extends DoliDB * * @param string $table Name of table * @param string $field Optionnel : Name of field if we want description of field - * @return resultset Resultset x (x->Field, x->Type, ...) + * @return resource Resultset x (x->Field, x->Type, ...) */ function DDLDescTable($table,$field="") { diff --git a/htdocs/core/db/pgsql.class.php b/htdocs/core/db/pgsql.class.php index 94a2e5fa975..285bdc2cdef 100644 --- a/htdocs/core/db/pgsql.class.php +++ b/htdocs/core/db/pgsql.class.php @@ -368,7 +368,7 @@ class DoliDBPgsql extends DoliDB * @param string $login Login * @param string $passwd Password * @param string $name Name of database (not used for mysql, used for pgsql) - * @param string $port Port of database server + * @param integer $port Port of database server * @return resource Database access handler * @see close */ @@ -546,7 +546,7 @@ class DoliDBPgsql extends DoliDB /** * Return datas as an array * - * @param Resultset $resultset Resultset of request + * @param resource $resultset Resultset of request * @return array Array */ function fetch_array($resultset) @@ -559,7 +559,7 @@ class DoliDBPgsql extends DoliDB /** * Return datas as an array * - * @param Resultset $resultset Resultset of request + * @param resource $resultset Resultset of request * @return array Array */ function fetch_row($resultset) @@ -771,7 +771,7 @@ class DoliDBPgsql extends DoliDB * * @param string $fieldorvalue Field name or value to encrypt * @param int $withQuotes Return string with quotes - * @return return XXX(field) or XXX('value') or field or 'value' + * @return string XXX(field) or XXX('value') or field or 'value' */ function encrypt($fieldorvalue, $withQuotes=0) { @@ -1010,7 +1010,7 @@ class DoliDBPgsql extends DoliDB * * @param string $table Name of table * @param string $field Optionnel : Name of field if we want description of field - * @return resultset Resultset x (x->attname) + * @return resource Resultset x (x->attname) */ function DDLDescTable($table,$field="") { diff --git a/htdocs/core/lib/json.lib.php b/htdocs/core/lib/json.lib.php index 0d92233e62a..121e719bb6f 100644 --- a/htdocs/core/lib/json.lib.php +++ b/htdocs/core/lib/json.lib.php @@ -269,7 +269,7 @@ function dol_json_decode($json, $assoc=false) /** * Return text according to type * - * @param mixed $val Value to decode + * @param string $val Value to decode * @return string Formated value */ function _unval($val) diff --git a/htdocs/core/modules/askpricesupplier/modules_askpricesupplier.php b/htdocs/core/modules/askpricesupplier/modules_askpricesupplier.php index 1b0095308c8..4014452d8c2 100644 --- a/htdocs/core/modules/askpricesupplier/modules_askpricesupplier.php +++ b/htdocs/core/modules/askpricesupplier/modules_askpricesupplier.php @@ -43,7 +43,7 @@ abstract class ModelePDFAskPriceSupplier extends CommonDocGenerator * Return list of active generation modules * * @param DoliDB $db Database handler - * @param string $maxfilenamelength Max length of value to show + * @param integer $maxfilenamelength Max length of value to show * @return array List of templates */ static function liste_modeles($db,$maxfilenamelength=0) @@ -149,7 +149,7 @@ abstract class ModeleNumRefAskPriceSupplier * Create a document onto disk according to template module. * * @param DoliDB $db Database handler - * @param object $object Object askpricesupplier + * @param AskPriceSupplier $object Object askpricesupplier * @param string $modele Force model to use ('' to not force) * @param Translate $outputlangs Object langs to use for output * @param int $hidedetails Hide details of lines diff --git a/htdocs/core/modules/commande/modules_commande.php b/htdocs/core/modules/commande/modules_commande.php index 2caf1f905e6..9253f4dc650 100644 --- a/htdocs/core/modules/commande/modules_commande.php +++ b/htdocs/core/modules/commande/modules_commande.php @@ -45,7 +45,7 @@ abstract class ModelePDFCommandes extends CommonDocGenerator * Return list of active generation modules * * @param DoliDB $db Database handler - * @param string $maxfilenamelength Max length of value to show + * @param integer $maxfilenamelength Max length of value to show * @return array List of templates */ static function liste_modeles($db,$maxfilenamelength=0) @@ -153,7 +153,7 @@ abstract class ModeleNumRefCommandes * Create a document onto disk accordign to template module. * * @param DoliDB $db Database handler - * @param Object $object Object order + * @param Commande $object Object order * @param string $modele Force le modele a utiliser ('' to not force) * @param Translate $outputlangs objet lang a utiliser pour traduction * @param int $hidedetails Hide details of lines diff --git a/htdocs/core/modules/contract/modules_contract.php b/htdocs/core/modules/contract/modules_contract.php index 9ffd5d93881..d4311bf3028 100644 --- a/htdocs/core/modules/contract/modules_contract.php +++ b/htdocs/core/modules/contract/modules_contract.php @@ -44,7 +44,7 @@ abstract class ModelePDFContract extends CommonDocGenerator * Return list of active generation modules * * @param DoliDB $db Database handler - * @param string $maxfilenamelength Max length of value to show + * @param integer $maxfilenamelength Max length of value to show * @return array List of templates */ static function liste_modeles($db,$maxfilenamelength=0) @@ -148,7 +148,7 @@ class ModelNumRefContracts * Create a contract document on disk using template defined into CONTRACT_ADDON_PDF * * @param DoliDB $db objet base de donnee - * @param Object $object Object contract + * @param Contrat $object Object contract * @param string $modele force le modele a utiliser ('' par defaut) * @param Translate $outputlangs objet lang a utiliser pour traduction * @param int $hidedetails Hide details of lines diff --git a/htdocs/core/modules/dons/modules_don.php b/htdocs/core/modules/dons/modules_don.php index d676d2c6f70..8c894e7fa1f 100644 --- a/htdocs/core/modules/dons/modules_don.php +++ b/htdocs/core/modules/dons/modules_don.php @@ -40,7 +40,7 @@ abstract class ModeleDon extends CommonDocGenerator * Return list of active generation modules * * @param DoliDB $db Database handler - * @param string $maxfilenamelength Max length of value to show + * @param integer $maxfilenamelength Max length of value to show * @return array List of templates */ static function liste_modeles($db,$maxfilenamelength=0) diff --git a/htdocs/core/modules/expedition/modules_expedition.php b/htdocs/core/modules/expedition/modules_expedition.php index 43292ae95c4..d9205503e11 100644 --- a/htdocs/core/modules/expedition/modules_expedition.php +++ b/htdocs/core/modules/expedition/modules_expedition.php @@ -43,7 +43,7 @@ abstract class ModelePdfExpedition extends CommonDocGenerator * Return list of active generation modules * * @param DoliDB $db Database handler - * @param string $maxfilenamelength Max length of value to show + * @param integer $maxfilenamelength Max length of value to show * @return array List of templates */ static function liste_modeles($db,$maxfilenamelength=0) @@ -146,7 +146,7 @@ abstract class ModelNumRefExpedition * Cree un bon d'expedition sur disque * * @param DoliDB $db Objet base de donnee - * @param Object $object Object expedition + * @param Expedition $object Object expedition * @param string $modele Force le modele a utiliser ('' to not force) * @param Translate $outputlangs Objet lang a utiliser pour traduction * @return int <=0 if KO, >0 if OK diff --git a/htdocs/core/modules/expensereport/modules_expensereport.php b/htdocs/core/modules/expensereport/modules_expensereport.php index 3fa32af0fdf..5a6dcf29a34 100755 --- a/htdocs/core/modules/expensereport/modules_expensereport.php +++ b/htdocs/core/modules/expensereport/modules_expensereport.php @@ -30,7 +30,7 @@ class ModeleExpenseReport extends CommonDocGenerator * Return list of active generation modules * * @param DoliDB $db Database handler - * @param string $maxfilenamelength Max length of value to show + * @param integer $maxfilenamelength Max length of value to show * @return array List of templates */ static function liste_modeles($db,$maxfilenamelength=0) @@ -52,7 +52,7 @@ class ModeleExpenseReport extends CommonDocGenerator * expensereport_pdf_create * * @param DoliDB $db Database handler - * @param Object $object Object order + * @param ExpenseReport $object Object order * @param string $message Message * @param string $modele Force le modele a utiliser ('' to not force) * @param Translate $outputlangs objet lang a utiliser pour traduction diff --git a/htdocs/core/modules/export/modules_export.php b/htdocs/core/modules/export/modules_export.php index 62599016b3d..113f35299ca 100644 --- a/htdocs/core/modules/export/modules_export.php +++ b/htdocs/core/modules/export/modules_export.php @@ -43,7 +43,7 @@ class ModeleExports extends CommonDocGenerator // This class can't be abstrac * Load into memory list of available export format * * @param DoliDB $db Database handler - * @param string $maxfilenamelength Max length of value to show + * @param integer $maxfilenamelength Max length of value to show * @return array List of templates (same content than array this->driverlabel) */ function liste_modeles($db,$maxfilenamelength=0) diff --git a/htdocs/core/modules/facture/modules_facture.php b/htdocs/core/modules/facture/modules_facture.php index bca513e3fd6..2bf03edf557 100644 --- a/htdocs/core/modules/facture/modules_facture.php +++ b/htdocs/core/modules/facture/modules_facture.php @@ -43,7 +43,7 @@ abstract class ModelePDFFactures extends CommonDocGenerator * Return list of active generation modules * * @param DoliDB $db Database handler - * @param string $maxfilenamelength Max length of value to show + * @param integer $maxfilenamelength Max length of value to show * @return array List of templates */ static function liste_modeles($db,$maxfilenamelength=0) @@ -148,7 +148,7 @@ abstract class ModeleNumRefFactures * Create a document onto disk according to template module. * * @param DoliDB $db Database handler - * @param Object $object Object invoice + * @param Facture $object Object invoice * @param string $modele Force template to use ('' to not force) * @param Translate $outputlangs objet lang a utiliser pour traduction * @param int $hidedetails Hide details of lines diff --git a/htdocs/expedition/class/expeditionbatch.class.php b/htdocs/expedition/class/expeditionbatch.class.php index cc5726ed0c8..38fe5078d9e 100644 --- a/htdocs/expedition/class/expeditionbatch.class.php +++ b/htdocs/expedition/class/expeditionbatch.class.php @@ -147,7 +147,7 @@ class ExpeditionLineBatch extends CommonObject /** * Delete batch record attach to a shipment * - * @param object $db Database object + * @param DoliDB $db Database object * @param int $id_expedition rowid of shipment * @return int -1 if KO, 1 if OK */ @@ -172,7 +172,7 @@ class ExpeditionLineBatch extends CommonObject /** * Retrieve all batch number details link to a shipment line * - * @param object $db Database object + * @param DoliDB $db Database object * @param int $id_line_expdet id of shipment line * @return variant -1 if KO, array of ExpeditionLineBatch if OK */ From 77dd07c846e335869800b6e1e0f01ed6c7086e3c Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 6 Mar 2015 13:12:33 +0100 Subject: [PATCH 263/287] Fix thumbs generation --- htdocs/categories/class/categorie.class.php | 16 +++++++++----- htdocs/product/class/product.class.php | 24 +++++++++++++-------- 2 files changed, 26 insertions(+), 14 deletions(-) diff --git a/htdocs/categories/class/categorie.class.php b/htdocs/categories/class/categorie.class.php index f5828ecdea7..b9876bb8382 100644 --- a/htdocs/categories/class/categorie.class.php +++ b/htdocs/categories/class/categorie.class.php @@ -1330,17 +1330,23 @@ class Categorie extends CommonObject * Build thumb * * @param string $file Chemin du fichier d'origine - * @param int $maxWidth Largeur maximum que dois faire la miniature (160 par defaut) - * @param int $maxHeight Hauteur maximum que dois faire la miniature (120 par defaut) * @return void */ - function add_thumb($file, $maxWidth = 160, $maxHeight = 120) + function add_thumb($file) { - require_once DOL_DOCUMENT_ROOT .'/core/lib/images.lib.php'; + global $maxwidthsmall, $maxheightsmall, $maxwidthmini, $maxheightmini, $quality; + + require_once DOL_DOCUMENT_ROOT .'/core/lib/images.lib.php'; // This define also $maxwidthsmall, $quality, ... if (file_exists($file)) { - vignette($file,$maxWidth,$maxHeight); + // Create small thumbs for company (Ratio is near 16/9) + // Used on logon for example + $imgThumbSmall = vignette($file, $maxwidthsmall, $maxheightsmall, '_small', $quality); + + // Create mini thumbs for company (Ratio is near 16/9) + // Used on menu or for setup page for example + $imgThumbMini = vignette($file, $maxwidthmini, $maxheightmini, '_mini', $quality); } } diff --git a/htdocs/product/class/product.class.php b/htdocs/product/class/product.class.php index e26f9102544..653925701ad 100644 --- a/htdocs/product/class/product.class.php +++ b/htdocs/product/class/product.class.php @@ -3100,11 +3100,9 @@ class Product extends CommonObject * * @param string $sdir Target directory * @param string $file Array of file info of file to upload: array('name'=>..., 'tmp_name'=>...) - * @param int $maxWidth Largeur maximum que dois faire la miniature (160 by defaut) - * @param int $maxHeight Hauteur maximum que dois faire la miniature (120 by defaut) * @return int <0 if KO, >0 if OK */ - function add_photo($sdir, $file, $maxWidth = 160, $maxHeight = 120) + function add_photo($sdir, $file) { global $conf; @@ -3114,10 +3112,12 @@ class Product extends CommonObject $dir = $sdir; if (! empty($conf->global->PRODUCT_USE_OLD_PATH_FOR_PHOTO)) $dir .= '/'. get_exdir($this->id,2) . $this->id ."/photos"; + else $dir .= '/'.dol_sanitizeFileName($this->ref); dol_mkdir($dir); $dir_osencoded=$dir; + if (is_dir($dir_osencoded)) { $originImage = $dir . '/' . $file['name']; @@ -3128,7 +3128,7 @@ class Product extends CommonObject if (file_exists(dol_osencode($originImage))) { // Cree fichier en taille vignette - $this->add_thumb($originImage,$maxWidth,$maxHeight); + $this->add_thumb($originImage); } } @@ -3140,18 +3140,24 @@ class Product extends CommonObject * Build thumb * * @param string $file Chemin du fichier d'origine - * @param int $maxWidth Largeur maximum que dois faire la miniature (160 par defaut) - * @param int $maxHeight Hauteur maximum que dois faire la miniature (120 par defaut) * @return void */ - function add_thumb($file, $maxWidth = 160, $maxHeight = 120) + function add_thumb($file) { - require_once DOL_DOCUMENT_ROOT .'/core/lib/images.lib.php'; + global $maxwidthsmall, $maxheightsmall, $maxwidthmini, $maxheightmini, $quality; + + require_once DOL_DOCUMENT_ROOT .'/core/lib/images.lib.php'; // This define also $maxwidthsmall, $quality, ... $file_osencoded=dol_osencode($file); if (file_exists($file_osencoded)) { - vignette($file,$maxWidth,$maxHeight); + // Create small thumbs for company (Ratio is near 16/9) + // Used on logon for example + $imgThumbSmall = vignette($file, $maxwidthsmall, $maxheightsmall, '_small', $quality); + + // Create mini thumbs for company (Ratio is near 16/9) + // Used on menu or for setup page for example + $imgThumbMini = vignette($file, $maxwidthmini, $maxheightmini, '_mini', $quality); } } From a169b3348ee2d5249baccc0fadc8adeffd747c75 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 6 Mar 2015 14:36:22 +0100 Subject: [PATCH 264/287] Fix show alays date fields for contract module. Fix select of product were lost. --- htdocs/commande/card.php | 32 +++++++++++------------ htdocs/core/tpl/objectline_create.tpl.php | 22 +++++++--------- htdocs/fourn/commande/card.php | 6 ++--- htdocs/product/class/product.class.php | 4 +-- 4 files changed, 31 insertions(+), 33 deletions(-) diff --git a/htdocs/commande/card.php b/htdocs/commande/card.php index 12150f9a61e..27c333eec21 100644 --- a/htdocs/commande/card.php +++ b/htdocs/commande/card.php @@ -207,13 +207,13 @@ if (empty($reshook)) if ($datecommande == '') { setEventMessage($langs->trans('ErrorFieldRequired', $langs->transnoentities('Date')), 'errors'); $action = 'create'; - $error ++; + $error++; } if ($socid < 1) { setEventMessage($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("Customer")), 'errors'); $action = 'create'; - $error ++; + $error++; } if (! $error) { @@ -334,7 +334,7 @@ if (empty($reshook)) $result = $object->addline($desc, $lines [$i]->subprice, $lines [$i]->qty, $lines [$i]->tva_tx, $lines [$i]->localtax1_tx, $lines [$i]->localtax2_tx, $lines [$i]->fk_product, $lines [$i]->remise_percent, $lines [$i]->info_bits, $lines [$i]->fk_remise_except, 'HT', 0, $date_start, $date_end, $product_type, $lines [$i]->rang, $lines [$i]->special_code, $fk_parent_line, $lines [$i]->fk_fournprice, $lines [$i]->pa_ht, $label, $array_option); if ($result < 0) { - $error ++; + $error++; break; } @@ -349,14 +349,14 @@ if (empty($reshook)) $reshook = $hookmanager->executeHooks('createFrom', $parameters, $object, $action); // Note that $action and $object may have been // modified by hook if ($reshook < 0) - $error ++; + $error++; } else { setEventMessage($srcobject->error, 'errors'); - $error ++; + $error++; } } else { setEventMessage($object->error, 'errors'); - $error ++; + $error++; } } else { // Required extrafield left blank, error message already defined by setOptionalsFromPost() @@ -390,7 +390,7 @@ if (empty($reshook)) $result = $object->add_contact(GETPOST('contactid'), 'CUSTOMER', 'external'); if ($result < 0) { setEventMessage($langs->trans("ErrorFailedToAddContact"), 'errors'); - $error ++; + $error++; } } @@ -554,24 +554,24 @@ if (empty($reshook)) if (empty($idprod) && ($price_ht < 0) && ($qty < 0)) { setEventMessage($langs->trans('ErrorBothFieldCantBeNegative', $langs->transnoentitiesnoconv('UnitPriceHT'), $langs->transnoentitiesnoconv('Qty')), 'errors'); - $error ++; + $error++; } if (GETPOST('prod_entry_mode') == 'free' && empty($idprod) && GETPOST('type') < 0) { setEventMessage($langs->trans('ErrorFieldRequired', $langs->transnoentitiesnoconv('Type')), 'errors'); - $error ++; + $error++; } if (GETPOST('prod_entry_mode') == 'free' && empty($idprod) && (! ($price_ht >= 0) || $price_ht == '')) // Unit price can be 0 but not '' { setEventMessage($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("UnitPriceHT")), 'errors'); - $error ++; + $error++; } if ($qty == '') { setEventMessage($langs->trans('ErrorFieldRequired', $langs->transnoentitiesnoconv('Qty')), 'errors'); - $error ++; + $error++; } if (GETPOST('prod_entry_mode') == 'free' && empty($idprod) && empty($product_desc)) { setEventMessage($langs->trans('ErrorFieldRequired', $langs->transnoentitiesnoconv('Description')), 'errors'); - $error ++; + $error++; } if (! $error && ($qty >= 0) && (! empty($product_desc) || ! empty($idprod))) { @@ -826,7 +826,7 @@ if (empty($reshook)) if ($price_min && (price2num($pu_ht) * (1 - price2num(GETPOST('remise_percent')) / 100) < price2num($price_min))) { setEventMessage($langs->trans("CantBeLessThanMinPrice", price(price2num($price_min, 'MU'), 0, $langs, 0, 0, - 1, $conf->currency)), 'errors'); - $error ++; + $error++; } } else { $type = GETPOST('type'); @@ -835,7 +835,7 @@ if (empty($reshook)) // Check parameters if (GETPOST('type') < 0) { setEventMessage($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("Type")), 'errors'); - $error ++; + $error++; } } @@ -1137,10 +1137,10 @@ if (empty($reshook)) if (empty($reshook)) { $result = $object->insertExtraFields(); if ($result < 0) { - $error ++; + $error++; } } else if ($reshook < 0) - $error ++; + $error++; } if ($error) diff --git a/htdocs/core/tpl/objectline_create.tpl.php b/htdocs/core/tpl/objectline_create.tpl.php index 6037f6c77c9..e3f2431783f 100644 --- a/htdocs/core/tpl/objectline_create.tpl.php +++ b/htdocs/core/tpl/objectline_create.tpl.php @@ -153,12 +153,12 @@ else { if (empty($senderissupplier)) { - $form->select_produits('', 'idprod', $filtertype, $conf->product->limit_size, $buyer->price_level, 1, 2, '', 1, array(),$buyer->id); + $form->select_produits(GETPOST('idprod'), 'idprod', $filtertype, $conf->product->limit_size, $buyer->price_level, 1, 2, '', 1, array(),$buyer->id); } else { $ajaxoptions=array( - 'update' => array('qty'=>'qty','remise_percent' => 'discount'), // html id tag will be edited with which ajax json response key + 'update' => array('qty'=>'qty','remise_percent' => 'discount'), // html id tags that will be edited with which ajax json response key 'option_disabled' => 'addPredefinedProductButton', // html id to disable once select is done 'warning' => $langs->trans("NoPriceDefinedForThisSupplier") // translation of an error saved into var 'error' ); @@ -192,23 +192,16 @@ else {
service->enabled) && $dateSelector && GETPOST('type') != '0') +if ((! empty($conf->service->enabled) || ($object->element == 'contrat')) && $dateSelector && GETPOST('type') != '0') // We show date field if required { if(! empty($conf->global->MAIN_VIEW_LINE_NUMBER)) $colspan = 10; else $colspan = 9; @@ -493,6 +486,11 @@ jQuery(document).ready(function() { if (jQuery('#idprod').val() > 0) jQuery('#dp_desc').focus(); if (jQuery('#idprodfournprice').val() > 0) jQuery('#dp_desc').focus(); }); + + + setforpredef(); + + }); /* Function to set fields from choice */ diff --git a/htdocs/fourn/commande/card.php b/htdocs/fourn/commande/card.php index 7750250b00b..eefd5c961e2 100644 --- a/htdocs/fourn/commande/card.php +++ b/htdocs/fourn/commande/card.php @@ -251,7 +251,7 @@ if ($action == 'addline' && $user->rights->fournisseur->commande->creer) $idprod=0; $productsupplier = new ProductFournisseur($db); - if (GETPOST('idprodfournprice') == -1 || GETPOST('idprodfournprice') == '') $idprod=-2; // Same behaviour than with combolist. When not select idprodfournprice is now -2 (to avoid conflict with next action that may return -1) + if (GETPOST('idprodfournprice') == -1 || GETPOST('idprodfournprice') == '') $idprod=-99; // Same behaviour than with combolist. When not select idprodfournprice is now -99 (to avoid conflict with next action that may return -1, -2, ...) if (GETPOST('idprodfournprice') > 0) { @@ -294,12 +294,12 @@ if ($action == 'addline' && $user->rights->fournisseur->commande->creer) $date_end ); } - if ($idprod == -2 || $idprod == 0) + if ($idprod == 0 || $idprod == -99) { // Product not selected $error++; $langs->load("errors"); - setEventMessage($langs->trans("ErrorFieldRequired",$langs->transnoentitiesnoconv("ProductOrService")), 'errors'); + setEventMessage($langs->trans("ErrorFieldRequired",$langs->transnoentitiesnoconv("ProductOrService")).' '.$langs->trans("or").' '.$langs->trans("NoPriceDefinedForThisSupplier"), 'errors'); } if ($idprod == -1) { diff --git a/htdocs/product/class/product.class.php b/htdocs/product/class/product.class.php index 653925701ad..ac3d8e967a2 100644 --- a/htdocs/product/class/product.class.php +++ b/htdocs/product/class/product.class.php @@ -1229,14 +1229,14 @@ class Product extends CommonObject } else { - $this->error=$this->db->error(); + $this->error=$this->db->lasterror(); return -3; } } } else { - $this->error=$this->db->error(); + $this->error=$this->db->lasterror(); return -2; } } From e55a983c0373da451c4f4b07280afa82a0ecf0fa Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 6 Mar 2015 16:13:09 +0100 Subject: [PATCH 265/287] Fix td balance --- htdocs/fourn/commande/dispatch.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/fourn/commande/dispatch.php b/htdocs/fourn/commande/dispatch.php index a68f11f0f69..81c9e410c28 100644 --- a/htdocs/fourn/commande/dispatch.php +++ b/htdocs/fourn/commande/dispatch.php @@ -393,7 +393,7 @@ if ($id > 0 || ! empty($ref)) } else { - print '"; } From dd3f569ede8ee53737d0643a515dfd3a2084e934 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 6 Mar 2015 20:34:00 +0100 Subject: [PATCH 266/287] NEW: Enhance the natural_search function so we can use it to search numeric fields with criteria with operator <>= inside (< 100, >= 1000) --- htdocs/core/lib/functions.lib.php | 62 +++++++++++++++++++++++-------- 1 file changed, 46 insertions(+), 16 deletions(-) diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php index 438f0ee22ca..c5d8d509b08 100644 --- a/htdocs/core/lib/functions.lib.php +++ b/htdocs/core/lib/functions.lib.php @@ -4946,34 +4946,64 @@ function dol_getmypid() /** - * Natural search + * Generate natural SQL search string * - * @param mixed $fields String or array of strings filled with the fields names in the SQL query - * @param string $value The value to look for (example: "keyword1 keyword2") - * @return string $res The statement to append to the SQL query + * @param string|string[] $fields String or array of strings, filled with the name of fields in the SQL query + * @param string $value The value to look for. + * If param $numeric is 0, can contains several keywords separated with a space, like "keyword1 keyword2" = We want record field like keyword1 and field like keyword2 + * If param $numeric is 1, can contains an operator <>= like "<10" or ">=100.5 < 1000" + * @param string $number 0=value is list of keywords, 1=value is a numeric test + * @return string $res The statement to append to the SQL query */ -function natural_search($fields, $value) +function natural_search($fields, $value, $numeric=0) { - global $db; + global $db,$langs; + + if ($numeric) + { + $value=preg_replace('/([<>=]+)\s([0-9'.preg_quote($langs->trans("DecimalSeparator"),'/').'])/','\1\2',$value); // Clean string '< 10' into '<10' so we can the explode on space to get all tests to do + } $crits = explode(' ', $value); $res = ''; if (! is_array($fields)) $fields = array($fields); - $end = count($fields); + $nboffields = count($fields); $end2 = count($crits); $j = 0; - foreach ($crits as $crit) { - $i = 0; - foreach ($fields as $field) { - if ( $i > 0 && $i < $end) $res .= " OR "; - $res .= $field . " LIKE '%" . $db->escape(trim($crit)) . "%'"; + foreach ($crits as $crit) + { + $i = 0; $i2 = 0; + $newres = ''; + foreach ($fields as $field) + { + if ($numeric) + { + $operator='='; + $newcrit = preg_replace('/([<>=]+)/','',trim($crit)); + + preg_match('/([<>=]+)/',trim($crit), $reg); + if ($reg[1]) + { + $operator = $reg[1]; + } + if ($newcrit != '') + { + $newres .= ($i2 > 0 ? ' OR ' : '') . $field . ' '.$operator.' '.price2num($newcrit); + $i2++; // a criteria was added to string + } + } + else + { + $newres .= ($i2 > 0 ? ' OR ' : '') . $field . " LIKE '%" . $db->escape(trim($crit)) . "%'"; + $i2++; // a criteria was added to string + } $i++; } - if ($end > 1) $res .= ')'; - if ($j < $end2 - 1) $res .= " AND "; - if ($end > 1 && $j < $end2 - 1) $res .= '('; + if ($newres) $res = $res . ($res ? ' AND ' : '') . ($i2 > 1 ? '(' : '') .$newres . ($i2 > 1 ? ')' : ''); $j++; } - return " AND " . ($end > 1? '(' : '') . $res; + $res = " AND (" . $res . ")"; + //print 'xx'.$res.'yy'; + return $res; } From 9e4e9a54111ae543692a77d1eac08b58151bfac1 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 6 Mar 2015 20:59:18 +0100 Subject: [PATCH 267/287] NEW: Can search on customer order amount into customer order list. --- htdocs/comm/card.php | 2 +- htdocs/comm/propal/list.php | 10 +++++----- htdocs/commande/list.php | 18 ++++++++++++++---- htdocs/compta/facture.php | 4 ++-- htdocs/compta/facture/list.php | 16 ++++++++-------- htdocs/core/lib/functions.lib.php | 2 +- htdocs/fourn/commande/list.php | 14 +++++++------- htdocs/fourn/facture/list.php | 14 +++++++------- 8 files changed, 45 insertions(+), 35 deletions(-) diff --git a/htdocs/comm/card.php b/htdocs/comm/card.php index ffc01a998d5..78b786d2366 100644 --- a/htdocs/comm/card.php +++ b/htdocs/comm/card.php @@ -400,7 +400,7 @@ if ($id > 0) // display amount and link to unpaid bill $outstandigBills = $object->get_OutstandingBill(); if ($outstandigBills != 0) - print " / ".price($outstandigBills).''; + print " (".$langs->trans("CurrentOutstandingBill")." ".price($outstandigBills, '', $langs, 0, 0, -1, $conf->currency).')'; print ''; print ''; } diff --git a/htdocs/comm/propal/list.php b/htdocs/comm/propal/list.php index a3ef72bb6ca..da6e56c9460 100644 --- a/htdocs/comm/propal/list.php +++ b/htdocs/comm/propal/list.php @@ -182,9 +182,9 @@ if ($search_author) { $sql.= " AND u.login LIKE '%".$db->escape(trim($search_author))."%'"; } -if ($search_montant_ht) +if ($search_montant_ht != '') { - $sql.= " AND p.total_ht='".$db->escape(price2num(trim($search_montant_ht)))."'"; + $sql.= natural_search("p.total_ht", $search_montant_ht, 1); } if ($sall) { $sql .= natural_search(array('s.nom', 'p.note_private', 'p.note_public', 'pd.description'), $sall); @@ -316,12 +316,12 @@ if ($result) print ''; print ''; // Amount - print ''; // Author print ''; print ''; - print ''; + print ''; print '\n"; @@ -328,7 +337,8 @@ if ($resql) $generic_commande = new Commande($db); $generic_product = new Product($db); - while ($i < min($num,$limit)) { + while ($i < min($num,$limit)) + { $objp = $db->fetch_object($resql); $var=!$var; print ''; diff --git a/htdocs/compta/facture.php b/htdocs/compta/facture.php index 4cb696836bd..d38519bf6d5 100644 --- a/htdocs/compta/facture.php +++ b/htdocs/compta/facture.php @@ -1962,11 +1962,11 @@ if ($action == 'create') // Outstanding Bill $outstandigBills = $soc->get_OutstandingBill(); print ' (' . $langs->trans('CurrentOutstandingBill') . ': '; - print price($outstandigBills, '', $langs, 0, 0, - 1, $conf->currency); + print price($outstandigBills, '', $langs, 0, 0, -1, $conf->currency); if ($soc->outstanding_limit != '') { if ($outstandigBills > $soc->outstanding_limit) print img_warning($langs->trans("OutstandingBillReached")); - print ' / ' . price($soc->outstanding_limit); + print ' / ' . price($soc->outstanding_limit, '', $langs, 0, 0, -1, $conf->currency); } print ')'; print ''; diff --git a/htdocs/compta/facture/list.php b/htdocs/compta/facture/list.php index 56bd57c725a..dc081424ace 100644 --- a/htdocs/compta/facture/list.php +++ b/htdocs/compta/facture/list.php @@ -187,13 +187,13 @@ if ($search_societe) { $sql .= natural_search('s.nom', $search_societe); } -if ($search_montant_ht) +if ($search_montant_ht != '') { - $sql.= ' AND f.total = \''.$db->escape(price2num(trim($search_montant_ht))).'\''; + $sql.= natural_search('f.total', $search_montant_ht, 1); } -if ($search_montant_ttc) +if ($search_montant_ttc != '') { - $sql.= ' AND f.total_ttc = \''.$db->escape(price2num(trim($search_montant_ttc))).'\''; + $sql.= natural_search('f.total_ttc', $search_montant_ttc, 1); } if ($search_status != '') { @@ -263,8 +263,8 @@ if ($resql) 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_montant_ht) $param.='&search_montant_ht='.$search_montant_ht; - if ($search_montant_ttc) $param.='&search_montant_ttc='.$search_montant_ttc; + if ($search_montant_ht != '') $param.='&search_montant_ht='.$search_montant_ht; + if ($search_montant_ttc != '') $param.='&search_montant_ttc='.$search_montant_ttc; print_barre_liste($langs->trans('BillsCustomers').' '.($socid?' '.$soc->name:''),$page,$_SERVER["PHP_SELF"],$param,$sortfield,$sortorder,'',$num,$nbtotalofrecords); $i = 0; @@ -323,9 +323,9 @@ if ($resql) print ''; print ''; print ''; - print ''; + print ''; print ''; - print ''; + print ''; print ''; print ''; } print ''; - print ''; - print ''; + print ''; + print ''; print ''; print ''; print ''; } print ''; if (! empty($conf->stock->enabled)) { - print ''; + print ''; } else { From fc0be43f5f8e4d4ccb90077bddcd7501c6825220 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 6 Mar 2015 22:40:41 +0100 Subject: [PATCH 269/287] Fix: beautify search box --- htdocs/product/stats/commande.php | 8 +++++--- htdocs/product/stats/commande_fournisseur.php | 8 +++++--- htdocs/product/stats/facture.php | 4 +++- htdocs/product/stats/facture_fournisseur.php | 4 +++- htdocs/product/stats/propal.php | 4 +++- 5 files changed, 19 insertions(+), 9 deletions(-) diff --git a/htdocs/product/stats/commande.php b/htdocs/product/stats/commande.php index 2ae1dcd1582..49a443938ab 100644 --- a/htdocs/product/stats/commande.php +++ b/htdocs/product/stats/commande.php @@ -141,9 +141,9 @@ if ($id > 0 || ! empty($ref)) $sql.= " AND d.fk_commande = c.rowid"; $sql.= " AND d.fk_product =".$product->id; if (! empty($search_month)) - $sql.= ' AND MONTH(f.datef) IN (' . $search_month . ')'; + $sql.= ' AND MONTH(c.date_commande) IN (' . $search_month . ')'; if (! empty($search_year)) - $sql.= ' AND YEAR(f.datef) IN (' . $search_year . ')'; + $sql.= ' AND YEAR(c.date_commande) IN (' . $search_year . ')'; if (!$user->rights->societe->client->voir && !$socid) $sql.= " AND s.rowid = sc.fk_soc AND sc.fk_user = " .$user->id; if ($socid) $sql.= " AND c.fk_soc = ".$socid; $sql.= " ORDER BY $sortfield $sortorder "; @@ -189,12 +189,14 @@ if ($id > 0 || ! empty($ref)) print_barre_liste($langs->trans("CustomersOrders"),$page,$_SERVER["PHP_SELF"],"&id=$product->id",$sortfield,$sortorder,'',$num,$totalrecords,''); print '
'; - print $langs->trans('Period').'('.$langs->trans("DateInvoice") .') '; + print $langs->trans('Period').' ('.$langs->trans("OrderDate") .') - '; print $langs->trans('Month') . ': '; print $langs->trans('Year') . ':' . $formother->selectyear($search_year ? $search_year : - 1, 'search_year', 1, 20, 5); + print '
'; print ''; print ''; print '
'; + print '
'; $i = 0; print '
'.$langs->trans("Project").''.$langs->trans("PlannedWorkload").''.$langs->trans("ProgressDeclared").''.$langs->trans("TimeSpent").'
"; $projectstatic->id=$lines[$i]->fk_project; $projectstatic->ref=$lines[$i]->projectref; $projectstatic->public=$lines[$i]->public; $projectstatic->label=$langs->transnoentitiesnoconv("YourRole").': '.$projectsrole[$lines[$i]->fk_project]; + + $taskstatic->id=$lines[$i]->id; + + print "
"; print $projectstatic->getNomUrl(1); print "'; - $taskstatic->id=$lines[$i]->id; $taskstatic->ref=($lines[$i]->ref?$lines[$i]->ref:$lines[$i]->id); print $taskstatic->getNomUrl(1); print ''; + // $lines[$i]->duration is a denormalised field = summ of time spent by everybody for task. What we need is time consummed by user if ($lines[$i]->duration) { print ''; @@ -575,6 +584,13 @@ function projectLinesPerTime(&$inc, $parent, $lines, &$level, &$projectsrole, &$ else print '--:--'; print "'; + $tmptimespent=$taskstatic->getSummaryOfTimeSpent(); + if ($tmptimespent['total_duration']) print convertSecondToTime($tmptimespent['total_duration'],'allhourmin'); + else print '--:--'; + print "'; + print ''; $s=''; - $s.=$form->select_date('',$lines[$i]->id,0,0,2,"addtime",1,0,1,$disabledtask); - $s.='   '; - $s.=$form->select_duration($lines[$i]->id,'',$disabledtask,'text',0,1); + $s.=$form->select_date('',$lines[$i]->id,1,1,2,"addtime",1,0,1,$disabledtask); + print $s; + print ''; + //$s.='   '; + $s=$form->select_duration($lines[$i]->id.'duration','',$disabledtask,'text',0,1); $s.=' '; print $s; print ''; + // $lines[$i]->duration is a denormalised field = summ of time spent by everybody for task. What we need is time consummed by user if ($lines[$i]->duration) { print ''; @@ -724,7 +742,13 @@ function projectLinesPerDay(&$inc, $parent, $lines, &$level, &$projectsrole, &$t } else print '--:--'; print "'; + $tmptimespent=$taskstatic->getSummaryOfTimeSpent(); + if ($tmptimespent['total_duration']) print convertSecondToTime($tmptimespent['total_duration'],'allhourmin'); + else print '--:--'; + print "'.$langs->trans("RefTask").''.$langs->trans("LabelTask").''.$langs->trans("PlannedWorkload").''.$langs->trans("ProgressDeclared").''.$langs->trans("TimeSpent").''.$langs->trans("TimeSpent").''.$langs->trans("TimeSpentByYou").''.$langs->trans("TimeSpentByUser").'
'.$langs->trans("Total").''.$langs->trans("Total").'
 
 
 
'.$langs->trans("LabelTask").''.$langs->trans("PlannedWorkload").''.$langs->trans("ProgressDeclared").''.$langs->trans("TimeSpent").''.$langs->trans("NewTimeSpent").''.$langs->trans("TimeSpentByYou").''.$langs->trans("TimeSpentByUser").''.$langs->trans("DateAndHour").''.$langs->trans("Duration").'
'; - $newdate=dol_mktime(12,0,0,$_POST["timemonth"],$_POST["timeday"],$_POST["timeyear"]); - print $form->select_date($newdate,'time','','','',"timespent_date"); + //$newdate=dol_mktime(12,0,0,$_POST["timemonth"],$_POST["timeday"],$_POST["timeyear"]); + $newdate=''; + print $form->select_date($newdate,'time',1,1,2,"timespent_date"); print '
'; + print ''; if ($_GET['action'] == 'editline' && $_GET['lineid'] == $task_time->rowid) { - print $form->select_date($db->jdate($task_time->task_date),'timeline','','','',"timespent_date"); + print $form->select_date($db->jdate($date2?$date2:$date1),'timeline',1,1,2,"timespent_date"); } else { - print dol_print_date($db->jdate($task_time->task_date),'day'); + print dol_print_date($date2?$date2:$date1,($task_time->task_date_withhour?'dayhour':'day')); } print 'tva_assuj == "0") echo '0'; - else echo $form->load_tva('tva_tx', (isset($_POST["tva_tx"])?$_POST["tva_tx"]:-1), $seller, $buyer); - } + if ($seller->tva_assuj == "0") echo '0'; + else echo $form->load_tva('tva_tx', (isset($_POST["tva_tx"])?$_POST["tva_tx"]:-1), $seller, $buyer); ?> - "> - - "> - "> @@ -273,7 +266,7 @@ else {
'; + print ''; print $linktoprod; print "
 '; - print ''; + print ''; + print ''; print ''; - print ''; + print ''; print ''; $formpropal->selectProposalStatus($viewstatut,1); diff --git a/htdocs/commande/list.php b/htdocs/commande/list.php index 9d143d87eb2..c38b1a8e34f 100644 --- a/htdocs/commande/list.php +++ b/htdocs/commande/list.php @@ -51,6 +51,7 @@ $sall=GETPOST('sall'); $socid=GETPOST('socid','int'); $search_user=GETPOST('search_user','int'); $search_sale=GETPOST('search_sale','int'); +$search_total_ht=GETPOST('search_total_ht','alpha'); // Security check $id = (GETPOST('orderid')?GETPOST('orderid'):GETPOST('id','int')); @@ -79,6 +80,7 @@ if (GETPOST("button_removefilter_x") || GETPOST("button_removefilter")) // Both $search_ref=''; $search_ref_customer=''; $search_company=''; + $search_total_ht=''; $orderyear=''; $ordermonth=''; $deliverymonth=''; @@ -96,6 +98,7 @@ $parameters=array('socid'=>$socid); $reshook=$hookmanager->executeHooks('doActions',$parameters,$object,$action); // Note that $action and $object may have been modified by some hook if ($reshook < 0) setEventMessages($hookmanager->error, $hookmanager->errors, 'errors'); + /* * View */ @@ -198,7 +201,10 @@ if ($search_user > 0) { $sql.= " AND ec.fk_c_type_contact = tc.rowid AND tc.element='commande' AND tc.source='internal' AND ec.element_id = c.rowid AND ec.fk_socpeople = ".$search_user; } - +if ($search_total_ht != '') +{ + $sql.= natural_search('c.total_ht', $search_total_ht, 1); +} $sql.= ' ORDER BY '.$sortfield.' '.$sortorder; $nbtotalofrecords = 0; @@ -252,7 +258,8 @@ if ($resql) if ($search_ref_customer) $param.='&search_ref_customer='.$search_ref_customer; if ($search_user > 0) $param.='&search_user='.$search_user; if ($search_sale > 0) $param.='&search_sale='.$search_sale; - + if ($search_total_ht != '') $param.='&search_total_ht='.$search_total_ht; + $num = $db->num_rows($resql); print_barre_liste($title, $page,$_SERVER["PHP_SELF"],$param,$sortfield,$sortorder,'',$num,$nbtotalofrecords); $i = 0; @@ -316,7 +323,9 @@ if ($resql) print ''; $formother->select_year($deliveryyear?$deliveryyear:-1,'deliveryyear',1, 20, 5); print ' '; + print ''; + print ''; print ''; print "
   '; print ''; diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php index c5d8d509b08..509f237b0d6 100644 --- a/htdocs/core/lib/functions.lib.php +++ b/htdocs/core/lib/functions.lib.php @@ -4961,7 +4961,7 @@ function natural_search($fields, $value, $numeric=0) if ($numeric) { - $value=preg_replace('/([<>=]+)\s([0-9'.preg_quote($langs->trans("DecimalSeparator"),'/').'])/','\1\2',$value); // Clean string '< 10' into '<10' so we can the explode on space to get all tests to do + $value=preg_replace('/([<>=]+)\s([0-9'.preg_quote($langs->trans("DecimalSeparator"),'/').'\-])/','\1\2',$value); // Clean string '< 10' into '<10' so we can the explode on space to get all tests to do } $crits = explode(' ', $value); $res = ''; diff --git a/htdocs/fourn/commande/list.php b/htdocs/fourn/commande/list.php index 613eb463366..6926997f0f1 100644 --- a/htdocs/fourn/commande/list.php +++ b/htdocs/fourn/commande/list.php @@ -100,7 +100,7 @@ $offset = $conf->liste_limit * $page ; /* - * Mode Liste + * Mode list */ $sql = "SELECT s.rowid as socid, s.nom as name, cf.date_commande as dc,"; @@ -130,13 +130,13 @@ if ($search_user) { $sql.= " AND u.login LIKE '%".$db->escape($search_user)."%'"; } -if ($search_ht) +if ($search_ht != '') { - $sql .= " AND cf.total_ht = '".$db->escape(price2num($search_ht))."'"; + $sql .= natural_search("cf.total_ht",$search_ht, 1); } -if ($search_ttc) +if ($search_ttc != '') { - $sql .= " AND cf.total_ttc = '".$db->escape(price2num($search_ttc))."'"; + $sql .= natural_search("cf.total_ttc", $search_ttc, 1); } if ($sall) { @@ -214,8 +214,8 @@ if ($resql) print '  '; diff --git a/htdocs/fourn/facture/list.php b/htdocs/fourn/facture/list.php index d59870d8fc5..66ad20e4c05 100644 --- a/htdocs/fourn/facture/list.php +++ b/htdocs/fourn/facture/list.php @@ -153,7 +153,7 @@ 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) +if ($search_ref_supplier) { $sql .= natural_search('fac.ref_supplier', $search_ref_supplier); } @@ -178,14 +178,14 @@ if ($search_company) $sql .= natural_search('s.nom', $search_company); } -if ($search_amount_no_tax) +if ($search_amount_no_tax != '') { - $sql .= " AND fac.total_ht = '".$db->escape(price2num($search_amount_no_tax))."'"; + $sql .= natural_search('fac.total_ht', $search_amount_no_tax, 1); } -if ($search_amount_all_tax) +if ($search_amount_all_tax != '') { - $sql .= " AND fac.total_ttc = '".$db->escape(price2num($search_amount_all_tax))."'"; + $sql .= natural_search('fac.total_ttc', $search_amount_all_tax, 1); } $nbtotalofrecords = 0; @@ -270,9 +270,9 @@ if ($resql) print ''; - print ''; + print ''; print ''; - print ''; + print ''; print ''; $liststatus=array('paye:0'=>$langs->trans("Unpaid"), 'paye:1'=>$langs->trans("Paid")); print $form->selectarray('filtre', $liststatus, $filter, 1); From c80007c6801840bc0cb2ba2179be92d922c19f08 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 6 Mar 2015 21:57:58 +0100 Subject: [PATCH 268/287] Fix: we must use stockreal of stockvirtual when we are speaking about stock ('stock' alone is not accurate enough) --- htdocs/expedition/shipment.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/expedition/shipment.php b/htdocs/expedition/shipment.php index d5d82f2baa3..973066971a3 100644 --- a/htdocs/expedition/shipment.php +++ b/htdocs/expedition/shipment.php @@ -402,7 +402,7 @@ if ($id > 0 || ! empty($ref)) print ''.$langs->trans("KeepToShip").''.$langs->trans("Stock").''.$langs->trans("RealStock").'
'; diff --git a/htdocs/product/stats/commande_fournisseur.php b/htdocs/product/stats/commande_fournisseur.php index 3141b3266e9..8cbdea41495 100644 --- a/htdocs/product/stats/commande_fournisseur.php +++ b/htdocs/product/stats/commande_fournisseur.php @@ -150,9 +150,9 @@ if ($id > 0 || ! empty($ref)) { $sql .= " AND d.fk_commande = c.rowid"; $sql .= " AND d.fk_product =" . $product->id; if (! empty($search_month)) - $sql .= ' AND MONTH(f.datef) IN (' . $search_month . ')'; + $sql .= ' AND MONTH(c.date_commande) IN (' . $search_month . ')'; if (! empty($search_year)) - $sql .= ' AND YEAR(f.datef) IN (' . $search_year . ')'; + $sql .= ' AND YEAR(c.date_commande) IN (' . $search_year . ')'; if (! $user->rights->societe->client->voir && ! $socid) $sql .= " AND s.rowid = sc.fk_soc AND sc.fk_user = " . $user->id; if ($socid) @@ -199,12 +199,14 @@ if ($id > 0 || ! empty($ref)) { print_barre_liste($langs->trans("SuppliersOrders"), $page, $_SERVER["PHP_SELF"], "&id=$product->id", $sortfield, $sortorder, '', $num, $totalrecords, ''); print '
'; - print $langs->trans('Period') . '(' . $langs->trans("DateInvoice") . ') '; + print $langs->trans('Period') . ' (' . $langs->trans("OrderDate") . ') - '; print $langs->trans('Month') . ': '; print $langs->trans('Year') . ':' . $formother->selectyear($search_year ? $search_year : - 1, 'search_year', 1, 20, 5); + print '
'; print ''; print ''; print '
'; + print '
'; $i = 0; print '
'; diff --git a/htdocs/product/stats/facture.php b/htdocs/product/stats/facture.php index b59bc008f17..2ae8164b0f9 100644 --- a/htdocs/product/stats/facture.php +++ b/htdocs/product/stats/facture.php @@ -190,12 +190,14 @@ if ($id > 0 || ! empty($ref)) print_barre_liste($langs->trans("CustomersInvoices"),$page,$_SERVER["PHP_SELF"],"&id=".$product->id,$sortfield,$sortorder,'',$num,$totalrecords,''); print '
'; - print $langs->trans('Period').'('.$langs->trans("DateInvoice") .') '; + print $langs->trans('Period').' ('.$langs->trans("DateInvoice") .') - '; print $langs->trans('Month') . ': '; print $langs->trans('Year') . ':' . $formother->selectyear($search_year ? $search_year : - 1, 'search_year', 1, 20, 5); + print '
'; print ''; print ''; print '
'; + print '
'; $i = 0; print '
'; diff --git a/htdocs/product/stats/facture_fournisseur.php b/htdocs/product/stats/facture_fournisseur.php index 0feb415cc43..2e8e84621ba 100644 --- a/htdocs/product/stats/facture_fournisseur.php +++ b/htdocs/product/stats/facture_fournisseur.php @@ -191,12 +191,14 @@ if ($id > 0 || ! empty($ref)) print_barre_liste($langs->trans("SuppliersInvoices"), $page, $_SERVER["PHP_SELF"], "&id=$product->id", $sortfield, $sortorder, '', $num, $totalrecords, ''); print '
'; - print $langs->trans('Period') . '(' . $langs->trans("DateInvoice") . ') '; + print $langs->trans('Period') . ' (' . $langs->trans("DateInvoice") . ') - '; print $langs->trans('Month') . ': '; print $langs->trans('Year') . ':' . $formother->selectyear($search_year ? $search_year : - 1, 'search_year', 1, 20, 5); + print '
'; print ''; print ''; print '
'; + print '
'; $i = 0; print '
'; diff --git a/htdocs/product/stats/propal.php b/htdocs/product/stats/propal.php index 50d7c952b6d..10fd8247204 100644 --- a/htdocs/product/stats/propal.php +++ b/htdocs/product/stats/propal.php @@ -192,12 +192,14 @@ if ($id > 0 || ! empty($ref)) print_barre_liste($langs->trans("Proposals"), $page, $_SERVER["PHP_SELF"], "&id=$product->id", $sortfield, $sortorder, '', $num, $totalrecords, ''); print '
'; - print $langs->trans('Period') . '(' . $langs->trans("DateInvoice") . ') '; + print $langs->trans('Period') . ' (' . $langs->trans("DatePropal") . ') - '; print $langs->trans('Month') . ': '; print $langs->trans('Year') . ':' . $formother->selectyear($search_year ? $search_year : - 1, 'search_year', 1, 20, 5); + print '
'; print ''; print ''; print '
'; + print '
'; $i = 0; print '
'; From 6db3f1b30ed294d0054d35830b64d64c3977745f Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 7 Mar 2015 19:06:56 +0100 Subject: [PATCH 270/287] Add mdule askpricesupplier into MAIN__MODULES_FOR_EXTERNAL --- htdocs/core/class/conf.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/class/conf.class.php b/htdocs/core/class/conf.class.php index 67b5b8147d5..b6cc390ca33 100644 --- a/htdocs/core/class/conf.class.php +++ b/htdocs/core/class/conf.class.php @@ -452,7 +452,7 @@ class Conf $this->maxfilesize = (empty($this->global->MAIN_UPLOAD_DOC) ? 0 : $this->global->MAIN_UPLOAD_DOC * 1024); // Define list of limited modules - if (! isset($this->global->MAIN_MODULES_FOR_EXTERNAL)) $this->global->MAIN_MODULES_FOR_EXTERNAL='user,facture,categorie,commande,fournisseur,contact,propal,projet,contrat,societe,ficheinter,expedition,agenda,adherent'; // '' means 'all'. Note that contact is added here as it should be a module later. + if (! isset($this->global->MAIN_MODULES_FOR_EXTERNAL)) $this->global->MAIN_MODULES_FOR_EXTERNAL='user,askpricesupplier,facture,categorie,commande,fournisseur,contact,propal,projet,contrat,societe,ficheinter,expedition,agenda,adherent'; // '' means 'all'. Note that contact is added here as it should be a module later. // Enable select2 if (empty($conf->global->MAIN_USE_JQUERY_MULTISELECT)) $conf->global->MAIN_USE_JQUERY_MULTISELECT='select2'; From 56b5bfd25b63041cb8d0298b939da4721e5509a7 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 8 Mar 2015 02:08:26 +0100 Subject: [PATCH 271/287] NEW: Implement option SUPPLIER_ORDER_USE_DISPATCH_STATUS to add a status into each dispathing line of supplier order to "verify" a reception is ok. Status of order can be set to "total/done" only if line is verified. --- htdocs/core/class/commonobject.class.php | 3 +- htdocs/core/class/html.formorder.class.php | 6 +- .../class/fournisseur.commande.class.php | 82 +++++++++++-- .../fournisseur.commande.dispatch.class.php | 18 +-- htdocs/fourn/commande/card.php | 25 ++-- htdocs/fourn/commande/dispatch.php | 113 +++++++++++++----- htdocs/fourn/commande/list.php | 10 +- htdocs/langs/en_US/errors.lang | 1 + htdocs/langs/en_US/main.lang | 2 + htdocs/langs/en_US/orders.lang | 1 + htdocs/theme/eldy/style.css.php | 9 ++ 11 files changed, 200 insertions(+), 70 deletions(-) diff --git a/htdocs/core/class/commonobject.class.php b/htdocs/core/class/commonobject.class.php index 8ad8ecd2331..02ccd13b97c 100644 --- a/htdocs/core/class/commonobject.class.php +++ b/htdocs/core/class/commonobject.class.php @@ -2141,7 +2141,8 @@ abstract class CommonObject $fieldstatus="fk_statut"; if ($elementTable == 'user') $fieldstatus="statut"; if ($elementTable == 'expensereport') $fieldstatus="fk_c_expensereport_statuts"; - + if ($elementTable == 'commande_fournisseur_dispatch') $fieldstatus="status"; + $sql = "UPDATE ".MAIN_DB_PREFIX.$elementTable; $sql.= " SET ".$fieldstatus." = ".$status; // If status = 1 = validated, update also fk_user_valid diff --git a/htdocs/core/class/html.formorder.class.php b/htdocs/core/class/html.formorder.class.php index 5ea5b33c1f4..2abc0c38485 100644 --- a/htdocs/core/class/html.formorder.class.php +++ b/htdocs/core/class/html.formorder.class.php @@ -57,11 +57,11 @@ class FormOrder { print ''; print ''; print ''; - if (! empty($conf->global->SUPPLIER_ORDER_USE_DISPATCH_STATUS)) print ''; + if (! empty($conf->global->SUPPLIER_ORDER_USE_DISPATCH_STATUS)) print ''; print "\n"; $var=false; @@ -553,6 +591,7 @@ if ($id > 0 || ! empty($ref)) while ($i < $num) { $objp = $db->fetch_object($resql); + print ""; print ''; - } + // Add button to check/uncheck disaptching + print ''; + } + print "\n"; $i++; diff --git a/htdocs/fourn/commande/list.php b/htdocs/fourn/commande/list.php index 6926997f0f1..7e525a9d080 100644 --- a/htdocs/fourn/commande/list.php +++ b/htdocs/fourn/commande/list.php @@ -45,7 +45,7 @@ $search_user=GETPOST('search_user'); $search_ht=GETPOST('search_ht'); $search_ttc=GETPOST('search_ttc'); $sall=GETPOST('search_all'); -$search_status=(GETPOST('search_status','int')!=''?GETPOST('search_status','int'):GETPOST('statut','int')); +$search_status=(GETPOST('search_status','alpha')!=''?GETPOST('search_status','alpha'):GETPOST('statut','alpha')); // alpha and not intbecause it can be '6,7' $page = GETPOST('page','int'); $socid = GETPOST('socid','int'); @@ -153,9 +153,9 @@ if ($search_refsupp) { $sql.= " AND (cf.ref_supplier LIKE '%".$db->escape($search_refsupp)."%')"; } -if ($search_status >= 0) +if ($search_status != '' && $search_status >= 0) { - if ($search_status == 6 || $search_status == 7) $sql.=" AND cf.fk_statut IN (6,7)"; + if (strstr($search_status, ',')) $sql.=" AND cf.fk_statut IN (".$db->escape($search_status).")"; else $sql.=" AND cf.fk_statut = ".$search_status; } @@ -205,9 +205,9 @@ if ($resql) print ''; - print ''; + print ''; if (empty($conf->global->SUPPLIER_ORDER_HIDE_REF_SUPPLIER)) print ''; - print ''; + print ''; if (! empty($conf->global->PROJECT_SHOW_REF_INTO_LISTS)) { print ''; - print ''; + print ''; print ''; - print ''; + print ''; print "\n"; $i++; From 7c08f33fe184fbebcff5c87e74f5858f2849f051 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 8 Mar 2015 02:26:41 +0100 Subject: [PATCH 273/287] Missing style buttonRefused --- htdocs/theme/amarok/style.css.php | 18 ++++++++++++++++++ htdocs/theme/auguria/style.css.php | 17 +++++++++++++++++ htdocs/theme/bureau2crea/style.css.php | 17 +++++++++++++++++ htdocs/theme/cameleo/style.css.php | 17 +++++++++++++++++ 4 files changed, 69 insertions(+) diff --git a/htdocs/theme/amarok/style.css.php b/htdocs/theme/amarok/style.css.php index bd41d0735a5..c7f3d27dcfb 100644 --- a/htdocs/theme/amarok/style.css.php +++ b/htdocs/theme/amarok/style.css.php @@ -1125,6 +1125,24 @@ td.formdocbutton {padding-top:6px;} ); color:white; } +.button:disabled { + opacity: 0.4; + filter: alpha(opacity=40); /* For IE8 and earlier */ + box-shadow: none; + -webkit-box-shadow: none; + -moz-box-shadow: none; + cursor: auto; +} +.buttonRefused { + pointer-events: none; + cursor: default; + opacity: 0.4; + filter: alpha(opacity=40); /* For IE8 and earlier */ + box-shadow: none; + -webkit-box-shadow: none; + -moz-box-shadow: none; +} + /* ============================================================================== */ /* Tables */ diff --git a/htdocs/theme/auguria/style.css.php b/htdocs/theme/auguria/style.css.php index 35e0cdd36c9..7278521e092 100644 --- a/htdocs/theme/auguria/style.css.php +++ b/htdocs/theme/auguria/style.css.php @@ -184,6 +184,23 @@ legend { margin-bottom: 8px; } padding: 0px 2px 0px 2px; margin: 0px 0px 0px 0px; } +.button:disabled { + opacity: 0.4; + filter: alpha(opacity=40); /* For IE8 and earlier */ + box-shadow: none; + -webkit-box-shadow: none; + -moz-box-shadow: none; + cursor: auto; +} +.buttonRefused { + pointer-events: none; + cursor: default; + opacity: 0.4; + filter: alpha(opacity=40); /* For IE8 and earlier */ + box-shadow: none; + -webkit-box-shadow: none; + -moz-box-shadow: none; +} form { padding: 0em 0em 0em 0em; margin: 0em 0em 0em 0em; diff --git a/htdocs/theme/bureau2crea/style.css.php b/htdocs/theme/bureau2crea/style.css.php index b720bd4a802..31071f0b10c 100644 --- a/htdocs/theme/bureau2crea/style.css.php +++ b/htdocs/theme/bureau2crea/style.css.php @@ -209,6 +209,23 @@ legend { margin-bottom: 8px; } padding: 0px 2px 0px 2px; margin: 0px 0px 0px 0px; } +.button:disabled { + opacity: 0.4; + filter: alpha(opacity=40); /* For IE8 and earlier */ + box-shadow: none; + -webkit-box-shadow: none; + -moz-box-shadow: none; + cursor: auto; +} +.buttonRefused { + pointer-events: none; + cursor: default; + opacity: 0.4; + filter: alpha(opacity=40); /* For IE8 and earlier */ + box-shadow: none; + -webkit-box-shadow: none; + -moz-box-shadow: none; +} form { padding: 0em 0em 0em 0em; margin: 0em 0em 0em 0em; diff --git a/htdocs/theme/cameleo/style.css.php b/htdocs/theme/cameleo/style.css.php index a49ad6daaec..d09cb844b88 100644 --- a/htdocs/theme/cameleo/style.css.php +++ b/htdocs/theme/cameleo/style.css.php @@ -185,6 +185,23 @@ legend { margin-bottom: 8px; } padding: 0px 2px 0px 2px; margin: 0px 0px 0px 0px; } +.button:disabled { + opacity: 0.4; + filter: alpha(opacity=40); /* For IE8 and earlier */ + box-shadow: none; + -webkit-box-shadow: none; + -moz-box-shadow: none; + cursor: auto; +} +.buttonRefused { + pointer-events: none; + cursor: default; + opacity: 0.4; + filter: alpha(opacity=40); /* For IE8 and earlier */ + box-shadow: none; + -webkit-box-shadow: none; + -moz-box-shadow: none; +} form { padding: 0em 0em 0em 0em; margin: 0em 0em 0em 0em; From 3894a48ffdaba5acfff20e1c34e71b0c190f9289 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 8 Mar 2015 02:37:25 +0100 Subject: [PATCH 274/287] Fix: bad CSS --- htdocs/compta/bank/index.php | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/htdocs/compta/bank/index.php b/htdocs/compta/bank/index.php index 050db37fefc..9c9f0574c31 100644 --- a/htdocs/compta/bank/index.php +++ b/htdocs/compta/bank/index.php @@ -174,7 +174,11 @@ foreach ($accounts as $key=>$type) $total[$acc->currency_code] += $solde; } } -if (! $found) print ''; +if (! $found) +{ + $var = !$var; + print ''; +} // Total foreach ($total as $key=>$solde) { From bd6f13e6ed2349c701dccc2c983509fa493c7119 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 9 Mar 2015 19:13:19 +0100 Subject: [PATCH 275/287] Can export extra fields of lines. --- .../modules/modAskPriceSupplier.class.php | 1 - htdocs/core/modules/modFournisseur.class.php | 92 ++++++++++++++++--- 2 files changed, 81 insertions(+), 12 deletions(-) diff --git a/htdocs/core/modules/modAskPriceSupplier.class.php b/htdocs/core/modules/modAskPriceSupplier.class.php index f64126e224e..d415d615756 100644 --- a/htdocs/core/modules/modAskPriceSupplier.class.php +++ b/htdocs/core/modules/modAskPriceSupplier.class.php @@ -110,7 +110,6 @@ class modAskPriceSupplier extends DolibarrModules $this->rights[$r][3] = 1; // La permission est-elle une permission par defaut $this->rights[$r][4] = 'creer'; - $r++; $this->rights[$r][0] = $this->numero + $r; // id de la permission $this->rights[$r][1] = 'Validate supplier proposals'; // libelle de la permission diff --git a/htdocs/core/modules/modFournisseur.class.php b/htdocs/core/modules/modFournisseur.class.php index 45cb61b04fd..9e26b0e8b81 100644 --- a/htdocs/core/modules/modFournisseur.class.php +++ b/htdocs/core/modules/modFournisseur.class.php @@ -1,6 +1,6 @@ - * Copyright (C) 2004-2013 Laurent Destailleur + * Copyright (C) 2004-2015 Laurent Destailleur * Copyright (C) 2005-2012 Regis Houssin * Copyright (C) 2012 Juanjo Menent * Copyright (C) 2013 Philippe Grand @@ -251,11 +251,11 @@ class modFournisseur extends DolibarrModules $this->export_icon[$r]='bill'; $this->export_permission[$r]=array(array("fournisseur","facture","export")); $this->export_fields_array[$r]=array('s.rowid'=>"IdCompany",'s.nom'=>'CompanyName','s.address'=>'Address','s.zip'=>'Zip','s.town'=>'Town','c.code'=>'CountryCode','s.phone'=>'Phone','s.siren'=>'ProfId1','s.siret'=>'ProfId2','s.ape'=>'ProfId3','s.idprof4'=>'ProfId4','s.idprof5'=>'ProfId5','s.idprof6'=>'ProfId6','s.tva_intra'=>'VATIntra','f.rowid'=>"InvoiceId",'f.ref'=>"InvoiceRef",'f.ref_supplier'=>"RefSupplier",'f.datec'=>"InvoiceDateCreation",'f.datef'=>"DateInvoice",'f.total_ht'=>"TotalHT",'f.total_ttc'=>"TotalTTC",'f.total_tva'=>"TotalVAT",'f.paye'=>"InvoicePaid",'f.fk_statut'=>'InvoiceStatus','f.note_public'=>"InvoiceNote",'fd.rowid'=>'LineId','fd.description'=>"LineDescription",'fd.tva_tx'=>"LineVATRate",'fd.qty'=>"LineQty",'fd.remise_percent'=>"Discount",'fd.total_ht'=>"LineTotalHT",'fd.total_ttc'=>"LineTotalTTC",'fd.tva'=>"LineTotalVAT",'fd.product_type'=>'TypeOfLineServiceOrProduct','fd.fk_product'=>'ProductId','p.ref'=>'ProductRef','p.label'=>'ProductLabel','p.accountancy_code_buy'=>'ProductAccountancyBuyCode'); - //$this->export_TypeFields_array[$r]=array('s.rowid'=>"List:societe:CompanyName",'s.nom'=>'Text','s.address'=>'Text','s.zip'=>'Text','s.town'=>'Text','c.code'=>'Text','s.phone'=>'Text','s.siren'=>'Text','s.siret'=>'Text','s.ape'=>'Text','s.idprof4'=>'Text','s.tva_intra'=>'Text','f.ref'=>"Text",'f.datec'=>"Date",'f.datef'=>"Date",'f.total_ht'=>"Number",'f.total_ttc'=>"Number",'f.total_tva'=>"Number",'f.paye'=>"Boolean",'f.fk_statut'=>'Status','f.note_public'=>"Text",'fd.description'=>"Text",'fd.tva_tx'=>"Text",'fd.qty'=>"Number",'fd.total_ht'=>"Number",'fd.total_ttc'=>"Number",'fd.tva'=>"Number",'fd.product_type'=>'Boolean','fd.fk_product'=>'List:Product:label','p.ref'=>'Text','p.label'=>'Text'); - $this->export_TypeFields_array[$r]=array('s.nom'=>'Text','s.address'=>'Text','s.zip'=>'Text','s.town'=>'Text','c.code'=>'Text','s.phone'=>'Text','s.siren'=>'Text','s.siret'=>'Text','s.ape'=>'Text','s.idprof4'=>'Text','s.tva_intra'=>'Text','f.ref'=>"Text",'f.ref_supplier'=>"Text",'f.datec'=>"Date",'f.datef'=>"Date",'f.total_ht'=>"Number",'f.total_ttc'=>"Number",'f.total_tva'=>"Number",'f.paye'=>"Boolean",'f.fk_statut'=>'Status','f.note_public'=>"Text",'fd.description'=>"Text",'fd.tva_tx'=>"Text",'fd.qty'=>"Number",'fd.total_ht'=>"Number",'fd.total_ttc'=>"Number",'fd.tva'=>"Number",'fd.product_type'=>'Boolean','fd.fk_product'=>'List:Product:label','p.ref'=>'Text','p.label'=>'Text'); + //$this->export_TypeFields_array[$r]=array('s.rowid'=>"List:societe:CompanyName",'s.nom'=>'Text','s.address'=>'Text','s.zip'=>'Text','s.town'=>'Text','c.code'=>'Text','s.phone'=>'Text','s.siren'=>'Text','s.siret'=>'Text','s.ape'=>'Text','s.idprof4'=>'Text','s.tva_intra'=>'Text','f.ref'=>"Text",'f.datec'=>"Date",'f.datef'=>"Date",'f.total_ht'=>"Number",'f.total_ttc'=>"Number",'f.total_tva'=>"Number",'f.paye'=>"Boolean",'f.fk_statut'=>'Status','f.note_public'=>"Text",'fd.description'=>"Text",'fd.tva_tx'=>"Text",'fd.qty'=>"Number",'fd.total_ht'=>"Number",'fd.total_ttc'=>"Number",'fd.tva'=>"Number",'fd.product_type'=>'Number','fd.fk_product'=>'List:Product:label','p.ref'=>'Text','p.label'=>'Text'); + $this->export_TypeFields_array[$r]=array('s.nom'=>'Text','s.address'=>'Text','s.zip'=>'Text','s.town'=>'Text','c.code'=>'Text','s.phone'=>'Text','s.siren'=>'Text','s.siret'=>'Text','s.ape'=>'Text','s.idprof4'=>'Text','s.tva_intra'=>'Text','f.ref'=>"Text",'f.ref_supplier'=>"Text",'f.datec'=>"Date",'f.datef'=>"Date",'f.total_ht'=>"Number",'f.total_ttc'=>"Number",'f.total_tva'=>"Number",'f.paye'=>"Boolean",'f.fk_statut'=>'Status','f.note_public'=>"Text",'fd.description'=>"Text",'fd.tva_tx'=>"Text",'fd.qty'=>"Number",'fd.total_ht'=>"Number",'fd.total_ttc'=>"Number",'fd.tva'=>"Number",'fd.product_type'=>'Number','fd.fk_product'=>'List:Product:label','p.ref'=>'Text','p.label'=>'Text'); $this->export_entities_array[$r]=array('s.rowid'=>"company",'s.nom'=>'company','s.address'=>'company','s.zip'=>'company','s.town'=>'company','c.code'=>'company','s.phone'=>'company','s.siren'=>'company','s.siret'=>'company','s.ape'=>'company','s.idprof4'=>'company','s.idprof5'=>'company','s.idprof6'=>'company','s.tva_intra'=>'company','f.rowid'=>"invoice",'f.ref'=>"invoice",'f.ref_supplier'=>"invoice",'f.datec'=>"invoice",'f.datef'=>"invoice",'f.total_ht'=>"invoice",'f.total_ttc'=>"invoice",'f.total_tva'=>"invoice",'f.paye'=>"invoice",'f.fk_statut'=>'invoice','f.note_public'=>"invoice",'fd.rowid'=>'invoice_line','fd.description'=>"invoice_line",'fd.tva_tx'=>"invoice_line",'fd.qty'=>"invoice_line",'fd.remise_percent'=>"invoice_line",'fd.total_ht'=>"invoice_line",'fd.total_ttc'=>"invoice_line",'fd.tva'=>"invoice_line",'fd.product_type'=>'invoice_line','fd.fk_product'=>'product','p.ref'=>'product','p.label'=>'product','p.accountancy_code_buy'=>'product'); $this->export_dependencies_array[$r]=array('invoice_line'=>'fd.rowid','product'=>'fd.rowid'); // To add unique key if we ask a field of a child to avoid the DISTINCT to discard them - // Add extra fields + // Add extra fields object $sql="SELECT name, label, type, param FROM ".MAIN_DB_PREFIX."extrafields WHERE elementtype = 'facture_fourn'"; $resql=$this->db->query($sql); if ($resql) // This can fail when class is used on old database (during migration for example) @@ -288,13 +288,48 @@ class modFournisseur extends DolibarrModules $this->export_entities_array[$r][$fieldname]='invoice'; } } - // End add axtra fields - $this->export_sql_start[$r]='SELECT DISTINCT '; + // End add extra fields + // Add extra fields line + $sql="SELECT name, label, type, param FROM ".MAIN_DB_PREFIX."extrafields WHERE elementtype = 'facture_fourn_det'"; + $resql=$this->db->query($sql); + if ($resql) // This can fail when class is used on old database (during migration for example) + { + while ($obj=$this->db->fetch_object($resql)) + { + $fieldname='extraline.'.$obj->name; + $fieldlabel=ucfirst($obj->label); + $typeFilter="Text"; + switch($obj->type) + { + case 'int': + case 'double': + case 'price': + $typeFilter="Numeric"; + break; + case 'date': + case 'datetime': + $typeFilter="Date"; + break; + case 'boolean': + $typeFilter="Boolean"; + break; + case 'sellist': + $typeFilter="List:".$obj->param; + break; + } + $this->export_fields_array[$r][$fieldname]=$fieldlabel; + $this->export_TypeFields_array[$r][$fieldname]=$typeFilter; + $this->export_entities_array[$r][$fieldname]='invoice_line'; + } + } + // End add extra fields line + $this->export_sql_start[$r]='SELECT DISTINCT '; $this->export_sql_end[$r] =' FROM '.MAIN_DB_PREFIX.'societe as s'; $this->export_sql_end[$r] .=' LEFT JOIN '.MAIN_DB_PREFIX.'c_country as c ON s.fk_pays = c.rowid,'; $this->export_sql_end[$r] .=' '.MAIN_DB_PREFIX.'facture_fourn as f'; $this->export_sql_end[$r] .=' LEFT JOIN '.MAIN_DB_PREFIX.'facture_fourn_extrafields as extra ON f.rowid = extra.fk_object'; $this->export_sql_end[$r] .=' , '.MAIN_DB_PREFIX.'facture_fourn_det as fd'; + $this->export_sql_end[$r] .=' LEFT JOIN '.MAIN_DB_PREFIX.'facture_fourn_det_extrafields as extraline ON fd.rowid = extraline.fk_object'; $this->export_sql_end[$r] .=' LEFT JOIN '.MAIN_DB_PREFIX.'product as p on (fd.fk_product = p.rowid)'; $this->export_sql_end[$r] .=' WHERE f.fk_soc = s.rowid AND f.rowid = fd.fk_facture_fourn'; $this->export_sql_end[$r] .=' AND f.entity IN ('.getEntity('supplier_invoice',1).')'; @@ -309,7 +344,7 @@ class modFournisseur extends DolibarrModules $this->export_TypeFields_array[$r]=array('s.nom'=>'Text','s.address'=>'Text','s.zip'=>'Text','s.town'=>'Text','c.code'=>'Text','s.phone'=>'Text','s.siren'=>'Text','s.siret'=>'Text','s.ape'=>'Text','s.idprof4'=>'Text','s.tva_intra'=>'Text','f.ref'=>"Text",'f.ref_supplier'=>"Text",'f.datec'=>"Date",'f.datef'=>"Date",'f.total_ht'=>"Number",'f.total_ttc'=>"Number",'f.total_tva'=>"Number",'f.paye'=>"Boolean",'f.fk_statut'=>'Status','f.note_public'=>"Text",'pf.amount'=>'Number','p.datep'=>'Date','p.num_paiement'=>'Number'); $this->export_entities_array[$r]=array('s.rowid'=>"company",'s.nom'=>'company','s.address'=>'company','s.zip'=>'company','s.town'=>'company','c.code'=>'company','s.phone'=>'company','s.siren'=>'company','s.siret'=>'company','s.ape'=>'company','s.idprof4'=>'company','s.idprof5'=>'company','s.idprof6'=>'company','s.tva_intra'=>'company','f.rowid'=>"invoice",'f.ref'=>"invoice",'f.ref_supplier'=>"invoice",'f.datec'=>"invoice",'f.datef'=>"invoice",'f.total_ht'=>"invoice",'f.total_ttc'=>"invoice",'f.total_tva'=>"invoice",'f.paye'=>"invoice",'f.fk_statut'=>'invoice','f.note_public'=>"invoice",'p.rowid'=>'payment','pf.amount'=>'payment','p.datep'=>'payment','p.num_paiement'=>'payment'); $this->export_dependencies_array[$r]=array('payment'=>'p.rowid'); // To add unique key if we ask a field of a child to avoid the DISTINCT to discard them - // Add extra fields + // Add extra fields object $sql="SELECT name, label, type, param FROM ".MAIN_DB_PREFIX."extrafields WHERE elementtype = 'facture_fourn'"; $resql=$this->db->query($sql); if ($resql) // This can fail when class is used on old database (during migration for example) @@ -342,7 +377,7 @@ class modFournisseur extends DolibarrModules $this->export_entities_array[$r][$fieldname]='invoice'; } } - // End add axtra fields + // End add extra fields object $this->export_sql_start[$r]='SELECT DISTINCT '; $this->export_sql_end[$r] =' FROM '.MAIN_DB_PREFIX.'societe as s'; $this->export_sql_end[$r] .=' LEFT JOIN '.MAIN_DB_PREFIX.'c_country as c ON s.fk_pays = c.rowid,'; @@ -361,10 +396,10 @@ class modFournisseur extends DolibarrModules $this->export_icon[$r]='order'; $this->export_permission[$r]=array(array("fournisseur","commande","export")); $this->export_fields_array[$r]=array('s.rowid'=>"IdCompany",'s.nom'=>'CompanyName','s.address'=>'Address','s.zip'=>'Zip','s.town'=>'Town','c.code'=>'CountryCode','s.phone'=>'Phone','s.siren'=>'ProfId1','s.siret'=>'ProfId2','s.ape'=>'ProfId3','s.idprof4'=>'ProfId4','s.idprof5'=>'ProfId5','s.idprof6'=>'ProfId6','s.tva_intra'=>'VATIntra','f.rowid'=>"OrderId",'f.ref'=>"Ref",'f.ref_supplier'=>"RefSupplier",'f.date_creation'=>"DateCreation",'f.date_commande'=>"OrderDate",'f.total_ht'=>"TotalHT",'f.total_ttc'=>"TotalTTC",'f.tva'=>"TotalVAT",'f.fk_statut'=>'Status','f.note_public'=>"NotePublic",'f.note_private'=>"NotePrivate",'fd.rowid'=>'LineId','fd.description'=>"LineDescription",'fd.tva_tx'=>"LineVATRate",'fd.qty'=>"LineQty",'fd.remise_percent'=>"Discount",'fd.total_ht'=>"LineTotalHT",'fd.total_ttc'=>"LineTotalTTC",'fd.total_tva'=>"LineTotalVAT",'fd.product_type'=>'TypeOfLineServiceOrProduct','fd.fk_product'=>'ProductId','p.ref'=>'ProductRef','p.label'=>'ProductLabel'); - $this->export_TypeFields_array[$r]=array('s.rowid'=>"company",'s.nom'=>'Text','s.address'=>'Text','s.cp'=>'Text','s.ville'=>'Text','c.code'=>'Text','s.tel'=>'Text','s.siren'=>'Text','s.siret'=>'Text','s.ape'=>'Text','s.idprof4'=>'Text','s.idprof5'=>'Text','s.idprof6'=>'Text','s.tva_intra'=>'Text','f.ref'=>"Text",'f.ref_supplier'=>"Text",'f.date_creation'=>"Date",'f.date_commande'=>"Date",'f.total_ht'=>"Number",'f.total_ttc'=>"Number",'f.tva'=>"Number",'f.fk_statut'=>'Status','f.note_public'=>"Text",'f.note_private'=>"Text",'fd.description'=>"Text",'fd.tva_tx'=>"Number",'fd.qty'=>"Number",'fd.remise_percent'=>"Number",'fd.total_ht'=>"Number",'fd.total_ttc'=>"Number",'fd.total_tva'=>"Number",'fd.product_type'=>'Boolean','fd.fk_product'=>'List:Product:label','p.ref'=>'Text','p.label'=>'Text'); + $this->export_TypeFields_array[$r]=array('s.rowid'=>"company",'s.nom'=>'Text','s.address'=>'Text','s.cp'=>'Text','s.ville'=>'Text','c.code'=>'Text','s.tel'=>'Text','s.siren'=>'Text','s.siret'=>'Text','s.ape'=>'Text','s.idprof4'=>'Text','s.idprof5'=>'Text','s.idprof6'=>'Text','s.tva_intra'=>'Text','f.ref'=>"Text",'f.ref_supplier'=>"Text",'f.date_creation'=>"Date",'f.date_commande'=>"Date",'f.total_ht'=>"Number",'f.total_ttc'=>"Number",'f.tva'=>"Number",'f.fk_statut'=>'Status','f.note_public'=>"Text",'f.note_private'=>"Text",'fd.description'=>"Text",'fd.tva_tx'=>"Number",'fd.qty'=>"Number",'fd.remise_percent'=>"Number",'fd.total_ht'=>"Number",'fd.total_ttc'=>"Number",'fd.total_tva'=>"Number",'fd.product_type'=>'Number','fd.fk_product'=>'List:Product:label','p.ref'=>'Text','p.label'=>'Text'); $this->export_entities_array[$r]=array('s.rowid'=>"company",'s.nom'=>'company','s.address'=>'company','s.zip'=>'company','s.town'=>'company','c.code'=>'company','s.phone'=>'company','s.siren'=>'company','s.siret'=>'company','s.ape'=>'company','s.idprof4'=>'company','s.idprof5'=>'company','s.idprof6'=>'company','s.tva_intra'=>'company','f.rowid'=>"order",'f.ref'=>"order",'f.ref_supplier'=>"order",'f.date_creation'=>"order",'f.date_commande'=>"order",'f.total_ht'=>"order",'f.total_ttc'=>"order",'f.tva'=>"order",'f.fk_statut'=>'order','f.note_public'=>"order",'f.note_private'=>"order",'fd.rowid'=>'order_line','fd.description'=>"order_line",'fd.tva_tx'=>"order_line",'fd.qty'=>"order_line",'fd.remise_percent'=>"order_line",'fd.total_ht'=>"order_line",'fd.total_ttc'=>"order_line",'fd.total_tva'=>"order_line",'fd.product_type'=>'order_line','fd.fk_product'=>'product','p.ref'=>'product','p.label'=>'product'); $this->export_dependencies_array[$r]=array('order_line'=>'fd.rowid','product'=>'fd.rowid'); // To add unique key if we ask a field of a child to avoid the DISTINCT to discard them - // Add extra fields + // Add extra fields object $sql="SELECT name, label, type, param FROM ".MAIN_DB_PREFIX."extrafields WHERE elementtype = 'commande_fournisseur'"; $resql=$this->db->query($sql); if ($resql) // This can fail when class is used on old database (during migration for example) @@ -397,13 +432,48 @@ class modFournisseur extends DolibarrModules $this->export_entities_array[$r][$fieldname]='order'; } } - // End add axtra fields + // End add extra fields object + // Add extra fields line + $sql="SELECT name, label, type, param FROM ".MAIN_DB_PREFIX."extrafields WHERE elementtype = 'commande_fournisseurdet'"; + $resql=$this->db->query($sql); + if ($resql) // This can fail when class is used on old database (during migration for example) + { + while ($obj=$this->db->fetch_object($resql)) + { + $fieldname='extraline.'.$obj->name; + $fieldlabel=ucfirst($obj->label); + $typeFilter="Text"; + switch($obj->type) + { + case 'int': + case 'double': + case 'price': + $typeFilter="Numeric"; + break; + case 'date': + case 'datetime': + $typeFilter="Date"; + break; + case 'boolean': + $typeFilter="Boolean"; + break; + case 'sellist': + $typeFilter="List:".$obj->param; + break; + } + $this->export_fields_array[$r][$fieldname]=$fieldlabel; + $this->export_TypeFields_array[$r][$fieldname]=$typeFilter; + $this->export_entities_array[$r][$fieldname]='order_line'; + } + } + // End add extra fields line $this->export_sql_start[$r]='SELECT DISTINCT '; $this->export_sql_end[$r] =' FROM '.MAIN_DB_PREFIX.'societe as s'; $this->export_sql_end[$r] .=' LEFT JOIN '.MAIN_DB_PREFIX.'c_country as c ON s.fk_pays = c.rowid,'; $this->export_sql_end[$r] .=' '.MAIN_DB_PREFIX.'commande_fournisseur as f'; $this->export_sql_end[$r] .=' LEFT JOIN '.MAIN_DB_PREFIX.'commande_fournisseur_extrafields as extra ON f.rowid = extra.fk_object,'; $this->export_sql_end[$r] .=' '.MAIN_DB_PREFIX.'commande_fournisseurdet as fd'; + $this->export_sql_end[$r] .=' LEFT JOIN '.MAIN_DB_PREFIX.'commande_fournisseurdet_extrafields as extraline ON fd.rowid = extraline.fk_object'; $this->export_sql_end[$r] .=' LEFT JOIN '.MAIN_DB_PREFIX.'product as p on (fd.fk_product = p.rowid)'; $this->export_sql_end[$r] .=' WHERE f.fk_soc = s.rowid AND f.rowid = fd.fk_commande'; $this->export_sql_end[$r] .=' AND f.entity IN ('.getEntity('supplier_order',1).')'; From bd81dec1a3b6a7e33359e85222201d80f70fa502 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 9 Mar 2015 19:28:38 +0100 Subject: [PATCH 276/287] Fix missing translation --- htdocs/core/modules/modContrat.class.php | 6 ++++-- htdocs/langs/en_US/contracts.lang | 1 + 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/htdocs/core/modules/modContrat.class.php b/htdocs/core/modules/modContrat.class.php index dc97964fa45..27299e0f291 100644 --- a/htdocs/core/modules/modContrat.class.php +++ b/htdocs/core/modules/modContrat.class.php @@ -41,7 +41,7 @@ class modContrat extends DolibarrModules */ function __construct($db) { - global $conf; + global $conf, $langs; $this->db = $db; $this->numero = 54; @@ -118,10 +118,12 @@ class modContrat extends DolibarrModules // Exports //-------- + $langs->load("contracts"); + $r=1; $this->export_code[$r]=$this->rights_class.'_'.$r; - $this->export_label[$r]='ContractAndServices'; // Translation key (used only if key ExportDataset_xxx_z not found) + $this->export_label[$r]=$langs->trans('ContractsAndLine'); // Translation key (used only if key ExportDataset_xxx_z not found) $this->export_icon[$r]='contract'; $this->export_permission[$r]=array(array("contrat","export")); $this->export_fields_array[$r]=array('s.rowid'=>"IdCompany",'s.nom'=>'CompanyName','s.address'=>'Address','s.zip'=>'Zip','s.town'=>'Town','c.code'=>'CountryCode', diff --git a/htdocs/langs/en_US/contracts.lang b/htdocs/langs/en_US/contracts.lang index 57ba3bb15d8..d1be0e6513f 100644 --- a/htdocs/langs/en_US/contracts.lang +++ b/htdocs/langs/en_US/contracts.lang @@ -19,6 +19,7 @@ ServiceStatusLateShort=Expired ServiceStatusClosed=Closed ServicesLegend=Services legend Contracts=Contracts +ContractsAndLine=Contracts and line of contracts Contract=Contract NoContracts=No contracts MenuServices=Services From 88a29b7c9cffe98e92a6b756d557759e3122f88d Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 9 Mar 2015 20:26:56 +0100 Subject: [PATCH 277/287] Add an advance permission to check/uncheck reception --- htdocs/core/modules/modFournisseur.class.php | 8 +++++ htdocs/fourn/commande/dispatch.php | 38 +++++++++++++++----- 2 files changed, 38 insertions(+), 8 deletions(-) diff --git a/htdocs/core/modules/modFournisseur.class.php b/htdocs/core/modules/modFournisseur.class.php index 9e26b0e8b81..84e6385694d 100644 --- a/htdocs/core/modules/modFournisseur.class.php +++ b/htdocs/core/modules/modFournisseur.class.php @@ -177,6 +177,14 @@ class modFournisseur extends DolibarrModules $this->rights[$r][4] = 'commande'; $this->rights[$r][5] = 'receptionner'; + $r++; + $this->rights[$r][0] = 1189; + $this->rights[$r][1] = 'Check/Uncheck a supplier order reception'; + $this->rights[$r][2] = 'd'; + $this->rights[$r][3] = 0; + $this->rights[$r][4] = 'commande_advance'; + $this->rights[$r][5] = 'check'; + $r++; $this->rights[$r][0] = 1188; $this->rights[$r][1] = 'Supprimer une commande fournisseur'; diff --git a/htdocs/fourn/commande/dispatch.php b/htdocs/fourn/commande/dispatch.php index 2610111023a..f2dd3518868 100644 --- a/htdocs/fourn/commande/dispatch.php +++ b/htdocs/fourn/commande/dispatch.php @@ -67,7 +67,10 @@ $mesg=''; * Actions */ -if ($action == 'checkdispatchline') +if ($action == 'checkdispatchline' && + ! ((empty($conf->global->MAIN_USE_ADVANCED_PERMS) && empty($user->rights->fournisseur->commande->receptionner)) + || (! empty($conf->global->MAIN_USE_ADVANCED_PERMS) && empty($user->rights->fournisseur->commande_advance->check))) +) { $supplierorderdispatch = new CommandeFournisseurDispatch($db); $result=$supplierorderdispatch->fetch($lineid); @@ -81,7 +84,10 @@ if ($action == 'checkdispatchline') } } -if ($action == 'uncheckdispatchline') +if ($action == 'uncheckdispatchline' && + ! ((empty($conf->global->MAIN_USE_ADVANCED_PERMS) && empty($user->rights->fournisseur->commande->receptionner)) + || (! empty($conf->global->MAIN_USE_ADVANCED_PERMS) && empty($user->rights->fournisseur->commande_advance->check))) +) { $supplierorderdispatch = new CommandeFournisseurDispatch($db); $result=$supplierorderdispatch->fetch($lineid); @@ -630,15 +636,31 @@ if ($id > 0 || ! empty($ref)) // Add button to check/uncheck disaptching print ''; } From 84695845bbd3c1e575efd958b07c9ea2de092829 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 9 Mar 2015 21:20:56 +0100 Subject: [PATCH 278/287] Some fixes into translation and permissions --- htdocs/admin/perms.php | 11 +- htdocs/commande/card.php | 6 +- .../modules/modAskPriceSupplier.class.php | 8 +- htdocs/core/modules/modCommande.class.php | 5 +- htdocs/core/modules/modFournisseur.class.php | 2 +- htdocs/langs/en_US/admin.lang | 2 + htdocs/user/perms.php | 354 +++++++++--------- 7 files changed, 197 insertions(+), 191 deletions(-) diff --git a/htdocs/admin/perms.php b/htdocs/admin/perms.php index 907ed389b38..3a7c47f3acf 100644 --- a/htdocs/admin/perms.php +++ b/htdocs/admin/perms.php @@ -67,7 +67,7 @@ llxHeader('',$langs->trans("DefaultRights")); print_fiche_titre($langs->trans("SecuritySetup"),'','setup'); print $langs->trans("DefaultRightsDesc"); -print " ".$langs->trans("OnlyActiveElementsAreShown")."
\n"; +print " ".$langs->trans("OnlyActiveElementsAreShown")."

\n"; $db->begin(); @@ -115,16 +115,15 @@ foreach ($modulesdir as $dir) $db->commit(); -// Show warning about external users -print info_admin(showModulesExludedForExternal($modules)).'
'."\n"; -print "
\n"; - - $head=security_prepare_head(); dol_fiche_head($head, 'default', $langs->trans("Security")); +// Show warning about external users +print info_admin(showModulesExludedForExternal($modules)).'
'."\n"; + + print '
'.$langs->trans("Warehouse").''.$langs->trans("Comment").''.$langs->trans("Status").''.$langs->trans("Status").'
'; print ''.img_object($langs->trans("ShowProduct"),'product').' '.$objp->ref.''; @@ -588,8 +627,22 @@ if ($id > 0 || ! empty($ref)) //print $supplierorderdispatch->status; print $supplierorderdispatch->getLibStatut(5); print ''; + $disabled=''; + if ($commande->statut == 5) $disabled=1; + if (empty($objp->status)) + { + print 'dispatchlineid.'">'.$langs->trans("Check").''; + } + else + { + print 'dispatchlineid.'">'.$langs->trans("Uncheck").''; + } + print '
'; diff --git a/htdocs/langs/en_US/errors.lang b/htdocs/langs/en_US/errors.lang index be75e3a96a3..3d83901194b 100755 --- a/htdocs/langs/en_US/errors.lang +++ b/htdocs/langs/en_US/errors.lang @@ -160,6 +160,7 @@ ErrorPriceExpressionInternal=Internal error '%s' ErrorPriceExpressionUnknown=Unknown error '%s' ErrorSrcAndTargetWarehouseMustDiffers=Source and target warehouses must differs ErrorTryToMakeMoveOnProductRequiringBatchData=Error, trying to make a stock movement without batch/serial information, on a product requiring batch/serial information +ErrorCantSetReceptionToTotalDoneWithReceptionToApprove=All recorded receptions must first be verified before being allowed to do this action # Warnings WarningMandatorySetupNotComplete=Mandatory setup parameters are not yet defined diff --git a/htdocs/langs/en_US/main.lang b/htdocs/langs/en_US/main.lang index be893d52569..551807aad59 100644 --- a/htdocs/langs/en_US/main.lang +++ b/htdocs/langs/en_US/main.lang @@ -159,6 +159,7 @@ Search=Search SearchOf=Search Valid=Valid Approve=Approve +Disapprove=Disapprove ReOpen=Re-Open Upload=Send file ToLink=Link @@ -524,6 +525,7 @@ DateFromTo=From %s to %s DateFrom=From %s DateUntil=Until %s Check=Check +Uncheck=Uncheck Internal=Internal External=External Internals=Internal diff --git a/htdocs/langs/en_US/orders.lang b/htdocs/langs/en_US/orders.lang index 4f6e0b0dfb2..ea3659b90de 100644 --- a/htdocs/langs/en_US/orders.lang +++ b/htdocs/langs/en_US/orders.lang @@ -42,6 +42,7 @@ StatusOrderCanceled=Canceled StatusOrderDraft=Draft (needs to be validated) StatusOrderValidated=Validated StatusOrderOnProcess=Ordered - Standby reception +StatusOrderOnProcessWithValidation=Ordered - Standby reception or validation StatusOrderProcessed=Processed StatusOrderToBill=Delivered StatusOrderToBill2=To bill diff --git a/htdocs/theme/eldy/style.css.php b/htdocs/theme/eldy/style.css.php index ccf54a6f9b5..206b1df019e 100644 --- a/htdocs/theme/eldy/style.css.php +++ b/htdocs/theme/eldy/style.css.php @@ -361,6 +361,15 @@ fieldset { border: 1px solid #AAAAAA !important; box-shadow: 2px 2px 3px #DDD; } -moz-box-shadow: none; cursor: auto; } +.buttonRefused { + pointer-events: none; + cursor: default; + opacity: 0.4; + filter: alpha(opacity=40); /* For IE8 and earlier */ + box-shadow: none; + -webkit-box-shadow: none; + -moz-box-shadow: none; +} form { padding:0px; margin:0px; From 3e4845635962e323eb9d61ff53e54b1875dee8fc Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 8 Mar 2015 02:13:47 +0100 Subject: [PATCH 272/287] Fix when no price defined, we must how nothing instead of 0 --- htdocs/fourn/product/list.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/htdocs/fourn/product/list.php b/htdocs/fourn/product/list.php index afaf4c8e796..33e1ea46dd9 100644 --- a/htdocs/fourn/product/list.php +++ b/htdocs/fourn/product/list.php @@ -125,7 +125,7 @@ if (empty($conf->global->MAIN_DISABLE_FULL_SCANLIST)) $result = $db->query($sql); $nbtotalofrecords = $db->num_rows($result); } -$sql .= " ORDER BY ".$sortfield." ".$sortorder; +$sql .= $db->order($sortfield,$sortorder); $sql .= $db->plimit($limit + 1, $offset); dol_syslog("fourn/product/list.php:", LOG_DEBUG); @@ -225,11 +225,11 @@ if ($resql) if ($companystatic->id > 0) print $companystatic->getNomUrl(1,'supplier'); print ''.price($objp->price).''.(isset($objp->price) ? price($objp->price) : '').''.$objp->qty.''.price($objp->unitprice).''.(isset($objp->unitprice) ? price($objp->unitprice) : '').'
'.$langs->trans("None").'
'.$langs->trans("None").'
'; - $disabled=''; - if ($commande->statut == 5) $disabled=1; - if (empty($objp->status)) + if ((empty($conf->global->MAIN_USE_ADVANCED_PERMS) && empty($user->rights->fournisseur->commande->receptionner)) + || (! empty($conf->global->MAIN_USE_ADVANCED_PERMS) && empty($user->rights->fournisseur->commande_advance->check)) + ) { - print 'dispatchlineid.'">'.$langs->trans("Check").''; + if (empty($objp->status)) + { + print ''.$langs->trans("Check").''; + } + else + { + print ''.$langs->trans("Uncheck").''; + } } - else + else { - print 'dispatchlineid.'">'.$langs->trans("Uncheck").''; + $disabled=''; + if ($commande->statut == 5) $disabled=1; + if (empty($objp->status)) + { + print 'dispatchlineid.'">'.$langs->trans("Check").''; + } + else + { + print 'dispatchlineid.'">'.$langs->trans("Uncheck").''; + } } print '
'; // Affiche lignes des permissions diff --git a/htdocs/commande/card.php b/htdocs/commande/card.php index 5f6c085831f..bef752f5954 100644 --- a/htdocs/commande/card.php +++ b/htdocs/commande/card.php @@ -2243,7 +2243,11 @@ if ($action == 'create' && $user->rights->commande->creer) } // Cancel order - if ($object->statut == 1 && $user->rights->commande->annuler) { + if ($object->statut == 1 && + ((empty($conf->global->MAIN_USE_ADVANCED_PERMS) && ! empty($user->rights->commande->cloturer)) + || (! empty($conf->global->MAIN_USE_ADVANCED_PERMS) && ! empty($user->rights->commande->order_advance->annuler))) + ) + { print ''; } diff --git a/htdocs/core/modules/modAskPriceSupplier.class.php b/htdocs/core/modules/modAskPriceSupplier.class.php index d415d615756..4614b0b819d 100644 --- a/htdocs/core/modules/modAskPriceSupplier.class.php +++ b/htdocs/core/modules/modAskPriceSupplier.class.php @@ -1,6 +1,6 @@ - * Copyright (C) 2004-2010 Laurent Destailleur + * Copyright (C) 2004-2015 Laurent Destailleur * Copyright (C) 2004 Sebastien Di Cintio * Copyright (C) 2004 Benoit Mortier * Copyright (C) 2005-2012 Regis Houssin @@ -21,11 +21,11 @@ */ /** - * \defgroup askpricesupplier Module de demandes de prix fournisseurs - * \brief Module pour gerer la tenue des demandes fournisseurs + * \defgroup askpricesupplier Module to request supplier price proposals + * \brief Module to request supplier price proposals * \file htdocs/core/modules/modAskPriceSupplier.class.php * \ingroup askpricesupplier - * \brief Fichier de description et activation du module AskPriceSupplier + * \brief File to describe and activate module AskPriceSupplier */ include_once DOL_DOCUMENT_ROOT .'/core/modules/DolibarrModules.class.php'; diff --git a/htdocs/core/modules/modCommande.class.php b/htdocs/core/modules/modCommande.class.php index c7fb5cfa587..53584e419eb 100644 --- a/htdocs/core/modules/modCommande.class.php +++ b/htdocs/core/modules/modCommande.class.php @@ -151,8 +151,9 @@ class modCommande extends DolibarrModules $this->rights[$r][1] = 'Annuler les commandes clients'; $this->rights[$r][2] = 'd'; $this->rights[$r][3] = 0; - $this->rights[$r][4] = 'annuler'; - + $this->rights[$r][4] = 'order_advance'; + $this->rights[$r][5] = 'annuler'; + $r++; $this->rights[$r][0] = 89; $this->rights[$r][1] = 'Supprimer les commandes clients'; diff --git a/htdocs/core/modules/modFournisseur.class.php b/htdocs/core/modules/modFournisseur.class.php index 84e6385694d..98986a045da 100644 --- a/htdocs/core/modules/modFournisseur.class.php +++ b/htdocs/core/modules/modFournisseur.class.php @@ -180,7 +180,7 @@ class modFournisseur extends DolibarrModules $r++; $this->rights[$r][0] = 1189; $this->rights[$r][1] = 'Check/Uncheck a supplier order reception'; - $this->rights[$r][2] = 'd'; + $this->rights[$r][2] = 'w'; $this->rights[$r][3] = 0; $this->rights[$r][4] = 'commande_advance'; $this->rights[$r][5] = 'check'; diff --git a/htdocs/langs/en_US/admin.lang b/htdocs/langs/en_US/admin.lang index e701db32106..b8590a1fc38 100755 --- a/htdocs/langs/en_US/admin.lang +++ b/htdocs/langs/en_US/admin.lang @@ -500,6 +500,8 @@ Module700Name=Donations Module700Desc=Donation management Module770Name=Expense Report Module770Desc=Management and claim expense reports (transportation, meal, ...) +Module1120Name=Supplier commercial proposal +Module1120Desc=Request supplier commercial proposal and prices Module1200Name=Mantis Module1200Desc=Mantis integration Module1400Name=Accounting diff --git a/htdocs/user/perms.php b/htdocs/user/perms.php index b63b3e65ffc..a01b5ffa7ab 100644 --- a/htdocs/user/perms.php +++ b/htdocs/user/perms.php @@ -1,24 +1,24 @@ * Copyright (C) 2002-2003 Jean-Louis Bergamo - * Copyright (C) 2004-2012 Laurent Destailleur - * Copyright (C) 2004 Eric Seigne - * Copyright (C) 2005-2012 Regis Houssin - * Copyright (C) 2012 Juanjo Menent - * - * 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 3 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, see . - */ +* Copyright (C) 2004-2012 Laurent Destailleur +* Copyright (C) 2004 Eric Seigne +* Copyright (C) 2005-2012 Regis Houssin +* Copyright (C) 2012 Juanjo Menent +* +* 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 3 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, see . +*/ /** * \file htdocs/user/perms.php @@ -74,10 +74,10 @@ if ($user->id <> $id && ! $canreaduser) accessforbidden(); if ($action == 'addrights' && $caneditperms) { - $edituser = new User($db); + $edituser = new User($db); $edituser->fetch($id); - //$edituser->addrights($rights, $module, '', $entity); // TODO unused for the moment - $edituser->addrights($rights, $module); + //$edituser->addrights($rights, $module, '', $entity); // TODO unused for the moment + $edituser->addrights($rights, $module); // Si on a touche a ses propres droits, on recharge if ($id == $user->id) @@ -90,10 +90,10 @@ if ($action == 'addrights' && $caneditperms) if ($action == 'delrights' && $caneditperms) { - $edituser = new User($db); + $edituser = new User($db); $edituser->fetch($id); - //$edituser->delrights($rights, $module, '', $entity); // TODO unused for the moment - $edituser->delrights($rights, $module); + //$edituser->delrights($rights, $module, '', $entity); // TODO unused for the moment + $edituser->delrights($rights, $module); // Si on a touche a ses propres droits, on recharge if ($id == $user->id) @@ -133,39 +133,39 @@ $modulesdir = dolGetModulesDirs(); foreach($modulesdir as $dir) { $handle=@opendir(dol_osencode($dir)); - if (is_resource($handle)) - { - while (($file = readdir($handle))!==false) - { - if (is_readable($dir.$file) && substr($file, 0, 3) == 'mod' && substr($file, dol_strlen($file) - 10) == '.class.php') - { - $modName = substr($file, 0, dol_strlen($file) - 10); + if (is_resource($handle)) + { + while (($file = readdir($handle))!==false) + { + if (is_readable($dir.$file) && substr($file, 0, 3) == 'mod' && substr($file, dol_strlen($file) - 10) == '.class.php') + { + $modName = substr($file, 0, dol_strlen($file) - 10); - if ($modName) - { - include_once $dir.$file; - $objMod = new $modName($db); + if ($modName) + { + include_once $dir.$file; + $objMod = new $modName($db); - // Load all lang files of module - if (isset($objMod->langfiles) && is_array($objMod->langfiles)) - { - foreach($objMod->langfiles as $domain) - { - $langs->load($domain); - } - } - // Load all permissions - if ($objMod->rights_class) - { - $forceEntity=((! empty($conf->multicompany->enabled) && ! empty($fuser->entity)) ? $fuser->entity : null); - $ret=$objMod->insert_permissions(0, $forceEntity); - $modules[$objMod->rights_class]=$objMod; - //print "modules[".$objMod->rights_class."]=$objMod;"; - } - } - } - } - } + // Load all lang files of module + if (isset($objMod->langfiles) && is_array($objMod->langfiles)) + { + foreach($objMod->langfiles as $domain) + { + $langs->load($domain); + } + } + // Load all permissions + if ($objMod->rights_class) + { + $forceEntity=((! empty($conf->multicompany->enabled) && ! empty($fuser->entity)) ? $fuser->entity : null); + $ret=$objMod->insert_permissions(0, $forceEntity); + $modules[$objMod->rights_class]=$objMod; + //print "modules[".$objMod->rights_class."]=$objMod;"; + } + } + } + } + } } $db->commit(); @@ -195,19 +195,19 @@ dol_syslog("get user perms", LOG_DEBUG); $result=$db->query($sql); if ($result) { - $num = $db->num_rows($result); - $i = 0; - while ($i < $num) - { - $obj = $db->fetch_object($result); - array_push($permsuser,$obj->id); - $i++; - } - $db->free($result); + $num = $db->num_rows($result); + $i = 0; + while ($i < $num) + { + $obj = $db->fetch_object($result); + array_push($permsuser,$obj->id); + $i++; + } + $db->free($result); } else { - dol_print_error($db); + dol_print_error($db); } // Lecture des droits groupes @@ -231,27 +231,27 @@ dol_syslog("get user perms", LOG_DEBUG); $result=$db->query($sql); if ($result) { - $num = $db->num_rows($result); - $i = 0; - while ($i < $num) - { - $obj = $db->fetch_object($result); - if (! isset($permsgroupbyentity[$obj->entity])) - $permsgroupbyentity[$obj->entity] = array(); - array_push($permsgroupbyentity[$obj->entity], $obj->id); - $i++; - } - $db->free($result); + $num = $db->num_rows($result); + $i = 0; + while ($i < $num) + { + $obj = $db->fetch_object($result); + if (! isset($permsgroupbyentity[$obj->entity])) + $permsgroupbyentity[$obj->entity] = array(); + array_push($permsgroupbyentity[$obj->entity], $obj->id); + $i++; + } + $db->free($result); } else { - dol_print_error($db); + dol_print_error($db); } /* * Ecran ajout/suppression permission - */ +*/ print '
'; @@ -274,9 +274,9 @@ print ''."\n"; print '

'; -if ($user->admin) print info_admin($langs->trans("WarningOnlyPermissionOfActivatedModules"), 0, 1).'
'; +if ($user->admin) print info_admin($langs->trans("WarningOnlyPermissionOfActivatedModules")); // Show warning about external users -if (empty($user->societe_id)) print info_admin(showModulesExludedForExternal($modules)).'

'."\n"; +if (empty($user->societe_id)) print info_admin(showModulesExludedForExternal($modules))."\n"; // For multicompany transversal mode // TODO Place a hook here @@ -310,115 +310,115 @@ $sql.= " ORDER BY r.module, r.id"; $result=$db->query($sql); if ($result) { - $num = $db->num_rows($result); - $i = 0; - $var = True; - $oldmod=''; + $num = $db->num_rows($result); + $i = 0; + $var = True; + $oldmod=''; - while ($i < $num) - { - $obj = $db->fetch_object($result); + while ($i < $num) + { + $obj = $db->fetch_object($result); - // Si la ligne correspond a un module qui n'existe plus (absent de includes/module), on l'ignore - if (empty($modules[$obj->module])) - { - $i++; - continue; - } + // Si la ligne correspond a un module qui n'existe plus (absent de includes/module), on l'ignore + if (empty($modules[$obj->module])) + { + $i++; + continue; + } - if (isset($obj->module) && ($oldmod <> $obj->module)) - { - $oldmod = $obj->module; - $var = !$var; + if (isset($obj->module) && ($oldmod <> $obj->module)) + { + $oldmod = $obj->module; + $var = !$var; - // Rupture detectee, on recupere objMod - $objMod=$modules[$obj->module]; - $picto=($objMod->picto?$objMod->picto:'generic'); + // Rupture detectee, on recupere objMod + $objMod=$modules[$obj->module]; + $picto=($objMod->picto?$objMod->picto:'generic'); - if ($caneditperms && (empty($objMod->rights_admin_allowed) || empty($fuser->admin))) - { - // On affiche ligne pour modifier droits - print ''; - print ''.img_object('',$picto).' '.$objMod->getName(); - print ' '; - print ''; - print ''.$langs->trans("All").""; - print '/'; - print ''.$langs->trans("None").""; - print ''; - print ' '; - print ''."\n"; - } - } + if ($caneditperms && (empty($objMod->rights_admin_allowed) || empty($fuser->admin))) + { + // On affiche ligne pour modifier droits + print ''; + print ''.img_object('',$picto).' '.$objMod->getName(); + print ' '; + print ''; + print ''.$langs->trans("All").""; + print '/'; + print ''.$langs->trans("None").""; + print ''; + print ' '; + print ''."\n"; + } + } - print ''; + print ''; - // Picto and label of permission - print ''.img_object('',$picto).' '.$objMod->getName().''; + // Picto and label of permission + print ''.img_object('',$picto).' '.$objMod->getName().''; - // Permission and tick - if (! empty($fuser->admin) && ! empty($objMod->rights_admin_allowed)) // Permission own because admin - { - if ($caneditperms) - { - print ''.img_picto($langs->trans("Administrator"),'star').''; - } - print ''; - print img_picto($langs->trans("Active"),'tick'); - print ''; - } - else if (in_array($obj->id, $permsuser)) // Permission own by user - { - if ($caneditperms) - { - print ''.img_edit_remove($langs->trans("Remove")).''; - } - print ''; - print img_picto($langs->trans("Active"),'tick'); - print ''; - } + // Permission and tick + if (! empty($fuser->admin) && ! empty($objMod->rights_admin_allowed)) // Permission own because admin + { + if ($caneditperms) + { + print ''.img_picto($langs->trans("Administrator"),'star').''; + } + print ''; + print img_picto($langs->trans("Active"),'tick'); + print ''; + } + else if (in_array($obj->id, $permsuser)) // Permission own by user + { + if ($caneditperms) + { + print ''.img_edit_remove($langs->trans("Remove")).''; + } + print ''; + print img_picto($langs->trans("Active"),'tick'); + print ''; + } - else if (is_array($permsgroupbyentity[$entity])) - { - if (in_array($obj->id, $permsgroupbyentity[$entity])) // Permission own by group - { - if ($caneditperms) - { - print ''; - print $form->textwithtooltip($langs->trans("Inherited"),$langs->trans("PermissionInheritedFromAGroup")); - print ''; - } - print ''; - print img_picto($langs->trans("Active"),'tick'); - print ''; - } - else - { - // Do not own permission - if ($caneditperms) - { - print ''.img_edit_add($langs->trans("Add")).''; - } - print ' '; - } - } - else - { - // Do not own permission - if ($caneditperms) - { - print ''.img_edit_add($langs->trans("Add")).''; - } - print ' '; - } + else if (is_array($permsgroupbyentity[$entity])) + { + if (in_array($obj->id, $permsgroupbyentity[$entity])) // Permission own by group + { + if ($caneditperms) + { + print ''; + print $form->textwithtooltip($langs->trans("Inherited"),$langs->trans("PermissionInheritedFromAGroup")); + print ''; + } + print ''; + print img_picto($langs->trans("Active"),'tick'); + print ''; + } + else + { + // Do not own permission + if ($caneditperms) + { + print ''.img_edit_add($langs->trans("Add")).''; + } + print ' '; + } + } + else + { + // Do not own permission + if ($caneditperms) + { + print ''.img_edit_add($langs->trans("Add")).''; + } + print ' '; + } - $perm_libelle=($conf->global->MAIN_USE_ADVANCED_PERMS && ($langs->trans("PermissionAdvanced".$obj->id)!=("PermissionAdvanced".$obj->id))?$langs->trans("PermissionAdvanced".$obj->id):(($langs->trans("Permission".$obj->id)!=("Permission".$obj->id))?$langs->trans("Permission".$obj->id):$obj->libelle)); - print ''.$perm_libelle. ''; + $perm_libelle=($conf->global->MAIN_USE_ADVANCED_PERMS && ($langs->trans("PermissionAdvanced".$obj->id)!=("PermissionAdvanced".$obj->id))?$langs->trans("PermissionAdvanced".$obj->id):(($langs->trans("Permission".$obj->id)!=("Permission".$obj->id))?$langs->trans("Permission".$obj->id):$obj->libelle)); + print ''.$perm_libelle. ''; - print ''."\n"; + print ''."\n"; - $i++; - } + $i++; + } } else dol_print_error($db); print ''; From 94acbeaa221f8233250ca216a97bf9c824615b16 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 9 Mar 2015 21:40:24 +0100 Subject: [PATCH 279/287] Prepare perms on extrafields --- htdocs/core/class/extrafields.class.php | 37 +++++++++++++------ .../install/mysql/migration/3.7.0-3.8.0.sql | 2 + .../install/mysql/tables/llx_extrafields.sql | 1 + 3 files changed, 28 insertions(+), 12 deletions(-) diff --git a/htdocs/core/class/extrafields.class.php b/htdocs/core/class/extrafields.class.php index f1ad5d6687f..e7cc87efef5 100644 --- a/htdocs/core/class/extrafields.class.php +++ b/htdocs/core/class/extrafields.class.php @@ -48,11 +48,13 @@ class ExtraFields var $attribute_required; // Array to store parameters of attribute (used in select type) var $attribute_param; - // Int to store position of attribute + // Array to store position of attribute var $attribute_pos; - // Int to store if attribute is editable regardless of the document status + // Array to store if attribute is editable regardless of the document status var $attribute_alwayseditable; - + // Array to store permission to check + var $attribute_perms; + var $error; var $errno; @@ -90,6 +92,7 @@ class ExtraFields $this->attribute_elementtype = array(); $this->attribute_unique = array(); $this->attribute_required = array(); + $this->attribute_perms = array(); } /** @@ -106,9 +109,10 @@ class ExtraFields * @param string $default_value Defaulted value * @param array $param Params for field * @param int $alwayseditable Is attribute always editable regardless of the document status + * @param string $perms Permission to check * @return int <=0 if KO, >0 if OK */ - function addExtraField($attrname, $label, $type, $pos, $size, $elementtype, $unique=0, $required=0, $default_value='', $param=0, $alwayseditable=0) + function addExtraField($attrname, $label, $type, $pos, $size, $elementtype, $unique=0, $required=0, $default_value='', $param=0, $alwayseditable=0, $perms='') { if (empty($attrname)) return -1; if (empty($label)) return -1; @@ -124,7 +128,7 @@ class ExtraFields if ($result > 0 || $err1 == 'DB_ERROR_COLUMN_ALREADY_EXISTS' || $type == 'separate') { // Add declaration of field into table - $result2=$this->create_label($attrname,$label,$type,$pos,$size,$elementtype, $unique, $required, $param, $alwayseditable); + $result2=$this->create_label($attrname,$label,$type,$pos,$size,$elementtype, $unique, $required, $param, $alwayseditable, $perms); $err2=$this->errno; if ($result2 > 0 || ($err1 == 'DB_ERROR_COLUMN_ALREADY_EXISTS' && $err2 == 'DB_ERROR_RECORD_ALREADY_EXISTS')) { @@ -225,9 +229,10 @@ class ExtraFields * @param int $required Is field required or not * @param array||string $param Params for field (ex for select list : array('options' => array(value'=>'label of option')) ) * @param int $alwayseditable Is attribute always editable regardless of the document status + * @param string $perms Permission to check * @return int <=0 if KO, >0 if OK */ - private function create_label($attrname, $label='', $type='', $pos=0, $size=0, $elementtype='member', $unique=0, $required=0, $param='', $alwayseditable=0) + private function create_label($attrname, $label='', $type='', $pos=0, $size=0, $elementtype='member', $unique=0, $required=0, $param='', $alwayseditable=0, $perms='') { global $conf; @@ -251,7 +256,7 @@ class ExtraFields $params=''; } - $sql = "INSERT INTO ".MAIN_DB_PREFIX."extrafields(name, label, type, pos, size, entity, elementtype, fieldunique, fieldrequired, param, alwayseditable)"; + $sql = "INSERT INTO ".MAIN_DB_PREFIX."extrafields(name, label, type, pos, size, entity, elementtype, fieldunique, fieldrequired, param, alwayseditable, perms)"; $sql.= " VALUES('".$attrname."',"; $sql.= " '".$this->db->escape($label)."',"; $sql.= " '".$type."',"; @@ -263,6 +268,7 @@ class ExtraFields $sql.= " '".$required."',"; $sql.= " '".$params."',"; $sql.= " '".$alwayseditable."'"; + $sql.= " ".($perms?"'".$this->db->escape($perms)."'":"null"); $sql.=')'; dol_syslog(get_class($this)."::create_label", LOG_DEBUG); @@ -363,9 +369,10 @@ class ExtraFields * @param int $pos Position of attribute * @param array $param Params for field (ex for select list : array('options' => array(value'=>'label of option')) ) * @param int $alwayseditable Is attribute always editable regardless of the document status + * @param string $perms Permission to check * @return int >0 if OK, <=0 if KO */ - function update($attrname,$label,$type,$length,$elementtype,$unique=0,$required=0,$pos=0,$param='',$alwayseditable=0) + function update($attrname,$label,$type,$length,$elementtype,$unique=0,$required=0,$pos=0,$param='',$alwayseditable=0, $perms='') { if ($elementtype == 'thirdparty') $elementtype='societe'; @@ -402,7 +409,7 @@ class ExtraFields { if ($label) { - $result=$this->update_label($attrname,$label,$type,$length,$elementtype,$unique,$required,$pos,$param,$alwayseditable); + $result=$this->update_label($attrname,$label,$type,$length,$elementtype,$unique,$required,$pos,$param,$alwayseditable,$perms); } if ($result > 0) { @@ -451,12 +458,13 @@ class ExtraFields * @param int $pos Position of attribute * @param array $param Params for field (ex for select list : array('options' => array(value'=>'label of option')) ) * @param int $alwayseditable Is attribute always editable regardless of the document status + * @param string $perms Permission to check * @return int <=0 if KO, >0 if OK */ - private function update_label($attrname,$label,$type,$size,$elementtype,$unique=0,$required=0,$pos=0,$param='',$alwayseditable=0) + private function update_label($attrname,$label,$type,$size,$elementtype,$unique=0,$required=0,$pos=0,$param='',$alwayseditable=0,$perms='') { global $conf; - dol_syslog(get_class($this)."::update_label ".$attrname.", ".$label.", ".$type.", ".$size.", ".$elementtype.", ".$unique.", ".$required); + dol_syslog(get_class($this)."::update_label ".$attrname.", ".$label.", ".$type.", ".$size.", ".$elementtype.", ".$unique.", ".$required.", ".$pos.", ".$alwayseditable.", ".$perms); if ($elementtype == 'thirdparty') $elementtype='societe'; @@ -485,6 +493,7 @@ class ExtraFields $sql.= " elementtype,"; $sql.= " fieldunique,"; $sql.= " fieldrequired,"; + $sql.= " perms,"; $sql.= " pos,"; $sql.= " alwayseditable,"; $sql.= " param"; @@ -497,6 +506,7 @@ class ExtraFields $sql.= " '".$elementtype."',"; $sql.= " '".$unique."',"; $sql.= " '".$required."',"; + $sql.= " ".($perms?"'".$this->db->escape($perms)."'":"null"); $sql.= " '".$pos."',"; $sql.= " '".$alwayseditable."',"; $sql.= " '".$param."'"; @@ -542,7 +552,7 @@ class ExtraFields // For avoid conflicts with external modules if (!$forceload && !empty($conf->global->MAIN_EXTRAFIELDS_DISABLED)) return $array_name_label; - $sql = "SELECT rowid,name,label,type,size,elementtype,fieldunique,fieldrequired,param,pos,alwayseditable"; + $sql = "SELECT rowid,name,label,type,size,elementtype,fieldunique,fieldrequired,param,pos,alwayseditable,perms"; $sql.= " FROM ".MAIN_DB_PREFIX."extrafields"; $sql.= " WHERE entity IN (0,".$conf->entity.")"; if ($elementtype) $sql.= " AND elementtype = '".$elementtype."'"; @@ -571,6 +581,7 @@ class ExtraFields $this->attribute_param[$tab->name]=unserialize($tab->param); $this->attribute_pos[$tab->name]=$tab->pos; $this->attribute_alwayseditable[$tab->name]=$tab->alwayseditable; + $this->attribute_perms[$tab->name]=$tab->perms; } } } @@ -603,6 +614,7 @@ class ExtraFields $unique=$this->attribute_unique[$key]; $required=$this->attribute_required[$key]; $param=$this->attribute_param[$key]; + $perms=$this->attribute_perms[$key]; if ($type == 'date') { $showsize=10; @@ -1040,6 +1052,7 @@ class ExtraFields $unique=$this->attribute_unique[$key]; $required=$this->attribute_required[$key]; $params=$this->attribute_param[$key]; + $perms=$this->attribute_perms[$key]; if ($type == 'date') { $showsize=10; diff --git a/htdocs/install/mysql/migration/3.7.0-3.8.0.sql b/htdocs/install/mysql/migration/3.7.0-3.8.0.sql index 2a36ef78737..22890a149ce 100755 --- a/htdocs/install/mysql/migration/3.7.0-3.8.0.sql +++ b/htdocs/install/mysql/migration/3.7.0-3.8.0.sql @@ -19,6 +19,8 @@ -- -- VMYSQL4.1 DELETE FROM llx_usergroup_user WHERE fk_usergroup NOT IN (SELECT rowid from llx_usergroup); +ALTER TABLE llx_extrafields ADD COLUMN perms varchar(255) after fieldrequired; + UPDATE llx_projet_task_time SET task_datehour = task_date where task_datehour IS NULL; ALTER TABLE llx_projet_task_time ADD COLUMN task_date_withhour integer DEFAULT 0 after task_datehour; diff --git a/htdocs/install/mysql/tables/llx_extrafields.sql b/htdocs/install/mysql/tables/llx_extrafields.sql index f91d21fedb1..11271125508 100644 --- a/htdocs/install/mysql/tables/llx_extrafields.sql +++ b/htdocs/install/mysql/tables/llx_extrafields.sql @@ -29,6 +29,7 @@ create table llx_extrafields size varchar(8) DEFAULT NULL, fieldunique integer DEFAULT 0, fieldrequired integer DEFAULT 0, + perms varchar(255), pos integer DEFAULT 0, alwayseditable integer DEFAULT 0, param text From 90abe5cdf97afcc9124fc02019e8eac75eb2e546 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 10 Mar 2015 09:29:24 +0100 Subject: [PATCH 280/287] NEW: Add current salary on list of payment --- htdocs/compta/salaries/index.php | 22 ++++++++++++++++------ htdocs/langs/en_US/salaries.lang | 1 + 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/htdocs/compta/salaries/index.php b/htdocs/compta/salaries/index.php index 678b3bfaa2e..79d139255c2 100644 --- a/htdocs/compta/salaries/index.php +++ b/htdocs/compta/salaries/index.php @@ -1,5 +1,6 @@ +/* Copyright (C) 2011-2014 Alexandre Spangaro + * Copyright (C) 2015 Laurent Destailleur * * 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 @@ -82,7 +83,7 @@ $form = new Form($db); $salstatic = new PaymentSalary($db); $userstatic = new User($db); -$sql = "SELECT u.rowid as uid, u.lastname, u.firstname, s.rowid, s.fk_user, s.amount, s.label, s.datev as dm, s.fk_typepayment as type, s.num_payment,"; +$sql = "SELECT u.rowid as uid, u.lastname, u.firstname, u.salary, s.rowid, s.fk_user, s.amount, s.label, s.datev as dm, s.fk_typepayment as type, s.num_payment,"; $sql.= " pst.code as payment_code"; $sql.= " FROM ".MAIN_DB_PREFIX."payment_salary as s"; $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."c_paiement as pst ON s.fk_typepayment = pst.id,"; @@ -93,7 +94,7 @@ $sql.= " AND s.entity = ".$conf->entity; // Search criteria if ($search_ref) $sql.=" AND s.rowid=".$search_ref; if ($search_label) $sql.=" AND s.label LIKE '%".$db->escape($search_label)."%'"; -if ($search_amount) $sql.=" AND s.amount='".$db->escape(price2num(trim($search_amount)))."'"; +if ($search_amount) $sql.=natural_search("s.amount", $search_amount, 1); if ($filtre) { $filtre=str_replace(":","=",$filtre); $sql .= " AND ".$filtre; @@ -124,9 +125,10 @@ if ($result) print ''; print_liste_field_titre($langs->trans("Ref"),$_SERVER["PHP_SELF"],"s.rowid","",$param,"",$sortfield,$sortorder); print_liste_field_titre($langs->trans("Person"),$_SERVER["PHP_SELF"],"u.rowid","",$param,"",$sortfield,$sortorder); + print_liste_field_titre($langs->trans("CurrentSalary"),$_SERVER["PHP_SELF"],"u.salary","",$param,"",$sortfield,$sortorder); print_liste_field_titre($langs->trans("Label"),$_SERVER["PHP_SELF"],"s.label","",$param,'align="left"',$sortfield,$sortorder); print_liste_field_titre($langs->trans("DatePayment"),$_SERVER["PHP_SELF"],"s.datev","",$param,'align="left"',$sortfield,$sortorder); - print_liste_field_titre($langs->trans("Type"),$_SERVER["PHP_SELF"],"type","",$param,'align="left"',$sortfield,$sortorder); + print_liste_field_titre($langs->trans("PaymentMode"),$_SERVER["PHP_SELF"],"type","",$param,'align="left"',$sortfield,$sortorder); print_liste_field_titre($langs->trans("PayedByThisPayment"),$_SERVER["PHP_SELF"],"s.amount","",$param,'align="right"',$sortfield,$sortorder); print_liste_field_titre(""); print "\n"; @@ -136,6 +138,9 @@ if ($result) print ''; print ''; print ''; + // People + print ' '; + // Current salary print ' '; // Label print ''; @@ -161,8 +166,13 @@ if ($result) $userstatic->firstname=$obj->firstname; $salstatic->id=$obj->rowid; $salstatic->ref=$obj->rowid; - print "".$salstatic->getNomUrl(1)."\n"; + // Ref + print "".$salstatic->getNomUrl(1)."\n"; + // User name print "".$userstatic->getNomUrl(1)."\n"; + // Current salary + print "".($obj->salary?price($obj->salary):'')."\n"; + // Label payment print "".dol_trunc($obj->label,40)."\n"; print ''.dol_print_date($db->jdate($obj->dm),'day')."\n"; // Type @@ -176,7 +186,7 @@ if ($result) $i++; } - print ''.$langs->trans("Total").''; + print ''.$langs->trans("Total").''; print ''.price($total,0,$outputlangs,1,-1,-1,$conf->currency).""; print " "; diff --git a/htdocs/langs/en_US/salaries.lang b/htdocs/langs/en_US/salaries.lang index 0087cbe83e6..0f5f636a3f3 100644 --- a/htdocs/langs/en_US/salaries.lang +++ b/htdocs/langs/en_US/salaries.lang @@ -10,3 +10,4 @@ SalariesPayments=Salaries payments ShowSalaryPayment=Show salary payment THM=Average hourly price TJM=Average daily price +CurrentSalary=Current salary \ No newline at end of file From dc300922906d939c2a5aea5d02618c61d93fb28c Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 10 Mar 2015 10:11:51 +0100 Subject: [PATCH 281/287] Add column to store salary ref when doing payment. --- htdocs/compta/charges/index.php | 15 ++++++++------- htdocs/compta/salaries/card.php | 9 +++++++-- .../compta/salaries/class/paymentsalary.class.php | 4 +++- htdocs/compta/salaries/index.php | 9 +++++++-- htdocs/install/mysql/migration/3.7.0-3.8.0.sql | 2 ++ .../install/mysql/tables/llx_payment_salary.sql | 1 + 6 files changed, 28 insertions(+), 12 deletions(-) diff --git a/htdocs/compta/charges/index.php b/htdocs/compta/charges/index.php index ca03e11bcba..eb10fce7768 100644 --- a/htdocs/compta/charges/index.php +++ b/htdocs/compta/charges/index.php @@ -93,9 +93,10 @@ if ($conf->salaries->enabled) print_fiche_titre($langs->trans("SalariesPayments").($year?' ('.$langs->trans("Year").' '.$year.')':''), '', ''); - $sql = "SELECT s.rowid, s.amount, s.label, s.datev as dm"; - $sql.= " FROM ".MAIN_DB_PREFIX."payment_salary as s"; - $sql.= " WHERE s.entity = ".$conf->entity; + $sql = "SELECT s.rowid, s.amount, s.label, s.datev as dm, s.salary, u.salary as current_salary"; + $sql.= " FROM ".MAIN_DB_PREFIX."payment_salary as s, ".MAIN_DB_PREFIX."user as u"; + $sql.= " WHERE s.entity IN (".getEntity('user',1).")"; + $sql.= " AND u.rowid = s.fk_user"; if ($year > 0) { // Si period renseignee on l'utilise comme critere de date, sinon on prend date echeance, @@ -132,11 +133,11 @@ if ($conf->salaries->enabled) print "".$obj->label."\n"; - print ''.price($obj->amount).""; + print ''.($obj->salary?price($obj->salary):'').""; // Ref payment - $sal_static->id=$obj->rowid; - $sal_static->ref=$obj->rowid; + $sal_static->id=$obj->rowid; + $sal_static->ref=$obj->rowid; print ''.$sal_static->getNomUrl(1)."\n"; print ''.dol_print_date($db->jdate($obj->dm),'day')."\n"; @@ -146,7 +147,7 @@ if ($conf->salaries->enabled) $i++; } print ''.$langs->trans("Total").''; - print ''.price($total).""; + print ''.""; print ' '; print ' '; print ''.price($total).""; diff --git a/htdocs/compta/salaries/card.php b/htdocs/compta/salaries/card.php index 49c3192fa7f..3bd93659b5e 100644 --- a/htdocs/compta/salaries/card.php +++ b/htdocs/compta/salaries/card.php @@ -67,8 +67,8 @@ if ($action == 'add' && $_POST["cancel"] <> $langs->trans("Cancel")) $datesp=dol_mktime(12,0,0, $_POST["datespmonth"], $_POST["datespday"], $_POST["datespyear"]); $dateep=dol_mktime(12,0,0, $_POST["dateepmonth"], $_POST["dateepday"], $_POST["dateepyear"]); - $sal->accountid=GETPOST("accountid"); - $sal->fk_user=GETPOST("fk_user"); + $sal->accountid=GETPOST("accountid","int"); + $sal->fk_user=GETPOST("fk_user","int"); $sal->datev=$datev; $sal->datep=$datep; $sal->amount=price2num(GETPOST("amount")); @@ -80,6 +80,11 @@ if ($action == 'add' && $_POST["cancel"] <> $langs->trans("Cancel")) $sal->num_payment=GETPOST("num_payment"); $sal->fk_user_creat=$user->id; + // Set user current salary as ref salaray for the payment + $fuser=new User($db); + $fuser->fetch(GETPOST("fk_user","int")); + $sal->salary=$fuser->salary; + if (empty($datep) || empty($datev) || empty($datesp) || empty($dateep)) { setEventMessage($langs->trans("ErrorFieldRequired",$langs->transnoentitiesnoconv("Date")),'errors'); diff --git a/htdocs/compta/salaries/class/paymentsalary.class.php b/htdocs/compta/salaries/class/paymentsalary.class.php index 83a1c937545..f566123809c 100644 --- a/htdocs/compta/salaries/class/paymentsalary.class.php +++ b/htdocs/compta/salaries/class/paymentsalary.class.php @@ -324,6 +324,7 @@ class PaymentSalary extends CommonObject $sql.= ", datep"; $sql.= ", datev"; $sql.= ", amount"; + $sql.= ", salary"; $sql.= ", fk_typepayment"; $sql.= ", num_payment"; if ($this->note) $sql.= ", note"; @@ -338,7 +339,8 @@ class PaymentSalary extends CommonObject $sql.= "'".$this->fk_user."'"; $sql.= ", '".$this->db->idate($this->datep)."'"; $sql.= ", '".$this->db->idate($this->datev)."'"; - $sql.= ", '".$this->amount."'"; + $sql.= ", ".$this->amount; + $sql.= ", ".($this->salary > 0 ? $this->salary : "null"); $sql.= ", '".$this->type_payment."'"; $sql.= ", '".$this->num_payment."'"; if ($this->note) $sql.= ", '".$this->db->escape($this->note)."'"; diff --git a/htdocs/compta/salaries/index.php b/htdocs/compta/salaries/index.php index 79d139255c2..484010c9f03 100644 --- a/htdocs/compta/salaries/index.php +++ b/htdocs/compta/salaries/index.php @@ -83,7 +83,8 @@ $form = new Form($db); $salstatic = new PaymentSalary($db); $userstatic = new User($db); -$sql = "SELECT u.rowid as uid, u.lastname, u.firstname, u.salary, s.rowid, s.fk_user, s.amount, s.label, s.datev as dm, s.fk_typepayment as type, s.num_payment,"; +$sql = "SELECT u.rowid as uid, u.lastname, u.firstname, u.login, u.email, u.admin, u.salary as current_salary, u.fk_societe as fk_soc,"; +$sql.= " s.rowid, s.fk_user, s.amount, s.salary, s.label, s.datev as dm, s.fk_typepayment as type, s.num_payment,"; $sql.= " pst.code as payment_code"; $sql.= " FROM ".MAIN_DB_PREFIX."payment_salary as s"; $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."c_paiement as pst ON s.fk_typepayment = pst.id,"; @@ -125,7 +126,7 @@ if ($result) print ''; print_liste_field_titre($langs->trans("Ref"),$_SERVER["PHP_SELF"],"s.rowid","",$param,"",$sortfield,$sortorder); print_liste_field_titre($langs->trans("Person"),$_SERVER["PHP_SELF"],"u.rowid","",$param,"",$sortfield,$sortorder); - print_liste_field_titre($langs->trans("CurrentSalary"),$_SERVER["PHP_SELF"],"u.salary","",$param,"",$sortfield,$sortorder); + print_liste_field_titre($langs->trans("ExpectedToPay"),$_SERVER["PHP_SELF"],"s.salary","",$param,"",$sortfield,$sortorder); print_liste_field_titre($langs->trans("Label"),$_SERVER["PHP_SELF"],"s.label","",$param,'align="left"',$sortfield,$sortorder); print_liste_field_titre($langs->trans("DatePayment"),$_SERVER["PHP_SELF"],"s.datev","",$param,'align="left"',$sortfield,$sortorder); print_liste_field_titre($langs->trans("PaymentMode"),$_SERVER["PHP_SELF"],"type","",$param,'align="left"',$sortfield,$sortorder); @@ -164,6 +165,10 @@ if ($result) $userstatic->id=$obj->uid; $userstatic->lastname=$obj->lastname; $userstatic->firstname=$obj->firstname; + $userstatic->admin=$obj->admin; + $userstatic->login=$obj->login; + $userstatic->email=$obj->email; + $userstatic->societe_id=$obj->fk_soc; $salstatic->id=$obj->rowid; $salstatic->ref=$obj->rowid; // Ref diff --git a/htdocs/install/mysql/migration/3.7.0-3.8.0.sql b/htdocs/install/mysql/migration/3.7.0-3.8.0.sql index 2a36ef78737..2de1556ed3e 100755 --- a/htdocs/install/mysql/migration/3.7.0-3.8.0.sql +++ b/htdocs/install/mysql/migration/3.7.0-3.8.0.sql @@ -19,6 +19,8 @@ -- -- VMYSQL4.1 DELETE FROM llx_usergroup_user WHERE fk_usergroup NOT IN (SELECT rowid from llx_usergroup); +ALTER TABLE llx_payment_salary ADD COLUMN salary real after datev; + UPDATE llx_projet_task_time SET task_datehour = task_date where task_datehour IS NULL; ALTER TABLE llx_projet_task_time ADD COLUMN task_date_withhour integer DEFAULT 0 after task_datehour; diff --git a/htdocs/install/mysql/tables/llx_payment_salary.sql b/htdocs/install/mysql/tables/llx_payment_salary.sql index b82ff66ecc1..2498c771ba6 100644 --- a/htdocs/install/mysql/tables/llx_payment_salary.sql +++ b/htdocs/install/mysql/tables/llx_payment_salary.sql @@ -23,6 +23,7 @@ create table llx_payment_salary fk_user integer NOT NULL, datep date, -- date de paiement datev date, -- date de valeur + salary real, -- salary of user when payment was done amount real NOT NULL DEFAULT 0, fk_typepayment integer NOT NULL, num_payment varchar(50), From 35dfaf4dd14e0575bef702073e8b84bcbbfbe5ce Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 10 Mar 2015 10:14:24 +0100 Subject: [PATCH 282/287] Natural search on numeric works also with several space after operator --- htdocs/core/lib/functions.lib.php | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php index 509f237b0d6..d7fc398e082 100644 --- a/htdocs/core/lib/functions.lib.php +++ b/htdocs/core/lib/functions.lib.php @@ -4949,7 +4949,7 @@ function dol_getmypid() * Generate natural SQL search string * * @param string|string[] $fields String or array of strings, filled with the name of fields in the SQL query - * @param string $value The value to look for. + * @param string $value The value to look for. * If param $numeric is 0, can contains several keywords separated with a space, like "keyword1 keyword2" = We want record field like keyword1 and field like keyword2 * If param $numeric is 1, can contains an operator <>= like "<10" or ">=100.5 < 1000" * @param string $number 0=value is list of keywords, 1=value is a numeric test @@ -4958,10 +4958,10 @@ function dol_getmypid() function natural_search($fields, $value, $numeric=0) { global $db,$langs; - + if ($numeric) { - $value=preg_replace('/([<>=]+)\s([0-9'.preg_quote($langs->trans("DecimalSeparator"),'/').'\-])/','\1\2',$value); // Clean string '< 10' into '<10' so we can the explode on space to get all tests to do + $value=preg_replace('/([<>=]+)\s+([0-9'.preg_quote($langs->trans("DecimalSeparator"),'/').'\-])/','\1\2',$value); // Clean string '< 10' into '<10' so we can the explode on space to get all tests to do } $crits = explode(' ', $value); $res = ''; @@ -4970,19 +4970,19 @@ function natural_search($fields, $value, $numeric=0) $nboffields = count($fields); $end2 = count($crits); $j = 0; - foreach ($crits as $crit) + foreach ($crits as $crit) { $i = 0; $i2 = 0; $newres = ''; - foreach ($fields as $field) + foreach ($fields as $field) { - if ($numeric) + if ($numeric) { $operator='='; $newcrit = preg_replace('/([<>=]+)/','',trim($crit)); - + preg_match('/([<>=]+)/',trim($crit), $reg); - if ($reg[1]) + if ($reg[1]) { $operator = $reg[1]; } @@ -4992,7 +4992,7 @@ function natural_search($fields, $value, $numeric=0) $i2++; // a criteria was added to string } } - else + else { $newres .= ($i2 > 0 ? ' OR ' : '') . $field . " LIKE '%" . $db->escape(trim($crit)) . "%'"; $i2++; // a criteria was added to string From 194260fc5b45128d851c74660a989edc4f08065c Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 10 Mar 2015 13:25:25 +0100 Subject: [PATCH 283/287] NEW: Add search box for supplier order search. --- htdocs/comm/index.php | 15 +++++++++++++++ htdocs/fourn/commande/list.php | 2 +- htdocs/langs/en_US/orders.lang | 1 + 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/htdocs/comm/index.php b/htdocs/comm/index.php index ea0494866a1..cb5a07c32d3 100644 --- a/htdocs/comm/index.php +++ b/htdocs/comm/index.php @@ -103,6 +103,21 @@ if (! empty($conf->commande->enabled) && $user->rights->commande->lire) print "
\n"; } +// Search supplier order +if (! empty($conf->fournisseur->enabled) && $user->rights->fournisseur->commande->lire) +{ + $var=false; + print '
'; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print "
'.$langs->trans("SearchASupplierOrder").'
'; + print ':
:

\n"; +} + // Search contract if (! empty($conf->contrat->enabled) && $user->rights->contrat->lire) { diff --git a/htdocs/fourn/commande/list.php b/htdocs/fourn/commande/list.php index 7e525a9d080..386caad8134 100644 --- a/htdocs/fourn/commande/list.php +++ b/htdocs/fourn/commande/list.php @@ -140,7 +140,7 @@ if ($search_ttc != '') } if ($sall) { - $sql .= natural_search(array('cf.ref', 'cf.note_public', 'cf.note_private'), $sall); + $sql .= natural_search(array('cf.ref', 'cf.ref_supplier', 'cf.note_public', 'cf.note_private'), $sall); } if ($socid) $sql.= " AND s.rowid = ".$socid; diff --git a/htdocs/langs/en_US/orders.lang b/htdocs/langs/en_US/orders.lang index ea3659b90de..602bd1bda59 100644 --- a/htdocs/langs/en_US/orders.lang +++ b/htdocs/langs/en_US/orders.lang @@ -59,6 +59,7 @@ MenuOrdersToBill=Orders delivered MenuOrdersToBill2=Billable orders SearchOrder=Search order SearchACustomerOrder=Search a customer order +SearchASupplierOrder=Search a supplier order ShipProduct=Ship product Discount=Discount CreateOrder=Create Order From 12be50d4baa4eaa6c693275e38436098fb021bb9 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 10 Mar 2015 13:50:05 +0100 Subject: [PATCH 284/287] Doxygen --- htdocs/core/lib/functions.lib.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php index d7fc398e082..601908bc412 100644 --- a/htdocs/core/lib/functions.lib.php +++ b/htdocs/core/lib/functions.lib.php @@ -4952,7 +4952,7 @@ function dol_getmypid() * @param string $value The value to look for. * If param $numeric is 0, can contains several keywords separated with a space, like "keyword1 keyword2" = We want record field like keyword1 and field like keyword2 * If param $numeric is 1, can contains an operator <>= like "<10" or ">=100.5 < 1000" - * @param string $number 0=value is list of keywords, 1=value is a numeric test + * @param string $numeric 0=value is list of keywords, 1=value is a numeric test * @return string $res The statement to append to the SQL query */ function natural_search($fields, $value, $numeric=0) From 9a3e5d7fc593e985c453a5c58ec9c447b477665f Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 10 Mar 2015 13:58:26 +0100 Subject: [PATCH 285/287] Fix code unreachable --- .../core/modules/askpricesupplier/doc/pdf_aurore.modules.php | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/htdocs/core/modules/askpricesupplier/doc/pdf_aurore.modules.php b/htdocs/core/modules/askpricesupplier/doc/pdf_aurore.modules.php index 2c817314ecb..753c9ad9237 100644 --- a/htdocs/core/modules/askpricesupplier/doc/pdf_aurore.modules.php +++ b/htdocs/core/modules/askpricesupplier/doc/pdf_aurore.modules.php @@ -591,12 +591,9 @@ class pdf_aurore extends ModelePDFAskPriceSupplier } else { - $this->error=$langs->trans("ErrorConstantNotDefined","PROP_OUTPUTDIR"); + $this->error=$langs->trans("ErrorConstantNotDefined","ASKSUPPLIERPICE_OUTPUTDIR"); return 0; } - - $this->error=$langs->trans("ErrorUnknown"); - return 0; // Erreur par defaut } /** From b564b754fcfd67d97a27ec82cb91e95a3bb57358 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 10 Mar 2015 14:09:29 +0100 Subject: [PATCH 286/287] Doxygen --- htdocs/core/db/DoliDB.class.php | 3 ++- htdocs/core/lib/functions.lib.php | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/htdocs/core/db/DoliDB.class.php b/htdocs/core/db/DoliDB.class.php index 67e3022d6e3..94f1568c5a2 100644 --- a/htdocs/core/db/DoliDB.class.php +++ b/htdocs/core/db/DoliDB.class.php @@ -1,6 +1,7 @@ + * Copyright (C) 2014-2015 Laurent Destailleur * * 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 @@ -270,7 +271,7 @@ abstract class DoliDB implements Database * * @param string $string Date in a string (YYYYMMDDHHMMSS, YYYYMMDD, YYYY-MM-DD HH:MM:SS) * @param int $gm 1=Input informations are GMT values, otherwise local to server TZ - * @return timestamp|string Date TMS + * @return int|string Date TMS */ function jdate($string, $gm=false) { diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php index 601908bc412..63c0f6ce433 100644 --- a/htdocs/core/lib/functions.lib.php +++ b/htdocs/core/lib/functions.lib.php @@ -1157,7 +1157,7 @@ function dol_getdate($timestamp,$fast=false) * @param int $year Year * @param mixed $gm True or 1 or 'gmt'=Input informations are GMT values, False or 0 or 'server' = local to server TZ, 'user' = local to user TZ * @param int $check 0=No check on parameters (Can use day 32, etc...) - * @return timestamp|string Date as a timestamp, '' or false if error + * @return int|string Date as a timestamp, '' or false if error * @see dol_print_date, dol_stringtotime, dol_getdate */ function dol_mktime($hour,$minute,$second,$month,$day,$year,$gm=false,$check=1) From 209f8946d051a558fd8aa37df7a07aaf0c4702b6 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 10 Mar 2015 14:17:58 +0100 Subject: [PATCH 287/287] All files must be lowercase --- htdocs/adherents/class/adherent.class.php | 4 ++-- htdocs/compta/bank/class/account.class.php | 4 ++-- ...orkboardResponse.class.php => workboardresponse.class.php} | 4 ++-- htdocs/index.php | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) rename htdocs/core/class/{WorkboardResponse.class.php => workboardresponse.class.php} (94%) diff --git a/htdocs/adherents/class/adherent.class.php b/htdocs/adherents/class/adherent.class.php index 6b9a8768495..78195bfa868 100644 --- a/htdocs/adherents/class/adherent.class.php +++ b/htdocs/adherents/class/adherent.class.php @@ -1721,8 +1721,8 @@ class Adherent extends CommonObject /** * Load indicators for dashboard (this->nbtodo and this->nbtodolate) * - * @param User $user Objet user - * @return WorkboardResponse|int <0 if KO, WorkboardResponse if OK + * @param User $user Objet user + * @return WorkboardResponse|int <0 if KO, WorkboardResponse if OK */ function load_board($user) { diff --git a/htdocs/compta/bank/class/account.class.php b/htdocs/compta/bank/class/account.class.php index cfbda320fb7..80262babbbf 100644 --- a/htdocs/compta/bank/class/account.class.php +++ b/htdocs/compta/bank/class/account.class.php @@ -917,7 +917,7 @@ class Account extends CommonObject * * @param User $user Objet user * @param int $filteraccountid To get info for a particular account id - * @return WorkboardResponse|int <0 if KO, WorkboardResponse if OK + * @return WorkboardResponse|int <0 if KO, WorkboardResponse if OK */ function load_board($user,$filteraccountid=0) { @@ -940,7 +940,7 @@ class Account extends CommonObject $langs->load("banks"); $now=dol_now(); - require_once DOL_DOCUMENT_ROOT.'/core/class/WorkboardResponse.class.php'; + require_once DOL_DOCUMENT_ROOT.'/core/class/workboardresponse.class.php'; $response = new WorkboardResponse(); $response->warning_delay=$conf->bank->rappro->warning_delay/60/60/24; diff --git a/htdocs/core/class/WorkboardResponse.class.php b/htdocs/core/class/workboardresponse.class.php similarity index 94% rename from htdocs/core/class/WorkboardResponse.class.php rename to htdocs/core/class/workboardresponse.class.php index c36b50b421e..13de74281ff 100644 --- a/htdocs/core/class/WorkboardResponse.class.php +++ b/htdocs/core/class/workboardresponse.class.php @@ -49,8 +49,8 @@ class WorkboardResponse public $url_late; /** - * Delay time to mark an item as late - * @var int + * Delay time to mark an item as late. In number of days. + * @var double */ public $warning_delay; diff --git a/htdocs/index.php b/htdocs/index.php index c13c15d80eb..15967013e8a 100644 --- a/htdocs/index.php +++ b/htdocs/index.php @@ -311,7 +311,7 @@ print ''."\n"; // Do not include sections without management permission // -require DOL_DOCUMENT_ROOT.'/core/class/WorkboardResponse.class.php'; +require DOL_DOCUMENT_ROOT.'/core/class/workboardresponse.class.php'; // Number of actions to do (late) if (! empty($conf->agenda->enabled) && $user->rights->agenda->myactions->read)