private static Boolean AreContractsActive(DataConnector connector, MailingDTO mailing)
        {
            Boolean active;

            ContractDAO contractDAO = new ContractDAO(connector.MySqlConnection);
            ContractItemDAO contractItemDAO = new ContractItemDAO(connector.MySqlConnection);

            // Faturamento de um contrato apenas
            if (mailing.codigoContrato != 0)
            {
                ContractDTO contract = contractDAO.GetContract(mailing.codigoContrato);
                active = (contract.status != 3) && (contract.status != 4);
                return active;
            }

            // Caso contrário é o faturamento de todos os equipamentos do cliente (um ou mais contratos)
            active = false;
            List<ContractItemDTO> itemList = contractItemDAO.GetItems("businessPartnerCode = '" + mailing.businessPartnerCode + "'");
            foreach (ContractItemDTO item in itemList)
            {
                ContractDTO contract = contractDAO.GetContract(item.contrato_id);
                if ((contract.status != 3) && (contract.status != 4)) active = true;
            }
            return active;
        }
        private static MailMessage MountContractBilling(DataConnector connector, int contractId, int subContractId, Boolean enviarDemonstrativo)
        {
            ContractDAO contractDAO = new ContractDAO(connector.MySqlConnection);
            SubContractDAO subContractDAO = new SubContractDAO(connector.MySqlConnection);
            ContractItemDAO contractItemDAO = new ContractItemDAO(connector.MySqlConnection);
            EquipmentDAO equipmentDAO = new EquipmentDAO(connector.SqlServerConnection);

            ContractDTO contract = contractDAO.GetContract(contractId);
            String contractItems = "";
            List<SubContractDTO> subContractList = subContractDAO.GetSubContracts("contrato_id=" + contract.id);
            foreach (SubContractDTO subContract in subContractList)
            {
                List<ContractItemDTO> itemList = contractItemDAO.GetItems("subcontrato_id = " + subContract.id);
                String equipmentEnumeration = "";
                foreach (ContractItemDTO contractItem in itemList)
                {
                    if (!String.IsNullOrEmpty(equipmentEnumeration)) equipmentEnumeration += ", ";
                    equipmentEnumeration += contractItem.codigoCartaoEquipamento;
                }
                List<EquipmentDTO> equipamentList = equipmentDAO.GetEquipments(equipmentEnumeration);
                String serialNumbers = "";
                foreach (EquipmentDTO equipment in equipamentList)
                {
                    if (!String.IsNullOrEmpty(serialNumbers)) serialNumbers += ", ";
                    serialNumbers += equipment.ManufSN;
                }
                if (String.IsNullOrEmpty(serialNumbers)) serialNumbers = "Nenhum item encontrado";
                contractItems += subContract.siglaTipo + " - " + serialNumbers + "<br/>";
            }

            String cliente = ObterNomeCliente(connector, contract.pn);
            String parcela = ObterParcelaContrato(connector, contract);
            String vendedor = ObterNomeVendedor(connector, contract);
            DateTime dataVencimento = MountDate(contract.diaVencimento, contract.referencialVencimento);
            String billingInfo = "Contrato: " + contract.numero + "<br/>" + "Itens: " + contractItems + "<br/>" + "Cliente: " + cliente + "<br/>" + "Parcela: " + parcela + "<br/>" + "Vendedor: " + vendedor + "<br/>" + "Data Vencimento: " + dataVencimento.ToString("dd/MM/yyyy") + "<br/>";

            List<String> reportFiles = new List<String>();
            if (enviarDemonstrativo) reportFiles = BuildReportFiles("faturamentoContrato.php", "contractId=" + contractId + "&subContractId=" + subContractId);

            MailMessage mailMessage = new MailMessage();
            mailMessage.Subject = "Faturamento de contrato";
            mailMessage.Body = "Email gerado automaticamente, não responder." + "<br/><br/>" + billingInfo;
            foreach (String filename in reportFiles)
                mailMessage.Attachments.Add(new Attachment(filename));

            return mailMessage;
        }
        private static String ObterParcelaContrato(DataConnector connector, ContractDTO contract)
        {
            // Grava a parcela atual, adiciona uma parcela pois está iniciando um novo faturamento
            ContractDAO contractDAO = new ContractDAO(connector.MySqlConnection);
            int increase = 0;
            if ((contract.mesReferencia != DateTime.Now.Month)) {
                increase = 1;
                contractDAO.SetContractParcell(contract.id, contract.parcelaAtual + increase);
                contractDAO.SetContractMonthYear(contract.id, DateTime.Now.Month, DateTime.Now.Year);
            }

            return (contract.parcelaAtual + increase) + "/" + contract.quantidadeParcelas;
        }
        private static MailMessage MountBusinessPartnerBilling(DataConnector connector, String businessPartnerCode, Boolean enviarDemonstrativo)
        {
            ContractDAO contractDAO = new ContractDAO(connector.MySqlConnection);
            SubContractDAO subContractDAO = new SubContractDAO(connector.MySqlConnection);
            ContractItemDAO contractItemDAO = new ContractItemDAO(connector.MySqlConnection);
            EquipmentDAO equipmentDAO = new EquipmentDAO(connector.SqlServerConnection);

            List<ContractItemDTO> itemList = contractItemDAO.GetItems("businessPartnerCode = '" + businessPartnerCode + "'");
            Dictionary<int, List<ContractItemDTO>> itemGroups = new Dictionary<int, List<ContractItemDTO>>();
            foreach (ContractItemDTO item in itemList)
            {
                // Cria um novo grupo caso não encontre um grupo para este subcontrato
                if (!itemGroups.ContainsKey(item.subContrato_id))
                    itemGroups.Add(item.subContrato_id, new List<ContractItemDTO>());

                // Adiciona o item ao grupo do subcontrato
                List<ContractItemDTO> group = itemGroups[item.subContrato_id];
                group.Add(item);
            }

            String billingInfo = "Cliente: " + ObterNomeCliente(connector, businessPartnerCode) + "<br/><br/>";
            foreach (int subContractId in itemGroups.Keys)
            {
                List<ContractItemDTO> group = itemGroups[subContractId];
                String itemEnumeration = "";
                foreach (ContractItemDTO contractItem in group)
                {
                    if (!String.IsNullOrEmpty(itemEnumeration)) itemEnumeration += ", ";
                    itemEnumeration += contractItem.codigoCartaoEquipamento;
                }
                List<EquipmentDTO> equipamentList = equipmentDAO.GetEquipments(itemEnumeration);
                String equipmentEnumeration = "";
                foreach (EquipmentDTO equipment in equipamentList)
                {
                    if (!String.IsNullOrEmpty(equipmentEnumeration)) equipmentEnumeration += ", ";
                    equipmentEnumeration += equipment.ManufSN;
                }
                SubContractDTO subContract = subContractDAO.GetSubContract(subContractId);
                ContractDTO contract = contractDAO.GetContract(subContract.contrato_id);
                Boolean activeContract = true;
                if ((contract.status == 3) || (contract.status == 4)) activeContract = false;
                if (activeContract) // Não fatura caso o status do contrato seja finalizado ou cancelado
                {
                    String parcela = ObterParcelaContrato(connector, contract);
                    String vendedor = ObterNomeVendedor(connector, contract);
                    DateTime dataVencimento = MountDate(contract.diaVencimento, contract.referencialVencimento);
                    String contractInfo = "Contrato: " + contract.numero + "<br/>" + "Parcela: " + parcela + "<br/>" + "Vendedor: " + vendedor + "<br/>" + "Data Vencimento: " + dataVencimento.ToString("dd/MM/yyyy") + "<br/>";
                    String subContractInfo = subContract.siglaTipo + " - " + equipmentEnumeration + "<br/>";
                    billingInfo += contractInfo + subContractInfo + "<br/>";
                }
            }

            List<String> reportFiles = new List<String>();
            if (enviarDemonstrativo) reportFiles = BuildReportFiles("faturamentoCliente.php", "businessPartnerCode=" + businessPartnerCode);

            MailMessage mailMessage = new MailMessage();
            mailMessage.Subject = "Faturamento de contrato";
            mailMessage.Body = "Email gerado automaticamente, não responder." + "<br/><br/>" + billingInfo;
            foreach(String filename in reportFiles)
                mailMessage.Attachments.Add(new Attachment(filename));

            return mailMessage;
        }