diff --git a/htdocs/compta/facture.php b/htdocs/compta/facture.php index 4d19d4a4d05..1cbe607807e 100644 --- a/htdocs/compta/facture.php +++ b/htdocs/compta/facture.php @@ -572,9 +572,9 @@ if ($_POST['action'] == 'add' && $user->rights->facture->creer) } } + // Predefined invoice if ($_POST['type'] == 0 && $_POST['fac_rec'] > 0) { - // Si facture récurrente $datefacture = dol_mktime(12, 0 , 0, $_POST['remonth'], $_POST['reday'], $_POST['reyear']); $facture->socid = $_POST['socid']; @@ -593,7 +593,8 @@ if ($_POST['action'] == 'add' && $user->rights->facture->creer) $facid = $facture->create($user); } - if ($_POST['type'] == 0 && $_POST['fac_rec'] <= 0) + // Standard or deposit or proformat invoice + if (($_POST['type'] == 0 || $_POST['type'] == 3 || $_POST['type'] == 4) && $_POST['fac_rec'] <= 0) { $datefacture = dol_mktime(12, 0 , 0, $_POST['remonth'], $_POST['reday'], $_POST['reyear']); if (empty($datefacture)) @@ -605,7 +606,6 @@ if ($_POST['action'] == 'add' && $user->rights->facture->creer) if (! $error) { // Si facture standard - $facture->socid = $_POST['socid']; $facture->type = $_POST['type']; $facture->number = $_POST['facnumber']; @@ -615,12 +615,13 @@ if ($_POST['action'] == 'add' && $user->rights->facture->creer) $facture->ref_client = $_POST['ref_client']; $facture->modelpdf = $_POST['model']; $facture->projetid = $_POST['projetid']; - $facture->cond_reglement_id = $_POST['cond_reglement_id']; + $facture->cond_reglement_id = ($_POST['type'] == 3?1:$_POST['cond_reglement_id']); $facture->mode_reglement_id = $_POST['mode_reglement_id']; $facture->amount = $_POST['amount']; $facture->remise_absolue = $_POST['remise_absolue']; $facture->remise_percent = $_POST['remise_percent']; + // If invoices lines already known if (! $_POST['propalid'] && ! $_POST['commandeid'] && ! $_POST['contratid']) { for ($i = 1; $i <= $NBLINES; $i++) @@ -637,9 +638,7 @@ if ($_POST['action'] == 'add' && $user->rights->facture->creer) } else { - /* - * Si creation depuis propale - */ + // If creation from proposal if ($_POST['propalid']) { $facture->propalid = $_POST['propalid']; @@ -693,9 +692,7 @@ if ($_POST['action'] == 'add' && $user->rights->facture->creer) } } - /* - * Si création depuis commande - */ + // If creation from order if ($_POST['commandeid']) { $facture->commandeid = $_POST['commandeid']; @@ -750,9 +747,7 @@ if ($_POST['action'] == 'add' && $user->rights->facture->creer) } } - /* - * Si création depuis contrat - */ + // If creation from contract if ($_POST['contratid']) { $facture->contratid = $_POST['contratid']; @@ -1368,7 +1363,7 @@ if ($_GET['action'] == 'create') $dateinvoice=empty($conf->global->MAIN_AUTOFILL_DATE)?-1:0; } $absolute_discount=$soc->getAvailableDiscounts(); - + if (empty($cond_reglement_id)) $cond_reglement_id=1; print '
'; print ''; @@ -1395,7 +1390,6 @@ if ($_GET['action'] == 'create') } // Factures prédéfinnies - // TODO Use instead invoice in llx_facture table with a particular status if ($conf->global->FACTURE_ENABLE_RECUR) { if ($_GET['propalid'] == 0 && $_GET['commandeid'] == 0 && $_GET['contratid'] == 0) @@ -1472,18 +1466,38 @@ if ($_GET['action'] == 'create') $optionsav.=''; } - // Type print ''.$langs->trans('Type').''; print ''."\n"; - print ''."\n"; - print ''."\n"; + + // Proformat + if ($conf->global->FACTURE_USE_PROFORMAT) + { + print ''."\n"; + } + + // Replacement + print ''."\n"; - print ''; - // Conditions de règlement + // Payment term print ''; - // Mode de règlement + // Payment mode print ''; // Project @@ -2938,7 +2953,9 @@ else } // Validate - if ($fac->statut == 0 && $num_lignes > 0 && (($fac->type < 2 && $fac->total_ttc >= 0) || ($fac->type == 2 && $fac->total_ttc <= 0))) + if ($fac->statut == 0 && $num_lignes > 0 && + (($fac->type == 0 || $fac->type == 1 || $fac->type == 3 || $fac->type == 4) && $fac->total_ttc >= 0) + || ($fac->type == 2 && $fac->total_ttc <= 0)) { if ($user->rights->facture->valider) { @@ -2972,7 +2989,7 @@ else } } - if ($conf->global->FACTURE_SHOW_SEND_REMINDER) + if ($conf->global->FACTURE_SHOW_SEND_REMINDER) // For backward compatibility { // Envoyer une relance if (($fac->statut == 1 || $fac->statut == 2) && $resteapayer > 0 && $user->rights->facture->envoyer) @@ -2988,7 +3005,7 @@ else } } - // Emettre paiement + // Create payment if ($fac->type != 2 && $fac->statut == 1 && $fac->paye == 0 && $user->rights->facture->paiement) { if ($facidnext) @@ -3008,28 +3025,34 @@ else } } - // Emettre remboursement ou Convertir en reduc - if ($fac->type == 2) + // Reverse back money or convert to reduction + if ($fac->type == 2 || $fac->type == 3) { - if ($fac->statut == 1 && $fac->paye == 0 && $user->rights->facture->paiement) + // For credit note only + if ($fac->type == 2 && $fac->statut == 1 && $fac->paye == 0 && $user->rights->facture->paiement) { print ''.$langs->trans('DoPaymentBack').''; } - - if ($fac->statut == 1 && $fac->paye == 0 && $user->rights->facture->creer && $fac->getSommePaiement() == 0) + // For credit note + if ($fac->type == 2 && $fac->statut == 1 && $fac->paye == 0 && $user->rights->facture->creer && $fac->getSommePaiement() == 0) + { + print ''.$langs->trans('ConvertToReduc').''; + } + // For deposit invoice + if ($fac->type == 3 && $fac->statut == 1 && $resteapayer == 0 && $user->rights->facture->creer) { print ''.$langs->trans('ConvertToReduc').''; } } - // Classer 'payé' + // Classify payed (if not deposit and not credit note. Such invoice are "converted") if ($fac->statut == 1 && $fac->paye == 0 && $user->rights->facture->paiement && - (($fac->type != 2 && $resteapayer <= 0) || ($fac->type == 2 && $resteapayer >= 0)) ) + (($fac->type != 2 && $fac->type != 3 && $resteapayer <= 0) || ($fac->type == 2 && $resteapayer >= 0)) ) { print ''.$langs->trans('ClassifyPayed').''; } - // Classer 'fermée' (possible si validée et pas encore classée payée) + // Classift 'closed not completely payed' (possible si validée et pas encore classée payée) if ($fac->statut == 1 && $fac->paye == 0 && $resteapayer > 0 && $user->rights->facture->paiement) { @@ -3052,13 +3075,13 @@ else } // Clone - if ($fac->type == 0 && $user->rights->facture->creer) + if (($fac->type == 0 || $fac->type == 3 || $fac->type == 4) && $user->rights->facture->creer) { print ''.$langs->trans("ToClone").''; } // Clone as predefined - if ($conf->global->FACTURE_ENABLE_RECUR && $fac->type == 0 && $fac->statut == 0 && $user->rights->facture->creer) + if ($conf->global->FACTURE_ENABLE_RECUR && ($fac->type == 0 || $fac->type == 3 || $fac->type == 4) && $fac->statut == 0 && $user->rights->facture->creer) { if (! $facidnext) { diff --git a/htdocs/compta/paiement.php b/htdocs/compta/paiement.php index edba3008c3e..4270034a40f 100644 --- a/htdocs/compta/paiement.php +++ b/htdocs/compta/paiement.php @@ -76,7 +76,7 @@ if ($_POST['action'] == 'add_paiement' || $_POST['action'] == 'confirm_paiement' $formquestion['text'] = img_warning($langs->trans("PaymentHigherThanReminderToPay")).' Attention, le montant de paiement pour une ou plusieurs facture est superieur au reste a payer.'; $formquestion['text'].='
Corriger votre saisie, sinon, confirmer et penser a creer un avoir du trop percu lors de la fermeture de chacune des factures surpayees.'; } - + $formquestion[$i++]=array('type' => 'hidden','name' => $key, 'value' => $_POST[$key]); } } @@ -134,11 +134,11 @@ if ($_POST['action'] == 'confirm_paiement' && $_POST['confirm'] == 'yes') $_POST['remonth'], $_POST['reday'], $_POST['reyear']); - + if (! $error) { $db->begin(); - + // Creation de la ligne paiement $paiement = new Paiement($db); $paiement->datepaye = $datepaye; @@ -166,7 +166,7 @@ if ($_POST['action'] == 'confirm_paiement' && $_POST['confirm'] == 'yes') $user, $_POST['chqemetteur'], $_POST['chqbank']); - + // Mise a jour fk_bank dans llx_paiement. // On connait ainsi le paiement qui a g�n�r� l'�criture bancaire if ($bank_line_id > 0) @@ -201,7 +201,7 @@ if ($_POST['action'] == 'confirm_paiement' && $_POST['confirm'] == 'yes') { $error++; } - + if ($error == 0) { $loc = DOL_URL_ROOT.'/compta/paiement/fiche.php?id='.$paiement_id; @@ -260,7 +260,7 @@ if ($_GET['action'] == 'create' || $_POST['action'] == 'confirm_paiement' || $_P if ($_POST["action"] == 'add_paiement') { $i=0; - + $formquestion[$i++]=array('type' => 'hidden','name' => 'facid', 'value' => $facture->id); $formquestion[$i++]=array('type' => 'hidden','name' => 'socid', 'value' => $facture->socid); $formquestion[$i++]=array('type' => 'hidden','name' => 'type', 'value' => $facture->type); @@ -324,7 +324,7 @@ if ($_GET['action'] == 'create' || $_POST['action'] == 'confirm_paiement' || $_P print ''; /* - * Liste factures impayees + * List of unpayed invoices */ $sql = 'SELECT f.rowid as facid, f.facnumber, f.total_ttc, f.type, '; $sql.= $db->pdate('f.datef').' as df, '; @@ -333,14 +333,14 @@ if ($_GET['action'] == 'create' || $_POST['action'] == 'confirm_paiement' || $_P $sql.= ' LEFT JOIN '.MAIN_DB_PREFIX.'paiement_facture as pf ON pf.fk_facture = f.rowid'; $sql.= ' WHERE f.fk_soc = '.$facture->socid; $sql.= ' AND f.paye = 0'; - $sql.= ' AND f.fk_statut = 1'; // Statut=0 => non valid�e, Statut=2 => annul�e + $sql.= ' AND f.fk_statut = 1'; // Statut=0 => not validated, Statut=2 => canceled if ($facture->type != 2) { - $sql .= ' AND type in (0,1)'; // Facture standard ou de remplacement + $sql .= ' AND type in (0,1,3)'; // Standard invoice, replacement, deposit } else { - $sql .= ' AND type = 2'; + $sql .= ' AND type = 2'; // If paying back a credit note, we show all credit notes } $sql .= ' GROUP BY f.facnumber'; $resql = $db->query($sql); @@ -375,9 +375,9 @@ if ($_GET['action'] == 'create' || $_POST['action'] == 'confirm_paiement' || $_P $facturestatic->ref=$objp->facnumber; $facturestatic->id=$objp->facid; $facturestatic->type=$objp->type; - + $creditnote=$facturestatic->getSommeCreditNote(); - + print ''; print ''; - + // Recu print ''; - + // Reste a payer print ''; @@ -411,8 +411,8 @@ if ($_GET['action'] == 'create' || $_POST['action'] == 'confirm_paiement' || $_P print ' '.img_warning($langs->trans("PaymentHigherThanReminderToPay")); } print ''; - - + + print "\n"; $total+=$objp->total; @@ -425,7 +425,7 @@ if ($_GET['action'] == 'create' || $_POST['action'] == 'confirm_paiement' || $_P { // Print total print ''; - print ''; + print ''; print ''; print '
'; + // Standard invoice + print '
'; print ''; print ''; $desc=$html->textwithhelp($langs->trans("InvoiceStandardAsk"),$langs->transnoentities("InvoiceStandardDesc"),1); print $desc; print '
'; + // Deposit + print '
'; + print ''; + print ''; + $desc=$html->textwithhelp($langs->trans("InvoiceDeposit"),$langs->transnoentities("InvoiceDepositDesc"),1); + print $desc; + print '
'; + print ''; + print ''; + $desc=$html->textwithhelp($langs->trans("InvoiceProformat"),$langs->transnoentities("InvoiceProformatDesc"),1); + print $desc; + print '
'; print ''; @@ -1506,7 +1520,8 @@ if ($_GET['action'] == 'create') print $desc; print '
'; + // Credit note + print '
'; print ''; @@ -1549,14 +1564,14 @@ if ($_GET['action'] == 'create') $html->select_date($dateinvoice,'','','','',"add"); print '
'.$langs->trans('PaymentConditionsShort').''; - $html->select_conditions_paiements($cond_reglement_id,'cond_reglement_id'); + $html->select_conditions_paiements(isset($_POST['cond_reglement_id'])?$_POST['cond_reglement_id']:$cond_reglement_id,'cond_reglement_id'); print '
'.$langs->trans('PaymentMode').''; - $html->select_types_paiements($mode_reglement_id,'mode_reglement_id'); + $html->select_types_paiements(isset($_POST['mode_reglement_id'])?$_POST['mode_reglement_id']:$mode_reglement_id,'mode_reglement_id'); print '
'; @@ -389,12 +389,12 @@ if ($_GET['action'] == 'create' || $_POST['action'] == 'confirm_paiement' || $_P // Prix print ''.price($objp->total_ttc).''.price($objp->am); if ($creditnote) print '+'.price($creditnote); print ''.price(price2num($objp->total_ttc - $objp->am - $creditnote,'MT')).'
'.$langs->trans('TotalTTC').':'.$langs->trans('TotalTTC').''.price($total_ttc).''.price($totalrecu); if ($totalrecucreditnote) print '+'.price($totalrecucreditnote); @@ -476,7 +476,7 @@ if ($_GET['action'] == 'create' || $_POST['action'] == 'confirm_paiement' || $_P /** - * \brief Affichage de la liste des paiement + * \brief Affichage de la liste des paiements */ if (! $_GET['action'] && ! $_POST['action']) { @@ -491,7 +491,6 @@ if (! $_GET['action'] && ! $_POST['action']) $sql .=', f.rowid as facid, c.libelle as paiement_type, p.num_paiement'; $sql .= ' FROM '.MAIN_DB_PREFIX.'paiement as p, '.MAIN_DB_PREFIX.'facture as f, '.MAIN_DB_PREFIX.'c_paiement as c'; $sql .= ' WHERE p.fk_facture = f.rowid AND p.fk_paiement = c.id'; - if ($socid) { $sql .= ' AND f.fk_soc = '.$socid; diff --git a/htdocs/facture.class.php b/htdocs/facture.class.php index a1e8a913561..4fb4350b383 100644 --- a/htdocs/facture.class.php +++ b/htdocs/facture.class.php @@ -52,7 +52,7 @@ class Facture extends CommonObject var $id; //! Id client var $socid; - //! Objet societe client (à charger par fetch_client) + //! Objet societe client (to load with fetch_client method) var $client; var $number; var $author; @@ -62,7 +62,7 @@ class Facture extends CommonObject var $date_validation; var $ref; var $ref_client; - //! 0=Facture normale, 1=Facture remplacement, 2=Facture avoir, 3=Facture récurrente + //! 0=Standard invoice, 1=Replacement invoice, 2=Credit note invoice, 3=Deposit invoice, 4=Proformat invoice var $type; var $amount; var $remise; @@ -77,7 +77,7 @@ class Facture extends CommonObject var $statut; //! 1 si facture payée COMPLETEMENT, 0 sinon (ce champ ne devrait plus servir car insuffisant) var $paye; - //! id facture source si facture de remplacement ou avoir + //! id of source invoice if replacement invoice or credit note var $fk_facture_source; //! Fermeture apres paiement partiel: discount_vat, badcustomer, abandon //! Fermeture alors que aucun paiement: replaced (si remplacé), abandon @@ -134,7 +134,7 @@ class Facture extends CommonObject { global $langs,$conf,$mysoc; - // Nettoyage paramètres + // Clean parameters if (! $this->type) $this->type = 0; $this->ref_client=trim($this->ref_client); $this->note=trim($this->note); @@ -182,7 +182,7 @@ class Facture extends CommonObject // Definition de la date limite $datelim=$this->calculate_date_lim_reglement(); - // Insertion dans la base + // Insert into database $socid = $this->socid; $amount = $this->amount; $remise = $this->remise; @@ -198,7 +198,7 @@ class Facture extends CommonObject $sql.= ' fk_facture_source, fk_user_author, fk_projet,'; $sql.= ' fk_cond_reglement, fk_mode_reglement, date_lim_reglement, model_pdf)'; $sql.= ' VALUES ('; - $sql.= "'(PROV)', '".$this->type."', '".$socid."', ".$this->db->idate(mktime()).", '".$totalht."'"; + $sql.= "'(PROV)', '".$this->type."', '".$socid."', ".$this->db->idate(gmmktime()).", '".$totalht."'"; $sql.= ",".($this->remise_absolue>0?$this->remise_absolue:'NULL'); $sql.= ",".($this->remise_percent>0?$this->remise_percent:'NULL'); $sql.= ",".$this->db->idate($this->date); @@ -470,12 +470,14 @@ class Facture extends CommonObject } $picto='bill'; - if ($this->type == 1) $picto.='r'; - if ($this->type == 2) $picto.='a'; + if ($this->type == 1) $picto.='r'; // Replacement invoice + if ($this->type == 2) $picto.='a'; // Credit note + if ($this->type == 3) $picto.='d'; // Deposit invoice $label=$langs->trans("ShowInvoice").': '.$this->ref; if ($this->type == 1) $label=$langs->trans("ShowInvoiceReplace").': '.$this->ref; if ($this->type == 2) $label=$langs->trans("ShowInvoiceAvoir").': '.$this->ref; + if ($this->type == 3) $label=$langs->trans("ShowInvoiceDeposit").': '.$this->ref; if ($withpicto) $result.=($lien.img_object($label,$picto).$lienfin); if ($withpicto && $withpicto != 2) $result.=' '; @@ -1965,6 +1967,7 @@ class Facture extends CommonObject if ($this->type == 0) return $langs->trans("InvoiceStandard"); if ($this->type == 1) return $langs->trans("InvoiceReplacement"); if ($this->type == 2) return $langs->trans("InvoiceAvoir"); + if ($this->type == 3) return $langs->trans("InvoiceDeposit"); return $langs->trans("Unknown"); } @@ -2008,6 +2011,7 @@ class Facture extends CommonObject else { if ($type == 2) return $langs->trans('Bill'.$prefix.'StatusPayedBackOrConverted'); + elseif ($type == 3) return $langs->trans('Bill'.$prefix.'StatusConverted'); else return $langs->trans('Bill'.$prefix.'StatusPayed'); } } @@ -2025,6 +2029,7 @@ class Facture extends CommonObject else { if ($type == 2) return $langs->trans('Bill'.$prefix.'StatusPayedBackOrConverted'); + elseif ($type == 3) return $langs->trans('Bill'.$prefix.'StatusConverted'); else return $langs->trans('Bill'.$prefix.'StatusPayed'); } } @@ -2042,6 +2047,7 @@ class Facture extends CommonObject else { if ($type == 2) return img_picto($langs->trans('BillStatusPayedBackOrConverted'),'statut6').' '.$langs->trans('Bill'.$prefix.'StatusPayedBackOrConverted'); + elseif ($type == 3) return img_picto($langs->trans('BillStatusConverted'),'statut6').' '.$langs->trans('Bill'.$prefix.'StatusConverted'); else return img_picto($langs->trans('BillStatusPayed'),'statut6').' '.$langs->trans('Bill'.$prefix.'StatusPayed'); } } @@ -2059,6 +2065,7 @@ class Facture extends CommonObject else { if ($type == 2) return img_picto($langs->trans('BillStatusPayedBackOrConverted'),'statut6'); + elseif ($type == 3) return img_picto($langs->trans('BillStatusConverted'),'statut6'); else return img_picto($langs->trans('BillStatusPayed'),'statut6'); } } @@ -2075,6 +2082,7 @@ class Facture extends CommonObject else { if ($type == 2) return img_picto($langs->trans('BillStatusPayedBackOrConverted'),'statut6').' '.$langs->trans('BillStatusPayedBackOrConverted'); + elseif ($type == 3) return img_picto($langs->trans('BillStatusConverted'),'statut6').' '.$langs->trans('BillStatusConverted'); else return img_picto($langs->trans('BillStatusPayed'),'statut6').' '.$langs->trans('BillStatusPayed'); } } @@ -2092,6 +2100,7 @@ class Facture extends CommonObject else { if ($type == 2) return $langs->trans('Bill'.$prefix.'StatusPayedBackOrConverted').' '.img_picto($langs->trans('BillStatusPayedBackOrConverted'),'statut6'); + elseif ($type == 3) return $langs->trans('Bill'.$prefix.'StatusConverted').' '.img_picto($langs->trans('BillStatusConverted'),'statut6'); else return $langs->trans('Bill'.$prefix.'StatusPayed').' '.img_picto($langs->trans('BillStatusPayed'),'statut6'); } } @@ -2628,7 +2637,7 @@ class Facture extends CommonObject } } - // Initialise paramètres + // Initialize parameters $this->id=0; $this->ref = 'SPECIMEN'; $this->specimen=1; diff --git a/htdocs/includes/modules/facture/pdf_crabe.modules.php b/htdocs/includes/modules/facture/pdf_crabe.modules.php index c789d07fb3f..e4596913559 100644 --- a/htdocs/includes/modules/facture/pdf_crabe.modules.php +++ b/htdocs/includes/modules/facture/pdf_crabe.modules.php @@ -938,6 +938,8 @@ class pdf_crabe extends ModelePDFFactures $title=$outputlangs->transnoentities("Invoice"); if ($object->type == 1) $title=$outputlangs->transnoentities("InvoiceReplacement"); if ($object->type == 2) $title=$outputlangs->transnoentities("InvoiceAvoir"); + if ($object->type == 3) $title=$outputlangs->transnoentities("InvoiceDeposit"); + if ($object->type == 4) $title=$outputlangs->transnoentities("InvoiceProFormat"); $pdf->MultiCell(100, 4, $title, '' , 'R'); $pdf->SetFont('Arial','B',12); diff --git a/htdocs/includes/modules/facture/pdf_oursin.modules.php b/htdocs/includes/modules/facture/pdf_oursin.modules.php index bc5512374fd..5158da8202c 100644 --- a/htdocs/includes/modules/facture/pdf_oursin.modules.php +++ b/htdocs/includes/modules/facture/pdf_oursin.modules.php @@ -131,7 +131,7 @@ class pdf_oursin extends ModelePDFFactures $ret=$fac->fetch($id); } $fac->fetch_client(); - + $deja_regle = $fac->getSommePaiement(); $amount_credit_not_included = $fac->getSommeCreditNote(); @@ -931,21 +931,59 @@ class pdf_oursin extends ModelePDFFactures /* * ref facture */ - $posy=65; + $posy=70; $pdf->SetFont('Arial','B',13); - $pdf->SetXY($this->marges['g'],$posy); + $pdf->SetXY($this->marges['g'],$posy-5); $pdf->SetTextColor(0,0,0); - $pdf->MultiCell(100, 10, $outputlangs->transnoentities("Bill").' '.$outputlangs->transnoentities("Of").' '.dol_print_date($fac->date,"%d %B %Y",false,$outputlangs,true), '' , 'L'); + $title=$outputlangs->transnoentities("Invoice"); + if ($object->type == 1) $title=$outputlangs->transnoentities("InvoiceReplacement"); + if ($object->type == 2) $title=$outputlangs->transnoentities("InvoiceAvoir"); + if ($object->type == 3) $title=$outputlangs->transnoentities("InvoiceDeposit"); + if ($object->type == 4) $title=$outputlangs->transnoentities("InvoiceProFormat"); + $pdf->MultiCell(100, 10, $title.' '.$outputlangs->transnoentities("Of").' '.dol_print_date($fac->date,"day",false,$outputlangs,true), '' , 'L'); $pdf->SetFont('Arial','B',11); - $pdf->SetXY($this->marges['g'],$posy+5); + $pdf->SetXY($this->marges['g'],$posy); $pdf->SetTextColor(22,137,210); $pdf->MultiCell(100, 10, $outputlangs->transnoentities("RefBill")." : " . $outputlangs->transnoentities($fac->ref), '', 'L'); $pdf->SetTextColor(0,0,0); - + $posy+=4; + + $facidnext=$object->getIdReplacingInvoice('validated'); + if ($object->type == 0 && $facidnext) + { + $objectreplacing=new Facture($this->db); + $objectreplacing->fetch($facidnext); + + $posy+=4; + $pdf->SetXY($this->marges['g'],$posy); + $pdf->SetTextColor(0,0,60); + $pdf->MultiCell(100, 3, $outputlangs->transnoentities("ReplacementByInvoice").' : '.$outputlangs->convToOutputCharset($objectreplacing->ref), '', 'L'); + } + if ($object->type == 1) + { + $objectreplaced=new Facture($this->db); + $objectreplaced->fetch($object->fk_facture_source); + + $posy+=4; + $pdf->SetXY($this->marges['g'],$posy); + $pdf->SetTextColor(0,0,60); + $pdf->MultiCell(100, 3, $outputlangs->transnoentities("ReplacementInvoice").' : '.$outputlangs->convToOutputCharset($objectreplaced->ref), '', 'L'); + } + if ($object->type == 2) + { + $objectreplaced=new Facture($this->db); + $objectreplaced->fetch($object->fk_facture_source); + + $posy+=4; + $pdf->SetXY($this->marges['g'],$posy); + $pdf->SetTextColor(0,0,60); + $pdf->MultiCell(100, 3, $outputlangs->transnoentities("CorrectionInvoice").' : '.$outputlangs->convToOutputCharset($objectreplaced->ref), '', 'L'); + } + if ($object->type != 2) { - $posy+=8; - $pdf->SetXY($this->marges['g'],$posy+5); + $posy+=5; + $pdf->SetXY($this->marges['g'],$posy); $pdf->SetFont('Arial','',9); $pdf->MultiCell(100, 3, $outputlangs->transnoentities("DateEcheance")." : " . dol_print_date($object->date_lim_reglement,"day",false,$outputlangs,true), '', 'L'); } @@ -953,12 +991,12 @@ class pdf_oursin extends ModelePDFFactures if ($object->client->code_client) { $posy+=4; - $pdf->SetXY($this->marges['g'],$posy+5); + $pdf->SetXY($this->marges['g'],$posy); $pdf->SetFont('Arial','',9); $pdf->MultiCell(100, 3, $outputlangs->transnoentities("CustomerCode")." : " . $object->client->code_client, '', 'L'); } - - + + /* * ref propal */ @@ -975,7 +1013,7 @@ class pdf_oursin extends ModelePDFFactures if ($objp->ref) { $posy+=4; - $pdf->SetXY($this->marges['g'],$posy+5); + $pdf->SetXY($this->marges['g'],$posy); $pdf->SetFont('Arial','',9); $pdf->MultiCell(60, 3, $outputlangs->transnoentities("RefProposal")." : ".$objp->ref); } diff --git a/htdocs/langs/en_US/bills.lang b/htdocs/langs/en_US/bills.lang index 57628864db4..06fc5c47963 100644 --- a/htdocs/langs/en_US/bills.lang +++ b/htdocs/langs/en_US/bills.lang @@ -13,6 +13,12 @@ BillsStatisticsSuppliers=Suppliers' invoices statistics InvoiceStandard=Standard invoice InvoiceStandardAsk=Standard invoice InvoiceStandardDesc=This kind of invoice is the common invoice. +InvoiceDeposit=Deposit invoice +InvoiceDepositAsk=Deposit invoice +InvoiceDepositDesc=This kind of invoice is done when a deposit has been received. +InvoiceProFormat=Proformat invoice +InvoiceProFormatAsk=Proformat invoice +InvoiceProFormatDesc=Proformat invoice is an image of a true invoice but has no accountancy value. InvoiceReplacement=Replacement invoice. Must replace invoice with reference InvoiceReplacementAsk=Replacement invoice for invoice InvoiceReplacementDesc=Replacement invoice is used to cancel and replace completely an invoice with no payment already received.

Note: Only invoice with no payment on it can be replaced. If not closed, it will be automatically closed to 'abandonned'. @@ -49,7 +55,7 @@ PaymentsBack=Payments back DatePayment=Payment date DeletePayment=Delete payment ConfirmDeletePayment=Are you sure you want to delete this payment ? -ConfirmConvertToReduc=Do you want to convert this credit note into absolute discount ?
The amount of this credit note will so be saved among all discounts and could be used as a discount for a current or a future invoice for this customer. +ConfirmConvertToReduc=Do you want to convert this credit note or deposit into an absolute discount ?
The amount will so be saved among all discounts and could be used as a discount for a current or a future invoice for this customer. SupplierPayments=Suppliers payments ReceivedPayments=Received payments ReceivedCustomersPayments=Payments received from customers @@ -87,6 +93,7 @@ BillStatus=Invoice status BillStatusDraft=Draft (needs to be validated) BillStatusPayed=Payed BillStatusPayedBackOrConverted=Payed or converted into discount +BillStatusConverted=Converted into discount BillStatusCanceled=Abandonned BillStatusValidated=Validated (needs to be payed) BillStatusStarted=Started @@ -160,6 +167,7 @@ ShowBill=Show invoice ShowInvoice=Show invoice ShowInvoiceReplace=Show replacing invoice ShowInvoiceAvoir=Show credit note +ShowInvoiceDeposit=Show deposit invoice ShowPayment=Show payment File=File AlreadyPayed=Already payed diff --git a/htdocs/langs/fr_FR/bills.lang b/htdocs/langs/fr_FR/bills.lang index aa9618d825a..a75f6767151 100644 --- a/htdocs/langs/fr_FR/bills.lang +++ b/htdocs/langs/fr_FR/bills.lang @@ -14,6 +14,12 @@ BillsStatisticsSuppliers=Statistiques factures fournisseurs InvoiceStandard=Facture standard InvoiceStandardAsk=Facture standard InvoiceStandardDesc=Ce type de facture est la facture traditionnelle. On l'appelle aussi facture de doit (du verbe devoir). +InvoiceDeposit=Facture d'accompte +InvoiceDepositAsk=Facture d'accompte +InvoiceDepositDesc=La facture d'accompte est le type de facture faite suite à réception d'un accompte. +InvoiceProFormat=Facture proformat +InvoiceProFormatAsk=Facture proformat +InvoiceProFormatDesc=La facture proformat est une image de facture définitive mais qui n'a aucune valeure comptable. InvoiceReplacement=Facture de remplacement InvoiceReplacementAsk=Facture de remplacement de la facture InvoiceReplacementDesc=La facture de remplacement sert à annuler et remplacer une facture existante sur laquelle aucun paiement n'a encore eu lieu.

Rem: Seule une facture sans aucun paiement peut être remplacée. Si cette dernière n'est pas fermée, elle le sera automatiquement au statut 'abandonnée'. @@ -49,7 +55,7 @@ PaymentsBack=Remboursements DatePayment=Date paiement DeletePayment=Supprimer le paiement ConfirmDeletePayment=Etes vous sur de vouloir supprimer ce paiement ? -ConfirmConvertToReduc=Voulez-vous convertir cet avoir en réduction future ?
Le montant de cet avoir sera alors stocké en réduction fixe en attente pour le client. Cette dernière pourra être utilisée pour réduire le montant d'une facture en cours ou prochaine de ce client. +ConfirmConvertToReduc=Voulez-vous convertir cet avoir ou accompte en réduction future ?
Le montant sera alors stocké en réduction fixe en attente pour le client. Cette dernière pourra être utilisée pour réduire le montant d'une facture en cours ou prochaine de ce client. SupplierPayments=Réglements fournisseurs ReceivedPayments=Réglements reçus ReceivedCustomersPayments=Réglements reçus du client @@ -87,6 +93,7 @@ BillStatus=État de la facture BillStatusDraft=Brouillon (à valider) BillStatusPayed=Payée BillStatusPayedBackOrConverted=Remboursé ou converti en réduction +BillStatusConverted=Converti en réduction BillStatusCanceled=Abandonnée BillStatusValidated=Validée (à payer) BillStatusStarted=Réglement commencé @@ -160,6 +167,7 @@ ShowBill=Afficher facture ShowInvoice=Afficher facture ShowInvoiceReplace=Afficher facture de remplacement ShowInvoiceAvoir=Afficher facture avoir +ShowInvoiceDeposit=Afficher facture d'accompte ShowPayment=Afficher réglement File=Fichier AlreadyPayed=Déjà réglé diff --git a/htdocs/theme/auguria/img/object_billd.png b/htdocs/theme/auguria/img/object_billd.png new file mode 100644 index 00000000000..3c7443cba3e Binary files /dev/null and b/htdocs/theme/auguria/img/object_billd.png differ diff --git a/htdocs/theme/bluelagoon/img/object_billd.png b/htdocs/theme/bluelagoon/img/object_billd.png new file mode 100644 index 00000000000..3c7443cba3e Binary files /dev/null and b/htdocs/theme/bluelagoon/img/object_billd.png differ diff --git a/htdocs/theme/dev/img/object_billd.png b/htdocs/theme/dev/img/object_billd.png new file mode 100644 index 00000000000..3c7443cba3e Binary files /dev/null and b/htdocs/theme/dev/img/object_billd.png differ diff --git a/htdocs/theme/eldy/img/object_billd.png b/htdocs/theme/eldy/img/object_billd.png new file mode 100644 index 00000000000..3c7443cba3e Binary files /dev/null and b/htdocs/theme/eldy/img/object_billd.png differ diff --git a/htdocs/theme/eldy/img/object_billr.png b/htdocs/theme/eldy/img/object_billr.png index 3c7443cba3e..c89098beaa5 100644 Binary files a/htdocs/theme/eldy/img/object_billr.png and b/htdocs/theme/eldy/img/object_billr.png differ diff --git a/htdocs/theme/freelug/img/object_billd.png b/htdocs/theme/freelug/img/object_billd.png new file mode 100644 index 00000000000..3c7443cba3e Binary files /dev/null and b/htdocs/theme/freelug/img/object_billd.png differ diff --git a/htdocs/theme/yellow/img/object_billd.png b/htdocs/theme/yellow/img/object_billd.png new file mode 100644 index 00000000000..3c7443cba3e Binary files /dev/null and b/htdocs/theme/yellow/img/object_billd.png differ diff --git a/mysql/data/data.sql b/mysql/data/data.sql index 75f69830434..1d5658df5d8 100644 --- a/mysql/data/data.sql +++ b/mysql/data/data.sql @@ -41,7 +41,6 @@ insert into llx_cond_reglement(rowid, code, sortorder, active, libelle, libelle_ insert into llx_cond_reglement(rowid, code, sortorder, active, libelle, libelle_facture, fdm, nbjour) values (3,'30DENDMONTH', 3,1, '30 jours fin de mois','Réglement à 30 jours fin de mois',1,30); insert into llx_cond_reglement(rowid, code, sortorder, active, libelle, libelle_facture, fdm, nbjour) values (4,'60D', 4,1, '60 jours','Réglement à 60 jours',0,60); insert into llx_cond_reglement(rowid, code, sortorder, active, libelle, libelle_facture, fdm, nbjour) values (5,'60DENDMONTH', 5,1, '60 jours fin de mois','Réglement à 60 jours fin de mois',1,60); -insert into llx_cond_reglement(rowid, code, sortorder, active, libelle, libelle_facture, fdm, nbjour) values (6,'PROFORMA', 6,1, 'Proforma','Réglement avant livraison',0,0); --