Task #0002125: Contact , devrait être refait sur le modèle de Fiche->résumé

This commit is contained in:
sparkyx 2022-09-14 16:27:53 +02:00
parent 42938d09c7
commit 8fdd7be647
12 changed files with 486 additions and 302 deletions

View file

@ -70,15 +70,21 @@ $f=new Fiche($cn, $f_id);
echo '<div class="content">';
echo $f->get_gestion_title();
$menu=array(
array('href'=>$root."&sc=dc", 'label'=>_('Fiche'), 'alt'=>_('Détail de la fiche')),
array('href'=>$root.'&sc=sv', 'label'=>_('Suivi'), 'alt'=>_('Suivi Fournisseur, client, banque, devis, bon de commande, courrier')),
array('href'=>$root.'&sc=cn', 'label'=>_('Contact'), 'alt'=>_('Liste de contacts')),
array('href'=>$root.'&sc=op', 'label'=>_('Opérations'), 'alt'=>_('Toutes les opérations')),
array('href'=>$root.'&sc=bal', 'label'=>_('Balance'), 'alt'=>_('Balance du tiers')),
array('href'=>$root.'&sc=balag', 'label'=>_('Balance âgée'), 'alt'=>_('Balance âgée du tiers')),
array('href'=>$root.'&sc=let', 'label'=>_('Lettrage'), 'alt'=>_('Opérations & Lettrages'))
);
$from=$http->request("ac");
$menu[]= array('href'=>$root."&sc=dc", 'label'=>_('Fiche'), 'alt'=>_('Détail de la fiche'));
$menu[]=array('href'=>$root.'&sc=sv', 'label'=>_('Suivi'), 'alt'=>_('Suivi Fournisseur, client, banque, devis, bon de commande, courrier'));
// No submenu CONTACT for the menu CONTACT
if ( strpos($from,"CONTACT") === false) {
$menu[]=array('href'=>$root.'&sc=cn', 'label'=>_('Contact'), 'alt'=>_('Liste de contacts'));
}
$menu[]=array('href'=>$root.'&sc=op', 'label'=>_('Opérations'), 'alt'=>_('Toutes les opérations'));
$menu[]=array('href'=>$root.'&sc=bal', 'label'=>_('Balance'), 'alt'=>_('Balance du tiers'));
$menu[]=array('href'=>$root.'&sc=balag', 'label'=>_('Balance âgée'), 'alt'=>_('Balance âgée du tiers'));
$menu[]=array('href'=>$root.'&sc=let', 'label'=>_('Lettrage'), 'alt'=>_('Opérations & Lettrages'));
echo '<ul class="tabs" style="padding-top:0px">';
for ($i=0; $i<count($menu); $i++)
{
@ -141,8 +147,8 @@ if ($ss_action=='cn')
echo dossier::hidden();
$f=new Fiche($cn, $http->request('f_id','number'));
$contact=new Contact($cn);
$contact->company=$f->get_quick_code();
echo $contact->summary("");
$contact->filter_company($f->get_quick_code());
echo $contact->summary();
$sql=' select fd_id from fiche_def where frd_id='.FICHE_TYPE_CONTACT;
$filter=$cn->make_list($sql);

View file

@ -616,4 +616,5 @@ class Card_Property
return;
}
}

View file

@ -29,118 +29,148 @@ require_once NOALYSS_INCLUDE.'/lib/user_common.php';
class contact extends Fiche
{
var $company; /*!< $company company of the contact (ad_id=ATTR_DEF_COMPANY)*/
private $filter;
/*!\brief constructor */
function __construct($p_cn,$p_id=0)
{
$this->fiche_def_ref=FICHE_TYPE_CONTACT;
parent::__construct($p_cn,$p_id) ;
$this->company="";
$this->filter=[];
}
/*!
* @brief display a summary of the contact card
/**
* @brief Build the SQL query thanks the parameter
* @param array $array if empty , we use $this->filter , otherwise $array will override it
* @return string
*/
function build_sql($array)
{
if ( empty($array) ) $array=$this->filter;
$sql_query='
SELECT f_id,
contact_fname,
contact_name,
contact_qcode,
contact_company,
contact_mobile,
contact_phone,
contact_email,
contact_fax
FROM public.v_contact
';
$where=' where ';$and='';
if ( isset ($array['company'])) {
$sql_query.=$where.sprintf(" contact_company ilike '%%%s%%'",
sql_string($array['company']));
$where='';$and=' and ';
}
if ( isset($array['search'])) {
$sql_query.=$where.$and.sprintf(" f_id in (select distinct f_id from fiche_detail where ad_value ilike '%%%s%%')",
sql_string($array['search']));
$where='';$and=' and ';
}
if ( isset($array['category'])) {
$sql_query.=$where.$and.sprintf(" fd_id = %s",
sql_string($array['category']));
$where='';$and=' and ';
}
return $sql_query;
}
function filter_category($pn_category) {
unset($this->filter['category']);
if ( !empty($pn_category)
&& isNumber($pn_category)==1
&& $pn_category != -1){
$this->filter['category']=$pn_category;
}
}
function filter_company($p_company=null) {
unset($this->filter['company']);
if ( ! empty($p_company) && $p_company != "-1") {
$this->filter['company']= strtoupper($p_company);
}
return $this;
}
function filter_search($p_search="") {
unset($this->filter['search']);
if ( ! empty($p_search) ){
$this->filter['search']=$p_search;
}
}
/**
* @return array
*/
public function getFilter(): array
{
return $this->filter;
}
/*!
* @brief display a summary of the contact card,
*
* @param p_search : filter on card name
* @param p_action : nothing
* @param p_sql : extra SQL command
* @param p_nothing (filter)
* @param string p_search : filter on card name, if empty , contact->filter will be used
* @param string p_action : not used
* @param string p_sql : extra SQL command not used
* @param string p_nothing (filter) not used
*
* @returns string to display
*/
function Summary($p_search="",$p_action="",$p_sql="",$p_nothing=false)
{
$p_search=sql_string($p_search);
$extra_sql="";
if ( $this->company != "")
{
$extra_sql="and f_id in (select f_id from fiche_detail
where ad_value='".sql_string(trim(strtoupper($this->company)))."' and ad_id=".ATTR_DEF_COMPANY.") ";
$http=new HttpInput();
if ( !empty ($p_search) ) { $this->filter_search($p_search);}
$sql=$this->build_sql($this->filter);
if (DEBUGNOALYSS > 1) {
print_r("Contact::summary ($sql)");
}
$url=urlencode($_SERVER['REQUEST_URI']);
$script=$_SERVER['PHP_SELF'];
// Creation of the nav bar
// Get the max numberRow
$all_contact=$this->count_by_modele($this->fiche_def_ref,$p_search,$extra_sql.$p_sql);
$all_contact=$this->cn->get_value("select count(*) from ($sql) as m");
if ( $all_contact == 0 ) return "";
// Get offset and page variable
$offset=( isset ($_REQUEST['offset'] )) ?$_REQUEST['offset']:0;
$page=(isset($_REQUEST['page']))?$_REQUEST['page']:1;
$offset=$http->request('offset','number',0);
$page=$http->request('page','number',1);
$bar=navigation_bar($offset,$all_contact,$_SESSION[SESSION_KEY.'g_pagesize'],$page);
// set a filter ?
$search="";
if ( noalyss_trim($p_search) != "" )
{
$search=" and f_id in
(select f_id from fiche_Detail
where
ad_id=1 and ad_value ilike '%$p_search%') ";
}
// Get The result Array
$step_contact=$this->get_by_category($offset,$search.$extra_sql.$p_sql);
$step_contact=$this->fetch($sql);
if ( $all_contact == 0 ) return "";
$r=$bar;
$r.='<table id="contact_tb" class="sortable">
<TR>
<th>Quick Code</th>
<th>Nom</th>
<th>Prénom</th>
<th>Société</th>
<th>Téléphone</th>
<th>email</th>
<th>Fax</th>
</TR>';
$base=$_SERVER['PHP_SELF'];
// Compute the url
$url="";
$and="?";
$get=$_GET;
if ( isset ($get) )
{
foreach ($get as $name=>$value )
{
// we clean the parameter offset, step, page and size
if ( ! in_array($name,array('f_id','detail')))
{
$url.=$and.$name."=".$value;
$and="&";
}// if
}//foreach
}// if
$back_url=urlencode($_SERVER['REQUEST_URI']);
if ( sizeof ($step_contact ) == 0 )
return $r;
$idx=0;
foreach ($step_contact as $contact )
{
$l_company=new Fiche($this->cn);
$l_company->get_by_qcode($contact->strAttribut(ATTR_DEF_COMPANY),false);
$l_company_name=$l_company->strAttribut(ATTR_DEF_NAME,0);
// add popup for detail if the company does exist
if ( $l_company_name !="")
{
$l_company_name=HtmlInput::card_detail($contact->strAttribut
(ATTR_DEF_COMPANY),$l_company_name,'style="text-decoration:underline;"');
}
$tr=($idx%2==0)?' <tr class="odd">':'<tr class="even">';
$idx++;
$r.=$tr;
$qcode=$contact->strAttribut(ATTR_DEF_QUICKCODE);
$r.='<TD>'.HtmlInput::card_detail($qcode)."</TD>";
$r.="<TD>".$contact->strAttribut(ATTR_DEF_NAME,0)."</TD>";
$r.="<TD>".$contact->strAttribut(ATTR_DEF_FIRST_NAME,0)."</TD>";
$r.="<TD>".$l_company_name."</TD>";
$r.="<TD>".$contact->strAttribut(ATTR_DEF_TEL,0)."</TD>";
$r.="<TD>".$contact->strAttribut(ATTR_DEF_EMAIL,0)."</TD>".
"<TD> ".$contact->strAttribut(ATTR_DEF_FAX,0)."</TD>";
$r.="</TR>";
$contact=$this;
require NOALYSS_TEMPLATE.'/contact-summary.php';
}
$r.="</TABLE>";
$r.=$bar;
return $r;
}
/**
* @brief Fetch all rows from view, ordered by by contact_name, with offset and limit
* @see Contact::build_sql()
* @param $ps_string
* @return array
*/
private function fetch($ps_sql) {
$http=new HttpInput();
// Get offset and page variable
$offset=$http->request('offset','number',0);
$nb_pagesize=$_SESSION[SESSION_KEY.'g_pagesize'];
$limit = '';
$ps_sql.=' order by contact_name ';
if ( $nb_pagesize <0 ) {$limit='';} else {
$limit=sprintf(' limit %s offset %s',$nb_pagesize,$offset);
}
$ps_sql .= $limit ;
if (DEBUGNOALYSS > 1) {
print_r("Contact::fetch ($ps_sql)");
}
return $this->cn->get_array($ps_sql);
}
}

View file

@ -1301,7 +1301,7 @@ class Follow_Up
if ($fiche->id==0)
$str=' and false ';
else
$str=" and (f_id_dest= ".$fiche->id." or ag_id in (select ag_id from action_person as ap where ap.f_id=".$fiche->id.") )";
$str=" and (f_id_dest= ".$fiche->id." or ag_id in (select ag_id from action_person as ap where ap.f_id=".$fiche->id.") or ag_contact=".$fiche->id." )";
}
}
if (isset($p_array['tdoc'])&&$p_array['tdoc'] !=-1)
@ -1342,7 +1342,7 @@ class Follow_Up
}
else
{
$action_query .=" and (ag_owner='".$_SESSION[SESSION_KEY.'g_user']."' or ".self::sql_security_filter($cn, "R")." or ag_dest=-1 )";
$action_query .=" and (ag_owner='".$_SESSION[SESSION_KEY.'g_user']."' or ".self::sql_security_filter($cn, "R")." or ag_dest=-1 )";
}
@ -1364,7 +1364,7 @@ class Follow_Up
$action_query .= Follow_Up::filter_by_tag($cn, $p_array);
}
if ( DEBUGNOALYSS > 1) {
print "QUERY = [ $action_query.$str]";
print __FILE__.__LINE__."QUERY = [ $action_query.$str]";
}
return $action_query.$str;
}

View file

@ -115,7 +115,7 @@ if (!defined("NOALYSS_PACKAGE_REPOSITORY")) {
if (!defined("SYSINFO_DISPLAY")) {
define("SYSINFO_DISPLAY", TRUE);
}
define("DBVERSION", 177);
define("DBVERSION", 178);
define("MONO_DATABASE", 25);
define("DBVERSIONREPO", 20);
define('NOTFOUND', '--not found--');

View file

@ -20,8 +20,11 @@
/**\brief include from client.inc.php and concerned only the contact card and
* the contact category
*/
if ( ! defined ('ALLOWED') ) die('Appel direct ne sont pas permis');
global $g_user,$cn;
$http=new HttpInput();
$low_action = $http->request('sb','string','list');
@ -98,26 +101,22 @@ if ($low_action == "list")
<p class="notice"><?=_("Si vous modifiez un contact, il faut recharger la page pour voir les changements")?></p>
</div>
<?php
$client = new contact($cn);
$contact = new contact($cn);
$search =$http->get("query","string","");
$sql = "";
if (isset($_GET['cat']))
{
$cat=$http->get("cat","number");
if ($cat!= -1 ) $sql = sprintf(" and fd_id = %s", $cat);
$contact->filter_category($cat);
}
if (isset($_GET['sel_company']))
{
$sel_company=$http->get("sel_company");
if ($sel_company != '' && $sel_company != "-1")
{
$client->company=$sel_company;
}
$contact->filter_company($sel_company);
}
echo '<div class="content">';
echo $client->Summary($search,"contact",$sql);
echo $contact->Summary($search,"contact",$sql);
echo '<br>';
@ -128,7 +127,7 @@ if ($low_action == "list")
$f_add_button->label = _('Créer une nouvelle fiche');
$f_add_button->set_attribute('win_refresh', 'yes');
$f_add_button->set_attribute('type_cat', FICHE_TYPE_CONTACT);
$f_add_button->javascript = " select_card_type(this);";
$f_add_button->javascript = "select_card_type(this);";
echo $f_add_button->input();
$f_cat_button=new IButton('add_cat');

View file

@ -0,0 +1,88 @@
<?php
/*
* Copyright (C) 2017 Dany De Bontridder <dany@alchimerys.be>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
/**
* class_user_filter_sql.php
*
* @file
* @brief abstract of the view public.v_contact
*/
/**
* @class User_filter_SQL
* @brief ORM abstract of the view public.v_contact_sql
*/
class V_Contact_SQL extends Data_SQL
{
function __construct($p_cn, $p_id = -1)
{
$this->table="public.v_contact";
$this->primary_key="f_id";
$a_name=explode(",","f_id,contact_fname,contact_name,contact_qcode,contact_company,contact_mobile,contact_phone,contact_email,contact_fax,card_category");
$this->type=[];
foreach ($a_name as $key) {
$this->type[trim($key)]="text";
$this->name[trim($key)]=$key;
}
$this->type['f_id']="number";
$this->type['card_category']="number";
parent::__construct($p_cn, $p_id);
}
function insert()
{
throw new Exception("not implemented");
}
function delete()
{
throw new Exception("not implemented");
}
function update()
{
throw new Exception("not implemented");
}
function load()
{
$array=$this->cn->get_row("select * from ".$this->table." where f_id=$1",array($this->f_id));
if (empty ($array) ) { $this->f_id=-1;return false;}
$this->to_row($array);
return true;
}
function seek($cond = '', $p_array = null)
{
throw new Exception("not implemented");
}
function count($p_where = "", $p_array = null)
{
throw new Exception("not implemented");
}
function exist()
{
throw new Exception("not implemented");
}
}

View file

@ -241,6 +241,16 @@ abstract class Data_SQL
return $array;
}
/**
* @brief turns a row fetched from the DB into a SQL object in updating all his attribute
* @param $p_array
* @return void
*/
public function to_row($p_array) {
foreach ($this->name as $name) {
$this->$name=$p_array[$name];
}
}
/**
* @brief retrieve array of object thanks a condition
* @param $cond condition (where clause) (optional by default all the rows are fetched)

View file

@ -0,0 +1,25 @@
begin;
create or replace view v_contact as
with contact_data as (select f.f_id , f.fd_id from fiche f join fiche_def fd on (f.fd_id=fd.fd_id) where fd.frd_id=16)
select f_id,
(select ad_value from fiche_detail where ad_id=32 and f_id=cd.f_id) as contact_fname,
(select ad_value from fiche_detail where ad_id=1 and f_id=cd.f_id) as contact_name,
(select ad_value from fiche_detail where ad_id=23 and f_id=cd.f_id) as contact_qcode,
(select ad_value from fiche_detail where ad_id=25 and f_id=cd.f_id) as contact_company,
(select ad_value from fiche_detail where ad_id=27 and f_id=cd.f_id) as contact_mobile,
(select ad_value from fiche_detail where ad_id=17 and f_id=cd.f_id) as contact_phone,
(select ad_value from fiche_detail where ad_id=18 and f_id=cd.f_id) as contact_email,
(select ad_value from fiche_detail where ad_id=26 and f_id=cd.f_id) as contact_fax,
cd.fd_id as card_category
from contact_data cd ;
insert into attr_min values (16,32);
insert into jnt_fic_attr (fd_id,jnt_order,ad_id) select fd_id,10,32 from fiche_def where frd_id=16 on conflict(fd_id,ad_id) do nothing;
update attr_def set ad_text='Tél. Portable' where ad_id=27;
insert into version (val,v_description) values (178,'Correct contact');
commit;

View file

@ -0,0 +1,96 @@
<?php
/**
* @brief display table of contact, called from Contact::summary
*
*/
// From calling script : $step_contact,$bar,$offset,$page
$cn=Dossier::connect();
$http=new HttpInput();
$from=$http->request("ac","string","");
?>
<?php echo $bar;?>
<table id="contact_tb" class="sortable">
<TR>
<th><?=_('Code')?></th>
<th><?=_('Nom')?></th>
<th><?=_('Prénom')?></th>
<th><?=_('Société')?></th>
<th><?=_('Mobile')?></th>
<th><?=_('email')?></th>
<th><?=_('Téléphone')?></th>
<th><?=_('Fax')?></th>
</TR>
<?php
$idx=0;
$dossier_id=Dossier::id();
$ac=$http->request('ac');
foreach ($step_contact as $contact):
$even_odd=($idx%2==0)?'even':'odd';
$idx++;
$url=NOALYSS_URL."/do.php?".http_build_query(["gDossier"=>$dossier_id,"ac"=>$ac,"sb"=>"detail","f_id"=>$contact['f_id']]);
?>
<tr class="<?=$even_odd?>">
<td>
<?php if ( strpos($from,'CONTACT') !== false ):?>
<a href="<?=$url?>">
<?=h($contact['contact_qcode'])?>
</a>
<?php else :?>
<?php
$fiche=new Fiche($cn,$contact['f_id']);
echo \HtmlInput::card_detail($contact['contact_qcode']);
?>
<?php endif;?>
</td>
<td>
<?=$contact['contact_name']?>
</td>
<td>
<?=$contact['contact_fname']?>
</td>
<td>
<?php
/* detail for the company */
if ( !empty ($contact['contact_company']) ) {
$l_company=new Fiche($cn);
$l_company->get_by_qcode(trim($contact['contact_company']),false);
$l_company_name=$l_company->strAttribut(ATTR_DEF_NAME,0);
// add popup for detail if the company does exist
if ( $l_company_name !="")
{
echo HtmlInput::card_detail($contact['contact_company'],$l_company_name,'style="text-decoration:underline;"');
}
}
?>
</td>
<td>
<?=$contact['contact_mobile']?>
</td>
<td>
<?php
$result=mailTo($contact['contact_email']);
if ($result) {
echo $result;
} else {
echo $contact['contact_email'];
echo Icon_Action::warnbulle(83);
}
?>
</td>
<td>
<?php if (!empty($contact['contact_phone'])):?>
<a href="tel:<?=$contact['contact_phone']?>"><?=$contact['contact_phone']?></a>
<?php endif;?>
</td>
<td>
<?=$contact['contact_phone']?>
</td>
</tr>
<?php endforeach;?>
</table>
<?php echo $bar;?>

View file

@ -1,171 +0,0 @@
-- auto-generated definition
create table acc_other_tax
(
ac_id serial constraint acc_other_tax_pk primary key,
ac_label text not null,
ac_rate numeric (5,2) not null,
ajrn_def_id integer[],
ac_accounting account_type not null
);
comment on table acc_other_tax is 'Additional tax for Sale or Purchase ';
comment on column acc_other_tax.ac_label is 'Label of the tax';
comment on column acc_other_tax.ac_rate is 'rate of the tax in percent';
comment on column acc_other_tax.ajrn_def_id is 'array of to FK jrn_def (jrn_def_id)';
comment on column acc_other_tax.ac_accounting is 'FK tmp_pcmn (pcm_val)';
ALTER TABLE public.jrn drop CONSTRAINT jrn_pkey ;
ALTER TABLE public.jrn ADD CONSTRAINT jrn_pkey PRIMARY KEY (jr_id);
-- public.jrn_tax definition
-- Drop table
-- DROP TABLE public.jrn_tax;
CREATE TABLE public.jrn_tax (
jt_id int4 NOT NULL GENERATED ALWAYS AS IDENTITY,
j_id int8 NOT NULL, -- fk jrnx
pcm_val public."account_type" NOT NULL, -- FK tmp_pcmn
ac_id int4 NOT NULL, -- FK to acc_other_tax
CONSTRAINT jrn_tax_pk PRIMARY KEY (jt_id)
);
-- Column comments
COMMENT ON COLUMN public.jrn_tax.j_id IS 'fk jrnx';
COMMENT ON COLUMN public.jrn_tax.pcm_val IS 'FK tmp_pcmn';
COMMENT ON COLUMN public.jrn_tax.ac_id IS 'FK to acc_other_tax';
-- public.jrn_tax foreign keys
ALTER TABLE public.jrn_tax ADD CONSTRAINT jrn_tax_acc_other_tax_fk FOREIGN KEY (ac_id) REFERENCES public.acc_other_tax(ac_id);
ALTER TABLE public.jrn_tax ADD CONSTRAINT jrn_tax_fk FOREIGN KEY (j_id) REFERENCES public.jrnx(j_id);
drop view if exists v_detail_sale;
create or replace view v_detail_sale
(jr_id, jr_date, jr_date_paid, jr_ech, jr_tech_per, jr_comment, jr_pj_number, jr_internal, jr_def_id,
j_poste, j_text, j_qcode, jr_rapt, item_card, item_name, qs_client, tiers_name, quick_code, tva_label,
tva_comment, tva_both_side, vat_sided, vat_code, vat, price, quantity, price_per_unit, htva, tot_vat,
tot_tva_np,other_tax_amount, oc_amount, oc_vat_amount, cr_code_iso)
as
WITH m AS (
SELECT sum(quant_sold_1.qs_price) AS htva,
sum(quant_sold_1.qs_vat) AS tot_vat,
sum(quant_sold_1.qs_vat_sided) AS tot_tva_np,
jrn_1.jr_id
FROM quant_sold quant_sold_1
JOIN jrnx jrnx_1 USING (j_id)
JOIN jrn jrn_1 ON jrnx_1.j_grpt = jrn_1.jr_grpt_id
GROUP BY jrn_1.jr_id
),other_tax as (
select j_grpt , sum(case when j_debit is true then 0-j_montant else j_montant end) other_tax_amount from jrnx join jrn_tax using (j_id) group by j_grpt )
SELECT jrn.jr_id,
jrn.jr_date,
jrn.jr_date_paid,
jrn.jr_ech,
jrn.jr_tech_per,
jrn.jr_comment,
jrn.jr_pj_number,
jrn.jr_internal,
jrn.jr_def_id,
jrnx.j_poste,
jrnx.j_text,
jrnx.j_qcode,
jrn.jr_rapt,
quant_sold.qs_fiche AS item_card,
a.name AS item_name,
quant_sold.qs_client,
b.vw_name AS tiers_name,
b.quick_code,
tva_rate.tva_label,
tva_rate.tva_comment,
tva_rate.tva_both_side,
quant_sold.qs_vat_sided AS vat_sided,
quant_sold.qs_vat_code AS vat_code,
quant_sold.qs_vat AS vat,
quant_sold.qs_price AS price,
quant_sold.qs_quantite AS quantity,
quant_sold.qs_price / quant_sold.qs_quantite AS price_per_unit,
m.htva,
m.tot_vat,
m.tot_tva_np,
ot.other_tax_amount,
oc.oc_amount,
oc.oc_vat_amount,
(SELECT currency.cr_code_iso
FROM currency
WHERE jrn.currency_id = currency.id) AS cr_code_iso
FROM jrn
JOIN jrnx ON jrn.jr_grpt_id = jrnx.j_grpt
JOIN quant_sold USING (j_id)
JOIN vw_fiche_name a ON quant_sold.qs_fiche = a.f_id
JOIN vw_fiche_attr b ON quant_sold.qs_client = b.f_id
LEFT JOIN tva_rate ON quant_sold.qs_vat_code = tva_rate.tva_id
JOIN m ON m.jr_id = jrn.jr_id
LEFT JOIN operation_currency oc ON oc.j_id = jrnx.j_id
left join other_tax ot on ot.j_grpt=jrn.jr_grpt_id;
drop view if exists public.v_detail_purchase;
create VIEW public.v_detail_purchase
AS WITH m AS (
SELECT sum(quant_purchase_1.qp_price) AS htva,
sum(quant_purchase_1.qp_vat) AS tot_vat,
sum(quant_purchase_1.qp_vat_sided) AS tot_tva_np,
jrn_1.jr_id
FROM quant_purchase quant_purchase_1
JOIN jrnx jrnx_1 USING (j_id)
JOIN jrn jrn_1 ON jrnx_1.j_grpt = jrn_1.jr_grpt_id
GROUP BY jrn_1.jr_id
),other_tax as (
select j_grpt , sum(case when j_debit is false then 0-j_montant else j_montant end) other_tax_amount from jrnx join jrn_tax using (j_id) group by j_grpt )
SELECT jrn.jr_id,
jrn.jr_date,
jrn.jr_date_paid,
jrn.jr_ech,
jrn.jr_tech_per,
jrn.jr_comment,
jrn.jr_pj_number,
jrn.jr_internal,
jrn.jr_def_id,
jrnx.j_poste,
jrnx.j_text,
jrnx.j_qcode,
jrn.jr_rapt,
quant_purchase.qp_fiche AS item_card,
a.name AS item_name,
quant_purchase.qp_supplier,
b.vw_name AS tiers_name,
b.quick_code,
tva_rate.tva_label,
tva_rate.tva_comment,
tva_rate.tva_both_side,
quant_purchase.qp_vat_sided AS vat_sided,
quant_purchase.qp_vat_code AS vat_code,
quant_purchase.qp_vat AS vat,
quant_purchase.qp_price AS price,
quant_purchase.qp_quantite AS quantity,
quant_purchase.qp_price / quant_purchase.qp_quantite AS price_per_unit,
quant_purchase.qp_nd_amount AS non_ded_amount,
quant_purchase.qp_nd_tva AS non_ded_tva,
quant_purchase.qp_nd_tva_recup AS non_ded_tva_recup,
m.htva,
m.tot_vat,
m.tot_tva_np,
ot.other_tax_amount,
oc.oc_amount,
oc.oc_vat_amount,
( SELECT currency.cr_code_iso
FROM currency
WHERE jrn.currency_id = currency.id) AS cr_code_iso
FROM jrn
JOIN jrnx ON jrn.jr_grpt_id = jrnx.j_grpt
JOIN quant_purchase USING (j_id)
JOIN vw_fiche_name a ON quant_purchase.qp_fiche = a.f_id
JOIN vw_fiche_attr b ON quant_purchase.qp_supplier = b.f_id
LEFT JOIN tva_rate ON quant_purchase.qp_vat_code = tva_rate.tva_id
JOIN m ON m.jr_id = jrn.jr_id
LEFT JOIN operation_currency oc ON oc.j_id = jrnx.j_id
left join other_tax ot on ot.j_grpt=jrn.jr_grpt_id;

View file

@ -28,12 +28,11 @@
*/
use PHPUnit\Framework\TestCase;
require DIRTEST.'/global.php';
/**
* @backupGlobals enabled
* @coversDefaultClass \Contact
*/
require DIRTEST.'/global.php';
class ContactTest extends TestCase
{
@ -41,6 +40,7 @@ class ContactTest extends TestCase
* @var Fiche
*/
protected $object;
protected $connection;
/**
* Sets up the fixture, for example, opens a network connection.
@ -48,10 +48,11 @@ class ContactTest extends TestCase
*/
protected function setUp():void
{
include 'global.php';
$this->object = new stdClass();
$this->object->fiche_def=0;
$this->object->card_to_clean=array();
$this->connection=Dossier::connect();
}
/**
@ -60,8 +61,9 @@ class ContactTest extends TestCase
*/
protected function tearDown():void
{
include 'global.php';
global $g_connection;
if ( ! is_object($this->object->fiche_def)) return;
include_once DIRTEST.'/global.php';
$g_connection=Dossier::connect();
$sql=new ArrayObject();
$sql->append("delete from fiche_detail where f_id in (select f_id from fiche where fd_id = $1 )");
$sql->append("delete from fiche where f_id not in (select f_id from fiche_detail where $1=$1)");
@ -101,9 +103,9 @@ class ContactTest extends TestCase
*/
public function createContact()
{
include_once 'global.php';
include_once DIRTEST.'/global.php';
global $g_connection;
$g_connection=Dossier::connect();
// create a category of card, type Charges
$fiche_def=new Fiche_Def($g_connection);
$aParam=["nom_mod"=>"Test.Contact",
@ -127,7 +129,8 @@ class ContactTest extends TestCase
*/
public function createContactCard()
{
global $g_connection;
include_once DIRTEST.'/global.php';
if ( $this->object->fiche_def == 0) {
$this->createContact();
}
@ -139,7 +142,7 @@ class ContactTest extends TestCase
$aName[]=['name'=>'Daniel','company'=>'FOURNI'];
$aName[]=['name'=>'Geert','company'=>'FOURNI'];
foreach ($aName as $param ) {
$fiche=new Fiche($g_connection);
$fiche=new Fiche($this->connection);
$fiche->fiche_def=$this->object->fiche_def->id;
$fiche->load();
$fiche->setAttribut(ATTR_DEF_NAME, $param['name']);
@ -157,6 +160,7 @@ class ContactTest extends TestCase
*/
public function testSummary()
{
include_once DIRTEST.'/global.php';
global $g_connection;
if ( $this->object->fiche_def == 0) {
$this->createContactCard();
@ -164,14 +168,110 @@ class ContactTest extends TestCase
$contact=new Contact($g_connection);
$_SERVER['REQUEST_URI']="?";
$_SERVER['PHP_SELF']=__FILE__;
$r=$contact->summary();
$this->assertEquals(count($this->object->card_to_clean)*2 , substr_count($r,'fill_ipopcard')," 1. Missing card");
$contact->company=' fourni ';
$r=$contact->summary();
$this->assertEquals(6, substr_count($r,'fill_ipopcard') , 'not found all the contacts from FOURNI');
$r=$contact->summary('william');
$this->assertEquals(2, substr_count($r,'fill_ipopcard') , 'Search does not filter');
put_global(array(
["key"=>"offset","value"=>0],
["key"=>"ac","value"=>"CONTACT"],
["key"=>"page","value"=>1]));
ob_start();
$contact->summary();
$r=ob_get_contents();
ob_end_clean();
$path=__DIR__."/file/";
$filename="contact-summary-1.html";
\Noalyss\Facility::save_file($path,$filename,$r);
print "File saved into $path/$filename";
$this->assertEquals(4983, filesize ($path."/".$filename)," File not valide (1)");
$this->assertEquals(5 , preg_match_all('/<tr class="/',$r)," 1. Missing card");
$contact->filter_company(' fourni ');
ob_start();
$contact->summary();
$r=ob_get_contents();
ob_end_clean();
$filename="contact-summary-2.html";
\Noalyss\Facility::save_file($path,$filename,$r);
print "File saved into $path/$filename";
$this->assertEquals(3457,filesize ($path."/".$filename)," File not valide (2)");
$this->assertEquals(3 , preg_match_all('/<tr class="/',$r), 'not found all the contacts from FOURNI');
ob_start();
$contact->summary('william');
$r=ob_get_contents();
ob_end_clean();
$filename="contact-summary-3.html";
\Noalyss\Facility::save_file($path,$filename,$r);
print "File saved into $path/$filename";
$this->assertEquals(2018,filesize ($path."/".$filename)," File not valide (3)");
$this->assertEquals(1, preg_match_all('/<tr class="/',$r), 'Search does not filter');
}
/**
* @testdox test the filters
* @return void
*/
public function testFilter()
{
$contact=new Contact($this->connection);
$this->assertEquals(array(),$contact->getFilter(),' Filter not empty');
$contact->filter_search("search_sql");
$this->assertEquals(['search'=>'search_sql'],$contact->getFilter(),'Search not set');
$contact->filter_search("other_sql");
$this->assertEquals(['search'=>'other_sql'],$contact->getFilter(),'Search not replaced');
$contact->filter_company("company_sql");
$this->assertEquals(['search'=>'other_sql','company'=>'COMPANY_SQL'],$contact->getFilter(),'company not set');
$contact->filter_category(1);
$this->assertEquals(['search'=>'other_sql','company'=>'COMPANY_SQL','category'=>1],
$contact->getFilter(),'category not set');
$contact->filter_category(null);
$this->assertEquals(['search'=>'other_sql','company'=>'COMPANY_SQL'],$contact->getFilter(),'category not removed');
}
/**
* @depends testFilter
* @return void
*/
function testBuildSQL()
{
$contact=new Contact($this->connection);
$contact->filter_category(1);
$contact->filter_search("search_sql");
$expected=strtoupper(preg_replace("/\s+/",'',"SELECT f_id,contact_fname,
contact_name,
contact_qcode,
contact_company,
contact_mobile,
contact_phone,
contact_email,
contact_fax
FROM public.v_contact
where f_id in (select distinct f_id from fiche_detail where ad_value ilike '%search_sql%') and fd_id=1"));
$this->assertEquals($expected,strtoupper(preg_replace("/\s+/",'',$contact->build_sql([]))),' SQL Incorrect');
}
/**
* @testdox Test SQL V_Contact_SQL
* @return void
*/
function testObjectSQL()
{
if ( $this->object->fiche_def == 0) {
$this->createContactCard();
}
// take a card
$f_id=$this->object->card_to_clean[0];
$contact_sql=new V_Contact_SQL($this->connection,$f_id);
$this->assertTrue($contact_sql->load()," Cannot load existing card");
$this->assertTrue($contact_sql->contact_name=='Chantal','Data not updated');
$this->assertTrue($contact_sql->getp("contact_name")=='Chantal','Data not updated');
}
}