CREATE TABLE IF NOT EXISTS ipn_user_range_$mid 
( 
	id int(10)  NOT NULL auto_increment,
	cid int(10)  NOT NULL default '0',
	object_id int NOT NULL, 
	addr1 bigint NOT NULL default '0',
	addr2 bigint NOT NULL default '0',
	port1 int(10) NOT NULL default '0',
	port2 int(10) NOT NULL default '0',
	date1 date default NULL,
	date2 date default NULL,
	comment varchar(200) NOT NULL default '',
	plan_id INT NOT NULL,pers_plan_id INT NOT NULL,
	PRIMARY KEY  (id),KEY cid ( cid ), 
	KEY object_id ( object_id ),
	KEY date1 ( date1 ), 
	KEY date2 ( date2 ) 
);

CREATE TABLE IF NOT EXISTS ipn_service_$mid 
( 
	id int(11) NOT NULL auto_increment,
	pos int(10)  NOT NULL default '0',
	date1 date default NULL,
	date2 date default NULL,
	sid int(10)  NOT NULL default '0',
	source int(10)  NOT NULL default '0',
	iface int NOT NULL default '-1',
	direct int(10)  NOT NULL default '0',
	addr1 bigint NOT NULL default '0',
	addr2 bigint NOT NULL default '0',
	port1 int(10) NOT NULL default '0',
	port2 int(10) NOT NULL default '0',
	comment varchar(200) NOT NULL default '',
	plan_id int(10) NOT NULL default '0',
	PRIMARY KEY  (id),
	KEY date1 ( date1 ), 
	KEY date2 ( date2 ) 
);

CREATE TABLE IF NOT EXISTS ipn_contract_status_$mid
(
	cid int(10)  NOT NULL default '0',
	status tinyint(3)  NOT NULL default '0',
	PRIMARY KEY (`cid`)
);


CREATE TABLE IF NOT EXISTS ipn_contract_status_log_$mid
( 
	dt datetime NOT NULL default '0000-00-00 00:00:00',
	cid int(10)  NOT NULL default '0',
	action tinyint(4) NOT NULL default '0',
	uid int(11) NOT NULL default '0',
	comment char(200) NOT NULL default '',
	KEY cid ( cid )
);

CREATE TABLE IF NOT EXISTS ipn_user_source_$mid
( 
	aid int(10) NOT NULL default '0',
	source_id int(10) NOT NULL default '0',
	iface int NOT NULL, 
	KEY aid ( aid ), 
	KEY source_id( source_id )
);

CREATE TABLE ipn_gate_type_$mid
(
	id int(11) NOT NULL auto_increment,
	title varchar(200) NOT NULL default '',
	comment varchar(250) NOT NULL default '',
	config text NOT NULL,
	rule text NOT NULL,
	script text NOT NULL,
	PRIMARY KEY  (id) 
);

CREATE TABLE ipn_gate_$mid
(
	id int(10) NOT NULL auto_increment, 
	type int(11) NOT NULL,
	host varchar(50) NOT NULL default '',
	port int(11) NOT NULL default '0',
	keyword varchar(15) NOT NULL default '',
	date1 date,
	date2 date,
	comment varchar(255) NOT NULL default '',
	config text NOT NULL,
	parent_id INT NOT NULL, 
	PRIMARY KEY  (id) 
);

CREATE TABLE ipn_user_gate_$mid
(
	id int(10) unsigned NOT NULL auto_increment,
	cid int(10) unsigned NOT NULL default '0',
	rtid int(11) NOT NULL default '0',
	fwid int(10) unsigned NOT NULL default '0',
	rule_txt text NOT NULL,
	PRIMARY KEY (id),
	KEY cid (cid) 
);

CREATE TABLE ipn_rule_type_$mid
(
	id int(11) NOT NULL auto_increment,
	gtid int(11) NOT NULL default '0',
	title varchar(200) NOT NULL default '',
	comment varchar(250) NOT NULL default '',
	data text NOT NULL,
	PRIMARY KEY (id),
	KEY gtid (gtid) 
);
 
CREATE TABLE ipn_gate_rule_$mid
(
	id int(11) NOT NULL auto_increment,
	gtid int(11) NOT NULL,
	rtid int(11) NOT NULL,
	PRIMARY KEY  (id) 
);

CREATE TABLE ipn_gate_vlan_$mid
(
	id int(11) NOT NULL auto_increment,
	vid int(11) NOT NULL,
	cid int(11) NOT NULL,
	gid int(11) NOT NULL,
	PRIMARY KEY (id) 
);

CREATE TABLE ipn_iface_$mid
(
	id int(11) NOT NULL auto_increment,
	source_id int(11) default NULL,
	number int(11) default NULL,
	title varchar(255) default NULL,
	zone_id int(11) default NULL,
	UNIQUE KEY id (id),
	UNIQUE KEY source_number (source_id,number) 
);

CREATE TABLE ipn_zone_$mid
(
	id int(11) NOT NULL auto_increment,
	title varchar(255) default NULL,
	PRIMARY KEY id (id) 
);

CREATE TABLE ipn_service_link_plan_$mid
(
	id int(11) NOT NULL auto_increment,
	title varchar(200) NOT NULL DEFAULT '',
	type tinyint(2) NOT NULL,
	PRIMARY KEY (id)
);

CREATE TABLE detail_create_task_$mid
(
	id int(11) NOT NULL auto_increment,
	source_id int(11) NOT NULL,
	data blob,
	PRIMARY KEY (id)
);

CREATE TABLE ip_resource_category_$mid
(
	id int(11) NOT NULL auto_increment,
    title varchar(200) NOT NULL,
    comment varchar(250) NOT NULL,
    parent_id int(11) NOT NULL,
    PRIMARY KEY  (id) 
);

CREATE TABLE ip_resource_range_$mid
(
	id int(11) NOT NULL auto_increment,
	category_id int(11) NOT NULL,
	date1 date default NULL,
	date2 date default NULL,
	ip1 bigint(20) NOT NULL,
	ip2 bigint(20) NOT NULL,
	PRIMARY KEY  (id),
	KEY idx (category_id, date1, date2, ip1, ip2) 
);

ALTER TABLE ipn_gate_$mid ADD type INT NOT NULL AFTER id;
ALTER TABLE ipn_gate_$mid ADD config TEXT NOT NULL AFTER comment;

ALTER TABLE ipn_user_gate_$mid ADD `rtid` INT NOT NULL AFTER cid;

CREATE TABLE ipn_gate_type_$mid (
  id int(11) NOT NULL auto_increment,
  title varchar(200) NOT NULL default '',
  comment varchar(250) NOT NULL default '',
  config text NOT NULL,
  PRIMARY KEY  (id)
);

CREATE TABLE ipn_rule_type_$mid (
  id int(11) NOT NULL auto_increment,
  gtid int(11) NOT NULL default '0',
  title varchar(200) NOT NULL default '',
  comment varchar(250) NOT NULL default '',
  data text NOT NULL,
  PRIMARY KEY  (id),
  KEY gtid (gtid)
);

ALTER TABLE ipn_user_range_$mid ADD object_id INT NOT NULL;
ALTER TABLE ipn_user_range_$mid ADD KEY object_id(object_id);

CREATE TABLE ipn_iface_$mid (
  id int(11) NOT NULL auto_increment,
  source_id int(11) default NULL,
  number int(11) default NULL,
  title varchar(255) default NULL,
  zone_id int(11) default NULL,
  UNIQUE KEY id (id),
  UNIQUE KEY source_number (source_id,number)
);

CREATE TABLE ipn_zone_$mid (
  id int(11) NOT NULL auto_increment,
  title varchar(255) default NULL,
  PRIMARY KEY  (id)
);

ALTER TABLE ipn_user_source_$mid ADD `iface` INT NOT NULL default '-1' AFTER `source_id`;
ALTER TABLE ipn_service_$mid ADD `iface` INT NOT NULL default '-1' AFTER `source`;

-- #BLOCK#
DELETE FROM ipn_iface_$mid WHERE number=-1;
INSERT INTO ipn_iface_$mid (source_id, number, title, zone_id) SELECT id, -1, 'ANY', -3 FROM source WHERE mid=$mid; 
-- #ENDB#

ALTER TABLE ipn_gate_$mid ADD parent_id INT NOT NULL AFTER config;
ALTER TABLE ipn_service_$mid ADD plan_id INT NOT NULL;

CREATE TABLE ipn_service_link_plan_$mid (
  id int(11) NOT NULL auto_increment,
  title varchar(200) NOT NULL DEFAULT '' ,
  type tinyint(2) NOT NULL DEFAULT 0,
  PRIMARY KEY (id) );

ALTER TABLE ipn_user_range_$mid ADD plan_id INT NOT NULL;
ALTER TABLE ipn_user_range_$mid ADD pers_plan_id INT NOT NULL;

CREATE TABLE  detail_create_task_$mid (
  id int(11) NOT NULL auto_increment,
  source_id int(11) NOT NULL,
  data blob,
  PRIMARY KEY  (id) );
  
  
CREATE TABLE ip_resource_$mid (id int(11) NOT NULL auto_increment, date1 date default NULL, date2 date default NULL, category_id int(11) NOT NULL, ip bigint(20) NOT NULL, PRIMARY KEY  (id), KEY category_id (category_id), KEY ip (ip) );
CREATE TABLE ip_resource_category_$mid (id int(11) NOT NULL auto_increment, title varchar(200) NOT NULL, comment varchar(250) NOT NULL, parent_id int(11) NOT NULL, PRIMARY KEY  (id) );

ALTER TABLE ipn_gate_type_$mid ADD COLUMN rule TEXT NOT NULL AFTER config;
ALTER TABLE ipn_gate_type_$mid ADD COLUMN script text NOT NULL AFTER rule;

CREATE TABLE  ipn_gate_rule_$mid (
  id int(11) NOT NULL auto_increment,
  gtid int(11) NOT NULL,
  rtid int(11) NOT NULL,
  PRIMARY KEY  (id) );
  
	CREATE TABLE  ipn_gate_vlan_$mid (
	id int(11) NOT NULL auto_increment,
	vid int(11) NOT NULL,
	cid int(11) NOT NULL,
	gid int(11) NOT NULL,
	PRIMARY KEY  (id) );  

CREATE TABLE ip_resource_range_$mid (id int(11) NOT NULL auto_increment, category_id int(11) NOT NULL, date1 date default NULL, date2 date default NULL, ip1 bigint(20) NOT NULL, ip2 bigint(20) NOT NULL, PRIMARY KEY  (id), KEY idx (category_id, date1, date2, ip1, ip2) );
ALTER TABLE ipn_user_range_$mid ADD COLUMN `resource_id` INT  NOT NULL DEFAULT 0 AFTER `pers_plan_id`, DROP INDEX `cid`, DROP INDEX `date1`, DROP INDEX `date2`, ADD INDEX `index`(`cid`, `addr1`, `addr2`, `date1`, `date2`, `resource_id`);
ALTER TABLE ipn_user_range_$mid ADD COLUMN mask INTEGER  AFTER resource_id;

ALTER TABLE ipn_service_$mid ADD COLUMN `diff_serv` VARCHAR(50) DEFAULT '' NOT NULL  AFTER `addr2`;



CREATE TABLE  ipn_gate_address_$mid (
  id int(10) unsigned NOT NULL AUTO_INCREMENT,
  gid int(10) NOT NULL DEFAULT '0',
  hid int(10) unsigned DEFAULT NULL,
  pod int(10) DEFAULT '0',
  floor int(10) DEFAULT '0',
  address varchar(255) DEFAULT NULL,
  frac varchar(35) DEFAULT NULL,
  PRIMARY KEY (gid),
  KEY id (id)
);


CREATE TABLE  ipn_gate_contract_port_$mid (
  id int(11) NOT NULL AUTO_INCREMENT,
  gid int(11) NOT NULL,
  cid int(11) NOT NULL,
  port int(11) NOT NULL,
  PRIMARY KEY (id),
  KEY gid_index (gid),
  KEY cid_index (cid)
);


CREATE TABLE  ipn_user_gate_rule_log_$mid (
  id int(11) NOT NULL AUTO_INCREMENT,
  rtid int(11) NOT NULL,
  date datetime NOT NULL,
  user_id int(11) NOT NULL,
  cid int(11) NOT NULL,
  gid INTEGER  NOT NULL,
  PRIMARY KEY (`id`)
);


-- Статусы для лишних модулей удаляем , возникли в следствии ошибки , добавленной в этот же скрипт  и также в коде 
-- #BLOCK#
delete from  ipn_contract_status_$mid
where 
cid not in (select cid from contract_module where mid = $mid );

delete from  ipn_contract_status_log_$mid
where 
cid not in (select cid from contract_module where mid = $mid );
-- #ENDB#

-- Это большой кусок для исправления баги, когда может быть у одного договрора больше одного статуса
-- #BLOCK#
DROP TABLE max_dates;
DROP TABLE problem_cids;
CREATE TABLE max_dates (
  `dt` DATETIME  NOT NULL,
  `cid` INT  NOT NULL,
  PRIMARY KEY (`cid`),
  INDEX `dt_idx`(`dt`)
);

CREATE TABLE problem_cids (
  `cid` INT  NOT NULL,
  PRIMARY KEY (`cid`)
);

INSERT INTO problem_cids
SELECT cid FROM ipn_contract_status_$mid group by cid having count(*) > 1;

INSERT INTO max_dates(dt, cid )
SELECT max(dt), status.cid FROM  ipn_contract_status_$mid  as status
LEFT JOIN ipn_contract_status_log_$mid as log ON status.cid = log.cid
WHERE status.cid in ( SELECT cid FROM problem_cids ) and log.dt is not null

GROUP BY status.cid ;

DELETE FROM ipn_contract_status_$mid
WHERE
cid in
( SELECT problem_cids.cid FROM problem_cids );

INSERT INTO ipn_contract_status_$mid( cid, status )
SELECT log.cid, log.action FROM ipn_contract_status_log_$mid as log
LEFT JOIN max_dates ON max_dates.dt = log.dt and max_dates.cid=log.cid
WHERE
log.cid IN
( SELECT problem_cids.cid FROM problem_cids )
AND max_dates.dt is NOT NULL
-- обязательно надо так как на одну дату может быть несколь статусуов - с этим уже ничего не поделать 
GROUP BY log.cid
ORDER BY log.cid ;

DROP TABLE max_dates;
DROP TABLE problem_cids;
-- #ENDB#

-- а это добавляем индекс после предыдущего блока  
ALTER TABLE ipn_contract_status_$mid ADD PRIMARY KEY (`cid`), DROP INDEX `cid`;

UPDATE `ipn_gate_type_$mid` SET `config`=replace(`config`,'bitel.billing.module.services.ipn.editor.','ru.bitel.bgbilling.modules.ipn.client.editor.');
UPDATE `ipn_gate_type_$mid` SET `config`=replace(`config`,'bitel.billing.server.ipn.','ru.bitel.bgbilling.modules.ipn.server.');
UPDATE `ipn_gate_type_$mid` SET `config`=replace(`config`,'bitel.billing.server.processor.','ru.bitel.bgbilling.kernel.network.radius.inspectors.');

-- #BLOCK#
DELETE FROM script_event_type WHERE mid=$mid;
INSERT INTO script_event_type (mid, event_id, event_mode, title) VALUES ($mid, 'ru.bitel.bgbilling.kernel.event.events.CalculateEvent', 0, 'Начисление');
-- #ENDB#