diff --git a/ChangeLog b/ChangeLog index 82f4eb0cc1d..e2325cf8433 100644 --- a/ChangeLog +++ b/ChangeLog @@ -11,6 +11,8 @@ For users: - New: Monaco is like France for default vat calculation - New: Can list elements (invoices, orders or proposals on a particular user contact). This allow to view a "basket" of its elements. +- New: Add bank account on payment list of invoice card. +- New: Cloning project allow to clones task, notes, files, contacts. - New: Enhance default style. For developers: diff --git a/htdocs/compta/facture.php b/htdocs/compta/facture.php index bc3b083f0a1..d2688ff987d 100644 --- a/htdocs/compta/facture.php +++ b/htdocs/compta/facture.php @@ -1584,6 +1584,7 @@ llxHeader('',$langs->trans('Bill'),'EN:Customers_Invoices|FR:Factures_Clients|ES $form = new Form($db); $htmlother = new FormOther($db); $formfile = new FormFile($db); +$bankaccountstatic=new Account($db); $now=dol_now(); @@ -2520,8 +2521,9 @@ else * List of payments */ - $nbrows=8; + $nbrows=8; $nbcols=2; if ($conf->projet->enabled) $nbrows++; + if ($conf->banque->enabled) $nbcols++; //Local taxes if ($mysoc->pays_code=='ES') @@ -2538,6 +2540,7 @@ else print ''; print ''.($object->type == 2 ? $langs->trans("PaymentsBack") : $langs->trans('Payments')).''; print ''.$langs->trans('Type').''; + if ($conf->banque->enabled) print ''.$langs->trans('BankAccount').''; print ''.$langs->trans('Amount').''; print ' '; print ''; @@ -2545,12 +2548,15 @@ else $var=true; // Payments already done (from payment on this invoice) - $sql = 'SELECT p.datep as dp, p.num_paiement, p.rowid,'; + $sql = 'SELECT p.datep as dp, p.num_paiement, p.rowid, p.fk_bank,'; $sql.= ' c.code as payment_code, c.libelle as payment_label,'; - $sql.= ' pf.amount'; - $sql.= ' FROM '.MAIN_DB_PREFIX.'paiement as p, '.MAIN_DB_PREFIX.'c_paiement as c, '.MAIN_DB_PREFIX.'paiement_facture as pf'; + $sql.= ' pf.amount,'; + $sql.= ' ba.rowid as baid, ba.ref, ba.label'; + $sql.= ' FROM '.MAIN_DB_PREFIX.'c_paiement as c, '.MAIN_DB_PREFIX.'paiement_facture as pf, '.MAIN_DB_PREFIX.'paiement as p'; + $sql.= ' LEFT JOIN '.MAIN_DB_PREFIX.'bank as b ON p.fk_bank = b.rowid'; + $sql.= ' LEFT JOIN '.MAIN_DB_PREFIX.'bank_account as ba ON b.fk_account = ba.rowid'; $sql.= ' WHERE pf.fk_facture = '.$object->id.' AND p.fk_paiement = c.id AND pf.fk_paiement = p.rowid'; - $sql.= ' ORDER BY dp, tms'; + $sql.= ' ORDER BY p.datep, p.tms'; $result = $db->query($sql); if ($result) @@ -2560,19 +2566,35 @@ else if ($object->type != 2) { - while ($i < $num) + if ($num > 0) { - $objp = $db->fetch_object($result); - $var=!$var; - print ''; - print ''.img_object($langs->trans('ShowPayment'),'payment').' '; - print dol_print_date($db->jdate($objp->dp),'day').''; - $label=($langs->trans("PaymentType".$objp->payment_code)!=("PaymentType".$objp->payment_code))?$langs->trans("PaymentType".$objp->payment_code):$objp->payment_label; - print ''.$label.' '.$objp->num_paiement.''; - print ''.price($objp->amount).''; - print ' '; - print ''; - $i++; + while ($i < $num) + { + $objp = $db->fetch_object($result); + $var=!$var; + print ''; + print ''.img_object($langs->trans('ShowPayment'),'payment').' '; + print dol_print_date($db->jdate($objp->dp),'day').''; + $label=($langs->trans("PaymentType".$objp->payment_code)!=("PaymentType".$objp->payment_code))?$langs->trans("PaymentType".$objp->payment_code):$objp->payment_label; + print ''.$label.' '.$objp->num_paiement.''; + if ($conf->banque->enabled) + { + $bankaccountstatic->id=$objp->baid; + $bankaccountstatic->ref=$objp->ref; + $bankaccountstatic->label=$objp->ref; + print ''; + print $bankaccountstatic->getNomUrl(1,'transactions'); + print ''; + } + print ''.price($objp->amount).''; + print ' '; + print ''; + $i++; + } + } + else + { + print ''.$langs->trans("None").''; } } $db->free($result); @@ -2585,7 +2607,7 @@ else if ($object->type != 2) { // Total already paid - print ''; + print ''; if ($object->type != 3) print $langs->trans('AlreadyPaidNoCreditNotesNoDeposits'); else print $langs->trans('AlreadyPaid'); print ' :'.price($totalpaye).' '; @@ -2609,7 +2631,7 @@ else { $obj = $db->fetch_object($resql); $invoice->fetch($obj->fk_facture_source); - print ''; + print ''; if ($invoice->type == 2) print $langs->trans("CreditNote").' '; if ($invoice->type == 3) print $langs->trans("Deposit").' '; print $invoice->getNomUrl(0); @@ -2631,7 +2653,7 @@ else // Paye partiellement 'escompte' if (($object->statut == 2 || $object->statut == 3) && $object->close_code == 'discount_vat') { - print ''; + print ''; print $form->textwithpicto($langs->trans("Escompte").':',$langs->trans("HelpEscompte"),-1); print ''.price($object->total_ttc - $creditnoteamount - $depositamount - $totalpaye).' '; $resteapayeraffiche=0; @@ -2639,7 +2661,7 @@ else // Paye partiellement ou Abandon 'badcustomer' if (($object->statut == 2 || $object->statut == 3) && $object->close_code == 'badcustomer') { - print ''; + print ''; print $form->textwithpicto($langs->trans("Abandoned").':',$langs->trans("HelpAbandonBadCustomer"),-1); print ''.price($object->total_ttc - $creditnoteamount - $depositamount - $totalpaye).' '; //$resteapayeraffiche=0; @@ -2647,7 +2669,7 @@ else // Paye partiellement ou Abandon 'product_returned' if (($object->statut == 2 || $object->statut == 3) && $object->close_code == 'product_returned') { - print ''; + print ''; print $form->textwithpicto($langs->trans("ProductReturned").':',$langs->trans("HelpAbandonProductReturned"),-1); print ''.price($object->total_ttc - $creditnoteamount - $depositamount - $totalpaye).' '; $resteapayeraffiche=0; @@ -2655,7 +2677,7 @@ else // Paye partiellement ou Abandon 'abandon' if (($object->statut == 2 || $object->statut == 3) && $object->close_code == 'abandon') { - print ''; + print ''; $text=$langs->trans("HelpAbandonOther"); if ($object->close_note) $text.='

'.$langs->trans("Reason").':'.$object->close_note; print $form->textwithpicto($langs->trans("Abandoned").':',$text,-1); @@ -2664,10 +2686,10 @@ else } // Billed - print ''.$langs->trans("Billed").' :'.price($object->total_ttc).' '; + print ''.$langs->trans("Billed").' :'.price($object->total_ttc).' '; // Remainder to pay - print ''; + print ''; if ($resteapayeraffiche >= 0) print $langs->trans('RemainderToPay'); else print $langs->trans('ExcessReceived'); print ' :'; @@ -2677,7 +2699,7 @@ else else { // Sold credit note - print ''.$langs->trans('TotalTTC').' :'; + print ''.$langs->trans('TotalTTC').' :'; print ''.price(abs($object->total_ttc)).' '; } diff --git a/htdocs/fourn/class/paiementfourn.class.php b/htdocs/fourn/class/paiementfourn.class.php index d212b70c4b0..6908e85e2d9 100644 --- a/htdocs/fourn/class/paiementfourn.class.php +++ b/htdocs/fourn/class/paiementfourn.class.php @@ -143,7 +143,7 @@ class PaiementFourn extends Paiement if ($this->total <> 0) // On accepte les montants negatifs { $now=dol_now(); - + $sql = 'INSERT INTO '.MAIN_DB_PREFIX.'paiementfourn ('; $sql.= 'datec, datep, amount, fk_paiement, num_paiement, note, fk_user_author, fk_bank)'; $sql.= ' VALUES ('.$this->db->idate($now).','; @@ -257,7 +257,7 @@ class PaiementFourn extends Paiement { if (count($billsarray)) { - $this->error='Impossible de supprimer un paiement portant sur au moins une facture a l\'etat paye'; + $this->error='Can\'t delete a payment shared by at least one invoice with status payed'; $this->db->rollback(); return -1; } @@ -285,11 +285,13 @@ class PaiementFourn extends Paiement // Efface la ligne de paiement (dans paiement_facture et paiement) $sql = 'DELETE FROM '.MAIN_DB_PREFIX.'paiementfourn_facturefourn'; $sql.= ' WHERE fk_paiementfourn = '.$this->id; + dol_syslog("sql=".$sql); $resql = $this->db->query($sql); if ($resql) { $sql = 'DELETE FROM '.MAIN_DB_PREFIX.'paiementfourn'; $sql.= ' WHERE rowid = '.$this->id; + dol_syslog("sql=".$sql); $result = $this->db->query($sql); if (! $result) { diff --git a/htdocs/fourn/facture/fiche.php b/htdocs/fourn/facture/fiche.php index 40d9de1a724..fb7d6069304 100644 --- a/htdocs/fourn/facture/fiche.php +++ b/htdocs/fourn/facture/fiche.php @@ -198,14 +198,15 @@ elseif ($action == 'setnote' && $user->rights->fournisseur->facture->creer) } // Delete payment -elseif($action == 'deletepaiement') +elseif ($action == 'deletepaiement') { $object->fetch($id); if ($object->statut == 1 && $object->paye == 0 && $user->societe_id == 0) { $paiementfourn = new PaiementFourn($db); - $paiementfourn->fetch($_GET['paiement_id']); - $paiementfourn->delete(); + $paiementfourn->fetch(GETPOST('paiement_id')); + $result=$paiementfourn->delete(); + if ($result < 0) $mesg='
'.$paiementfourn->error.'
'; } } @@ -899,6 +900,7 @@ if (! empty($conf->global->MAIN_DISABLE_CONTACTS_TAB)) $form = new Form($db); $formfile = new FormFile($db); +$bankaccountstatic=new Account($db); llxHeader('','',''); @@ -1258,9 +1260,7 @@ else if ($ret == 'html') print '
'; } - /* - * Confirmation de la suppression de la facture fournisseur - */ + // Confirmation de la suppression de la facture fournisseur if ($action == 'delete') { $ret=$form->form_confirm($_SERVER["PHP_SELF"].'?id='.$object->id, $langs->trans('DeleteBill'), $langs->trans('ConfirmDeleteBill'), 'confirm_delete', '', 0, 1); @@ -1268,9 +1268,9 @@ else } - /* - * Facture - */ + /** + * Invoice + */ print ''; // Ref @@ -1334,9 +1334,10 @@ else /* * List of payments - */ - $nbrows=7; + */ + $nbrows=7; $nbcols=2; if ($conf->projet->enabled) $nbrows++; + if ($conf->banque->enabled) $nbcols++; // Local taxes if ($mysoc->country_code=='ES') @@ -1347,14 +1348,17 @@ else print ''; print ''; print ''; + if ($conf->banque->enabled) print ''; print ''; print ''; print ''; - $var=True; - while ($i < $num) + $var=true; + if ($num > 0) { - $objp = $db->fetch_object($result); - $var=!$var; - print ''; - print '\n"; - print ''; - print ''; - print ''; + print '\n"; + print ''; + if ($conf->banque->enabled) + { + $bankaccountstatic->id=$objp->baid; + $bankaccountstatic->ref=$objp->ref; + $bankaccountstatic->label=$objp->ref; + print ''; + } + print ''; + print ''; + print ''; + $totalpaye += $objp->amount; + $i++; } - print ''; - print ''; - $totalpaye += $objp->amount; - $i++; + } + else + { + print ''; } if ($object->paye == 0) { - print ''; - print ''; + print ''; + print ''; $resteapayer = $object->total_ttc - $totalpaye; - print ''; - print ''; + print ''; + print ''; } print '
'; - // TODO move to DAO class - $sql = 'SELECT datep as dp, pf.amount,'; - $sql .= ' c.libelle as paiement_type, p.num_paiement, p.rowid'; - $sql .= ' FROM '.MAIN_DB_PREFIX.'paiementfourn as p'; - $sql .= ' LEFT JOIN '.MAIN_DB_PREFIX.'c_paiement as c ON p.fk_paiement = c.id'; - $sql .= ' LEFT JOIN '.MAIN_DB_PREFIX.'paiementfourn_facturefourn as pf ON pf.fk_paiementfourn = p.rowid'; - $sql .= ' WHERE pf.fk_facturefourn = '.$object->id; - $sql .= ' ORDER BY dp DESC'; + $sql = 'SELECT p.datep as dp, p.num_paiement, p.rowid, p.fk_bank,'; + $sql.= ' c.libelle as paiement_type,'; + $sql.= ' pf.amount,'; + $sql.= ' ba.rowid as baid, ba.ref, ba.label'; + $sql.= ' FROM '.MAIN_DB_PREFIX.'paiementfourn as p'; + $sql.= ' LEFT JOIN '.MAIN_DB_PREFIX.'bank as b ON p.fk_bank = b.rowid'; + $sql.= ' LEFT JOIN '.MAIN_DB_PREFIX.'bank_account as ba ON b.fk_account = ba.rowid'; + $sql.= ' LEFT JOIN '.MAIN_DB_PREFIX.'c_paiement as c ON p.fk_paiement = c.id'; + $sql.= ' LEFT JOIN '.MAIN_DB_PREFIX.'paiementfourn_facturefourn as pf ON pf.fk_paiementfourn = p.rowid'; + $sql.= ' WHERE pf.fk_facturefourn = '.$object->id; + $sql.= ' ORDER BY p.datep, p.tms'; $result = $db->query($sql); if ($result) @@ -1365,41 +1369,58 @@ else print '
'.$langs->trans('Payments').''.$langs->trans('Type').''.$langs->trans('BankAccount').''.$langs->trans('Amount').' 
'.img_object($langs->trans('ShowPayment'),'payment').' '.dol_print_date($db->jdate($objp->dp),'day')."'.$objp->paiement_type.' '.$objp->num_paiement.''.price($objp->amount).''; - if ($object->statut == 1 && $object->paye == 0 && $user->societe_id == 0) + while ($i < $num) { - print 'rowid.'">'; - print img_delete(); - print ''; + $objp = $db->fetch_object($result); + $var=!$var; + print '
'.img_object($langs->trans('ShowPayment'),'payment').' '.dol_print_date($db->jdate($objp->dp),'day')."'.$objp->paiement_type.' '.$objp->num_paiement.''; + print $bankaccountstatic->getNomUrl(1,'transactions'); + print ''.price($objp->amount).''; + if ($object->statut == 1 && $object->paye == 0 && $user->societe_id == 0) + { + print 'rowid.'">'; + print img_delete(); + print ''; + } + print '
'.$langs->trans("None").'
'.$langs->trans('AlreadyPaid').' :'.price($totalpaye).'
'.$langs->trans("Billed").' :'.price($object->total_ttc).'
'.$langs->trans('AlreadyPaid').' :'.price($totalpaye).'
'.$langs->trans("Billed").' :'.price($object->total_ttc).'
'.$langs->trans('RemainderToPay').' :'.price($resteapayer).'
'.$langs->trans('RemainderToPay').' :'.price($resteapayer).'
'; $db->free($result); @@ -1420,7 +1441,7 @@ else // Due date print ''.$form->editfieldkey("DateMaxPayment",'date_lim_reglement',$object->date_echeance,$object,($object->statut<2 && $user->rights->fournisseur->facture->creer && $object->getSommePaiement() <= 0),'datepicker').''; print $form->editfieldval("DateMaxPayment",'date_lim_reglement',$object->date_echeance,$object,($object->statut<2 && $user->rights->fournisseur->facture->creer && $object->getSommePaiement() <= 0),'datepicker'); - if ((empty($action) || $action == 'view') && $object->statut < 2 && $object->date_echeance && $object->date_echeance < ($now - $conf->facture->fournisseur->warning_delay)) print img_warning($langs->trans('Late')); + if ($action != 'editdate_li_reglement' && $object->statut < 2 && $object->date_echeance && $object->date_echeance < ($now - $conf->facture->fournisseur->warning_delay)) print img_warning($langs->trans('Late')); print ''; // Status